leetcode-35-search insert position

33 篇文章 0 订阅
17 篇文章 0 订阅

Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.

You may assume no duplicates in the array.

Here are few examples.
[1,3,5,6], 5 → 2
[1,3,5,6], 2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6], 0 → 0

大意:在有序数组中插入元素。

思路:二分查找,找到target就返回此刻索引。否则维护和target距离最小的那个索引。最后判断该位置元素和target大小比较。

python一遍AC。

class Solution(object):
    def searchInsert(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        l,r=0,len(nums)-1
        ans=0
        dismin=9999
        if r==-1:return 0
        while(l<=r):
            m=(l+r)/2
            if nums[m]==target:
                return m
            if nums[m]<target:
                dis=abs(nums[m]-target)
                if dis<dismin:
                    dismin=dis
                    a=m
                l=m+1
            else:
                dis=abs(nums[m]-target)
                if dis<dismin:
                    dismin=dis
                    a=m
                r=m-1
        if nums[a]<target:
            return a+1
        else:
            return a

再一考虑,发现不需要维护dismin。直接二分查找。最后返回l and r。
找到了返回m,找不到返回left即可。

class Solution(object):
    def searchInsert(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        l,r=0,len(nums)-1
        ans=0
        dismin=9999
        if r==-1:return 0
        while(l<=r):
            m=(l+r)/2
            if nums[m]==target:
                return m
            if nums[m]<target:
                l=m+1
            else:
                r=m-1
        return l

c++:

class Solution {
public:
    int searchInsert(vector<int>& nums, int target)  
    {  
        int n = nums.size();  

        int low = 0;  
        int high = n -1;  
        int mid;  
        while(low <= high)  
        {   
            mid = low + (high - low)/2;  
            if(target == nums[mid])  
                return mid;  
            else if(target < nums[mid])  
            high = mid - 1;  
            else   
                low = mid + 1;  
        }  
        return low;  
    } 
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值