35. 搜索插入位置
- target在数组中,就返回下标;不在数组中,就返回插入的位置。
- 我查找采用二分查找,如果不在数组中,插入的位置也需要跟最后
high/low所指的数字进行比较,如果相比小或等于则插入位置为low/high,否则插入位置为low+1。
代码
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
low,high = 0,len(nums)-1
while low < high:
mid = low + (high-low)//2
num = nums[mid]
if target == num:
return mid
elif target < num:
high = mid - 1
else:
low = mid + 1
if target <= nums[low] :
return low
else:
return low + 1
cheat sheet
- List 是数据结构,nums才是数组名;
- low/high是下标,nums[low]/nums[high]才是数组元素。
ASK SOON with more thinking
- while循环体内为什么不是
low<=high
,而是low<high
? - 为什么看了许多教程,别人都在讨论返回low的普适性,而我的代码并未讨论?
Try to answer
- 【二分问题的思考方式】因为二分是一个不断缩小目标值所在的有序区间的过程,因此while循环执行到最后处理的情况都如出一辙,因此可以采用假设法。具体可以采用三种假设情况。
-
有序区间,两个数字足矣
-
左端点
-
右端点
- 实操一下思考过程。(假设有序区间为[7,10],左端点7,右端点10,计算出m = 0)
-
有序区间 :target=8,,更新low = 1,此时low==high,结束
-
左端点 :target = 0,更新high = -1,此时low==0,结束
-
右端点:target = 100,更新low = 1,此时low==high,结束
可见,当while(low<high)
时,退出循环的条件不一定是low==high
,也有可能high<low
,但是所有的情况却都满足:
if target <= nums[low] :
return low
else:
return low + 1
- 假如
while(low<=high)
,同样重复上述思考过程,可以得到结论———所有的情况都满足return low
可以得到正确结果。