首页 > 其他 > 详细

LeetCode刷题记录-34

时间:2020-07-19 18:44:56      阅读:63      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

 这题一看:升序、时间复杂度的要求: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     }

 

LeetCode刷题记录-34

原文:https://www.cnblogs.com/gilgamesh-hjb/p/13340614.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!