35搜索插入位置

题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。

链接:https://leetcode-cn.com/problems/search-insert-position/

法一:

思路:两种方法,一种是左闭右闭,另一种是左闭右开,由于区间的不同导致了最后用mid划分区间的不同,

from typing import List
class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        size = len(nums)
        if size == 0:
            return 0
        left = 0
        # 因为有可能数组的最后一个元素所在位置的下一个是我们要找的,故右边界是 len
        right = size
        # 注意这里是左闭右开
        while left < right:
            mid = (left + right) >> 1
            # 严格小于 target 的元素一定不是解
            if nums[mid] < target:
                # 下一轮搜索区间是 [mid + 1, right]
                left = mid + 1
            # 如果等于目标值,直接返回索引
            elif nums[mid] == target:
                return mid
            # 由于是左闭右开,所以mid虽然已经判断过了,但右边取mid,因为右边是开区间
            elif nums[mid] > target:
                right = mid
            # # 或者直接
            # else:
            #     right = mid
        # 如果left等于right了,一定是target不在nums中,且nums[left-1] < target,所以应该返回left
        return left

from typing import List
class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        left = 0
        right = len(nums) - 1
        while left <= right:
            mid = (left + right) >> 1
            if nums[mid] == target:
                return mid
            elif nums[mid] > target:
                right = mid - 1
            elif nums[mid] < target:
                left = mid + 1
        print(left, right)
        # 结束while循环时的上一步是left等于right
        # 如果最后一步执行的是right = mid - 1,则说明nums[left-1]<target,而nums[left]>target,所以应该返回left
        # 如果最后一步执行的是left = mid + 1,则说明nums[right]<target,而nums[right+1]>target,并且循环结束时,left=right+1,所以返回left,
        return left
if __name__ == '__main__':
    solution = Solution()
    # result = solution.searchInsert([1,3,5,6], 6)
    result = solution.searchInsert([1,3,5,6], -1)
    # result = solution.searchInsert([1], 0)
    print(result)
View Code

ttt

posted on 2020-02-22 12:11  吃我一枪  阅读(240)  评论(0编辑  收藏  举报

导航