LeetCode | 35. 搜索插入位置
题:
我的原始思路:
由于数组大小排列好了,因此小于数组0位置的数,直接插入,位置0;
大于数组最后一个数的,直接插入,插入位置nums.size();
大小在数组中间,进行二分查找,找到的话输出位置;
没有找到,比大小,夹在中间的输出i+1,即插入的位置。
答案:
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
解析:
(1)目标值在数组所有元素之前,二分法会使得区间的right一直左移,直到越过了left才停止,最终变为 [0, -1],right=-1跳出循环。返回值0,可用left或者right+1代替。 (我是直接返回了0,后来发现一个巧妙的共同输出。)且left>right,left-right=1。
(2)目标值等于数组中某一个元素,在二分法中返回 middle,与外围的right+1无关。
(3)目标值插入数组中的位置,target不是数组中的一个,二分法最后是[left, right],且left>right,left-right=1。返回left或者right + 1。
left等于比target大的第一个数的位置,这个位置就是要插入的位置,right等于比target小的第一个数的位置。
因为总是会归于这么一个情况,即比这个target小,再循环一次,跳到比这个target大的数。
或者比这个target大,再循环一次,跳到比这个target小的数。不管哪种情况,left=x>right=x-1。
(更本质的是因为在倒数第二次的循环中,不是在左边就是在右边,且middle不是等于left就是等于right,然后继续循环一次,导致left+1或者right-1,由于target是两个数之间的一个数,因此跳过了也还没找到target,然后就跳出了循环,得出没找到的结论。)
(4)目标值在数组所有元素之后的情况,[left=right+1,right]。left一直右移,直到left+1越过right,跳出循环,即left=right+1,right=numas.size()-1。插入的位置就是left或者说right+1。
总结:
四种情况,除了数组内有和target一样的值的情况返回middle,其他三种情况均可用一个left或者right+1表示。
其他解法:
非二分法,暴力解法。
时间复杂度为O(n),时间复杂度不符合题目要求。
空间复杂度:O(1)
python: