赞
踩
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)
思路:当查找该元素的最左侧位置时,如下图:
我们首先需要判断情况:
- 当mid < target 的时候:mid在左边这个区间里面,无法求出结果,所以让left右移, left = mid+1;
- 当mid >= target 的时候:mid在右边这个区间里面,mid也有可能刚好等于target,我们得缩小范围,所以 right = mid(不能等于mid-1,否则如果mid刚好等于target的时候,right = mid-1 之后,就无解了);
细节处理:
- 循环条件选择:
left < right
left <= right
在求最左侧端点的时候,我们采用第一种循环条件,如果使用第二种循环条件,会导致死循环- mid有两种求法:
mid = left +(right - left)/ 2 — 求出的值会偏左
mid = left +(right - left + 1)/ 2 —求出的值会偏右
在求最左侧位置的时候,只能使用第一种方法,因为使用第二种方法会导致死循环
当只剩下两个数判断且 mid = target 的时候,此时如果right = mid,这个两个数的的mid一直等于right,而right又等于 mid,陷入死循环
同理当查找该元素的最右侧位置时,如下图:我们首先需要判断情况:
- 当mid <= target 的时候:mid在左边这个区间里面,mid可能刚好等于target,所以让left右移的时候需要注意不能加一,否则会导致无解,left = mid;
- 当mid > target 的时候:mid在右边这个区间里面,无法求出结果,我们得缩小范围,所以 right = mid-1;
细节处理:
循环条件选择:
left < right
left <= right
在求最左侧端点的时候,我们采用第一种循环条件,如果使用第二种循环条件,会导致死循环- mid有两种求法:
mid = left +(right - left)/ 2 — 求出的值会偏左
mid = left +(right - left + 1)/ 2 —求出的值会偏右
在求最左侧位置的时候,只能使用第二种方法,因为使用第一种方法会导致死循环
当只剩下两个数判断且 mid = target 的时候,此时如果left = mid,这个两个数的的mid一直等于left,而left又等于 mid,陷入死循环
代码:
- class Solution {
- public int[] searchRange(int[] nums, int target) {
- int[] ret = new int[2];
- ret[0] = -1;
- ret[1] = -1;
- if(nums.length == 0){
- return ret;
- }
- int left = 0;
- int right = nums.length - 1;
- //判断左端点
- while(left < right){
- int mid = left + (right - left) / 2;
- if(nums[mid] < target){
- left = mid+1;
- }else{
- right = mid;
- }
- }
- //判断是否等于目标值
- if(nums[left] != target){
- return ret;
- }else{
- ret[0] = left;
- }
- left = 0;
- right = nums.length - 1;
- //判断右端点
- while(left < right){
- int mid = left + (right - left + 1) / 2;
- if(nums[mid] <= target){
- left = mid;
- }else{
- right = mid-1;
- }
- }
- //判断是否等于目标值
- if(nums[left] != target){
- return ret;
- }else{
- ret[1] = left;
- }
- return ret;
- }
- }
总结模板:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。