leetcode34. Find First and Last Position of Element in Sorted Array

Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.

Your algorithm’s runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

Example 1:

Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
Example 2:

Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]

思路
二分搜索
本来以为二分搜索是很简单得但是这道题彻底把我搞晕了
本题思路为用两个二分查找分别找出第一个值和最后一个值
在判断第一个值时
如果mid》=target,因为要判断他最左边得第一个值所以end -mid
判断最后一个值时则相反nums[mid] <=target start = end;

让我头晕的是
在二分搜索完成后对res进行赋值
第一个数为
if(nums[end] ==target){
res[0] = end;
}

        if(nums[start] ==target){
            res[0] = start;
        }

为什么先判断end?在我想法中start比end更考前为什么不判断start先?
判断最后一个数时为什么不先判断end而先判断first?

如果按我所想的得修改在submit后会卡在例子【2,2】

经过修改我把顺序调整后加了else也可以ac所以问题在哪呢?
if(nums[end] ==target){
res[0] = end;
}

        if(nums[start] ==target){
            res[0] = start;
        }

仔细想了想发现时if 和 else if 得问题
如果没有else 则 第一二个if互不影响则判断完第一个if 第二个接着判断导致值为后一个的值
而加上else之后便判断成功后不再继续判断

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int [] res =new int[]{-1,-1};
        
        if(nums ==null|| nums.length ==0){
            return new int[]{-1,-1};
        }
        
        int start =0,end=nums.length-1;
       
        while(start+1<end){//判断第一个位置
           int mid = (end - start)/2+start;
           if(nums[mid]>=target) {
               end = mid;
           }
           
            else{
                start =mid;
            }
          
        }
        
        if(nums[end] ==target){
                res[0] = end;
            }
        
            if(nums[start] ==target){
                res[0] = start;
            }
            
        
        
        start =0;
        end=nums.length-1;
        while(start+1<end){//盘断最后一个的位置
           int mid = (end-start)/2 + start;
          if(nums[mid] <=target){
                start =mid;
            }
           
            else{
                end =mid;
            }
          }
        
        
        if(nums[start] ==target){
                res[1] = start;
            }
         if(nums[end] ==target){
                res[1] = end;
            }
            
        
        
                    return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值