LeetCode刷题记录-34

 

 

 这题一看:升序、时间复杂度的要求:O(log n),就有思路了:典型的二分查找嘛!

先用二分查找找到target所在下标,考虑到target重复的情况,定义左右两个指针,他们同时从找到的下标位置出发,一个向左,一个向右,直到找到不等于target的下标位置即可

 1 public static int[] searchRange(int[] nums, int target) {
 2         //排除特殊数据:数组为空,长度为0、1
 3         if (nums == null || nums.length == 0) {
 4             return new int[]{-1, -1};
 5         }
 6         if (nums.length == 1) {
 7             if (nums[0] == target) {
 8                 return new int[]{0, 0};
 9             } else {
10                 return new int[]{-1, -1};
11             }
12         }
13         //排除完毕,开始二分查找,index是查找结果,flag标记是否查找成功,默认false
14         int low = 0, high = nums.length - 1;
15         int index = 0;
16         boolean flag = false;
17         while (low <= high) {
18             int mid = (low + high) / 2;
19             if (target == nums[mid]) {
20                 index = mid;
21                 flag = true;
22                 break;
23             } else if (target > nums[mid]) {
24                 low = mid + 1;
25             } else {
26                 high = mid - 1;
27             }
28         }
29         //没有找到target
30         if (flag == false) {
31             return new int[]{-1, -1};
32         }
33         //以target的下标index为中心,向左,向右分别遍历,找到边界
34         int left = index - 1, right = index + 1;
35         while (left >= 0 && nums[left] == target) {
36             left--;
37         }
38         while (right < nums.length && nums[right] == target) {
39             right++;
40         }
41         return new int[]{left + 1, right - 1};
42     }

 运行结果:

 

posted @ 2020-07-19 17:52  细雨轻风  阅读(178)  评论(0编辑  收藏  举报