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