public int[] searchRange(int[] nums, int target) {//先决条件排除一部分if(target < nums[0] || target > nums[nums.length - 1]){return new int[]{-1,-1};}//初始化左右边界int l = 0;int r = nums.length - 1;//初始化数组int[] arr = {-1,-1};int mid = 0;//代表左边界是否有被找到boolean canBeFound = false;//找arr[0] 也就是左边界while(l <= r){//二分法求左边界mid = l + (r - l) / 2;if(target == nums[mid]){//告诉下面我找到了左边界canBeFound = true;r = mid - 1;//赋值arr[0] = mid;//如果r经过减一之后小于0,说明到达原数组边界if(r < 0){break;}//如果这个数的左边那个数比自己小,说明找到了边界if(nums[r] < nums[mid]){break;}}//正常操作if(target < nums[mid]){r = mid - 1;}if(target > nums[mid]){l = mid + 1;}}if(!canBeFound){//找不到左边界return arr;}//reset l and rl = mid;r = nums.length - 1;//找右边界,和上面对称即可while(l <= r){mid = l + (r - l) / 2;if(target == nums[mid]){l = mid + 1;arr[1] = mid;if(l >= nums.length){break;}if(nums[l] > nums[mid]){break;}}if(target < nums[mid]){r = mid - 1;}if(target > nums[mid]){l = mid + 1;}}return arr;}
其实还有一种方法是一个while里把左右边界都找出来,这个初次写可能会比较乱,我也还没搞懂,就这样先了,好歹也是手撸出来的,上面的算法。。