记录LeetCode第八天(35. Search Insert Position)
1.题目
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.
2.例子
Example 1:
Input: [1,3,5,6], 5
Output: 2
Example 2:
Input: [1,3,5,6], 2
Output: 1
Example 3:
Input: [1,3,5,6], 7
Output: 4
Example 4:
Input: [1,3,5,6], 0
Output: 0
3.代码
先是暴力的一个一个按顺序比大小:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int n=0;
for(; n<nums.size() && nums[n]<target ; n++);
return n;
}
};
后来再是一半一半比较
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int Lo=0, mid=0;//最低位和中间位初始化0
int hi=nums.size();//最高位初始化
while( Lo < hi )
{
mid = Lo + ((hi - Lo)/2); //中间位就是低位和高位一半的位置
if(target == nums[mid]) return mid;//中间正好是目标就直接返回
if(target<nums[mid]) hi = mid;//如果目标值小于中间位的值,让最大为等于中间位
else Lo = mid +1;//如果目标值大于中间位值,就让最小值等于中间位后一个值
}
return Lo;
}
};
可能大晚上的脑子不清楚了,但是还是记录一下为什么返回Lo
并且每次让Lo = mid +1;
不是返回hi
让hi = mid -1;
- 如果有一个target比最大数还大,
mid
的指就会一直增加,直到Lo = nums.size() -1
,mid = nums.size();
这样就会超界。如果有一个target比最小数还小,就返回-1
。 - 但是如果返回
Lo
并且每次让Lo = mid -1;
如果有一个target比最大数还大,最后就会出现mid = nums.size() -1
,Lo = mid +1;
然后出循环,返回Lo = nums.size()
,如果有一个target比最小数还小,就一直不进入else Lo = mid +1;
直到hi
减到最小出循环输出从初始化以后就没变过的Lo = 0
。