leetcode.35 搜索查找位置

这是一个方法:但总觉得不容易表达,写起来和二分非常相似

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left=0;
        int right=nums.length-1;
        int mid=0;
        while(left<=right)
        {
            mid=left+(right-left)/2;
            if(nums[mid]==target)
            return mid;
            else if(nums[mid]>target)
            right = mid-1;
            else if(nums[mid]<target)
            left = mid+1;
        }
        return left;
    }
}

方法二

根据热门题解和b站up主的技巧

这道题我们看作,找到>=target的位置

1、每次缩小一半的范围

2、每次缩小的范围要把答案包含在内

那么思路是这样的

if(nums[mid]>target)//当前的mid有可能是我们要找的位置,范围应该被包含,比如

【1 3 5 6 mid在3这个位置,插入的是2,它可能就放在mid(3)的位置】

所以  right=mid;

if(nums[mid]<target)//要找的位置一定是在>=mid+1之后的位置,而不是>=mid之后的位置,因为当前的mid比target小

【1 3 5 6 mid在3这个位置,插入的是4,它可能就放在mid+1(5)的位置】

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left=0;
        int right=nums.length-1;
        int mid=0;
        while(left<=right)
        {
            mid=left+(right-left)/2;
            if(nums[mid]==target)
            return mid;
            else if(nums[mid]>target)
            right = mid-1;
            else if(nums[mid]<target)
            left = mid+1;
        }
        return left;
    }
}

方式二更合乎逻辑,而且终止条件是left=right   返回left或right都可以

方式一更像是找规律出来的,找头尾中target的位置推导一下,很容易写,但是不好表达出来,终止条件是left<=right    返回left

昨天写只能写出方式一,今天方式二也能想出来了,证明想不出来先放一放,改天再回来看,可能就能想出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_40396568

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值