有序数组中查找数字的开始和结束下标

有序数组中查找数字的开始和结束下标

问题

这个题目说的是,给你一个递增排序的数组和一个目标值,你要找到目标值在这个数组中的开始下标和结束下标。如果找不到目标值,就返回 [-1, -1]。

比如说,给你的递增数组是:

1, 2, 2, 4, 4, 8, 8

给你的目标值是 2。2 在这个数组中的开始下标是 1,结束下标是 2,于是你要返回:

[1, 2]

如果给你的目标值是 0,0 不在这个数组中,因此你要返回:

[-1, -1]

代码

public class AlgoCasts {

  // Time: O(n), Space: O(1)
  public int[] findFirstAndLastPosition(int[] nums, int target) {
    if (nums == null || nums.length == 0) return new int[]{-1, -1};
    int n = nums.length, start = -1, end = -1;
    for (int i = 0; i < n; ++i) {
      if (nums[i] == target) {
        start = i;
        break;
      }
    }
    for (int j = n-1; j >= 0; --j) {
      if (nums[j] == target) {
        end = j;
        break;
      }
    }
    return new int[]{start, end};
  }

  private int binarySearchLastOne(int[] nums, int target) {
    int low = 0, high = nums.length - 1;
    while (low <= high) {
      int mid = low + (high - low) / 2;
      if (target < nums[mid]) high = mid - 1;
      else low = mid + 1;
    }
    return high;
  }

  // Time: O(log(n)), Space: O(1)
  public int[] binarySearchFirstAndLastPosition(int[] nums, int target) {
    if (nums == null || nums.length == 0) return new int[]{-1, -1};
    int end = binarySearchLastOne(nums, target);
    int start = binarySearchLastOne(nums, target-1) + 1;
    if (start >= 0 && start <= end && end < nums.length)
      return new int[]{start, end};
    else return new int[]{-1, -1};
  }

}

 上一篇
链表的相交节点 链表的相交节点
链表的相交节点问题 这个题目说的是,给你两个单链表,你要找到它们相交的第一个节点。如果两个链表没有相交,则返回空指针。假设链表无环,并且你不能改变它的原始结构。另外要求算法是线性时间复杂度,空间复杂度要求是 O(1)。 比如说,两条链表分别
2018-12-26
下一篇 
判断单链表是否有环 判断单链表是否有环
判断单链表是否有环问题 这个题目说的是,给你一个单链表,你要判断它是否会形成环,也就是链表的最后一个节点指向了前面一个已经存在的节点。 代码 public class AlgoCasts { public class ListNode
2018-12-26
  目录