35. 搜索插入位置
题目要求
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-insert-position
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
仿34题二分法
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int lo=0,hi=nums.size();
if(target<nums[lo]) return 0;
while(lo<hi){
int mid=(lo+hi)/2;
if(nums[mid]>target) hi=mid;
else lo=mid+1;
}
//此时lo指向的是target的下一个位置(如果原数组有的话)
if(nums[lo-1]==target) return (lo-1);
else return lo;
}
};
执行用时 | 内存消耗 |
---|---|
8 ms | 8.9 MB |
较标准流程(同二分法)
https://leetcode-cn.com/problems/search-insert-position/solution/te-bie-hao-yong-de-er-fen-cha-fa-fa-mo-ban-python-/
注意先特判,养成习惯。
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int searchInsert(vector<int> &nums, int target) {
int size = nums.size();
if (size == 0) {
return 0;
}
// 特判
if (nums[size - 1] < target) {
return size;
}
int left = 0;
int right = size - 1;
while (left < right) {
int mid = left + (right - left) / 2;
// 严格小于 target 的元素一定不是解
if (nums[mid] < target) {
// 下一轮搜索区间是 [mid + 1, right]
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
};
执行用时 | 内存消耗 |
---|---|
8 ms | 8.9 MB |