C/C++---------------LeetCode第35. 搜索插入位置
插入的位置
- 题目及要求
- 二分查找
- 在main内使用
题目及要求
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 为 无重复元素 的 升序 排列数组
-104 <= target <= 104
二分查找
思路:使用二分查找,首先初始化左右指针,然后在每一次循环中,计算中间位置 mid,并与目标值进行比较。如果中间位置的元素等于目标值,则返回该位置,如果中间位置的元素大于目标值,则将右指针移动到 mid - 1 的位置,如果中间位置的元素小于目标值,则将左指针移动到 mid + 1 的位置。通过不断变化搜索范围,最终找到目标值的索引位置或应该插入的位置
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left=0,right=nums.size()-1;
while(left<=right){
int mid=(left+right)/2;
if(nums[mid]==target){
return mid; //返回目标值的索引
}else if(nums[mid]>target){
right=mid-1;
}else{
left=mid+1;
}
}
return left; //返回插入的位置
}
};
在main内使用
int main() {
vector<int> nums = {1, 3, 5, 6};
int target = 4;
Solution solution;
int index = solution.searchInsert(nums, target);
if (nums[index] == target) {
cout << "目标值 " << target << " 的索引为 " << index << endl;
} else {
cout << "目标值 " << target << " 应该插入到索引为 " << index << " 的位置上" << endl;
}
return 0;
}