Skip to main content

搜索插入位置35

地址:https://leetcode.cn/problems/search-insert-position/description/?envType=problem-list-v2&envId=binary-search

题干:

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 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

思路

首先这是已经排好序的数组。

要求Logn时间复杂度,选择二分查找。我们用双指针,定一个中间值,这个中间值应该是lptr+(rptr-lptr)/2,然后我们利用二分思想,找目标值。目标值小于这个Mid值则说明在mid的左边,否则在右边。这样我们下次找的时候,更新左或者右指针的位置,应该在Mid的隔壁,也就是更新到新的边界。循环条件应当是lptr<=rptr,说明一直在缩小范围,我们每次都更新mid值,最后剩下的地方就一定是lptr所在的位置。

要理解这个,可以类比猜大小游戏。

题解

class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int lptr = 0;
int rptr = nums.size() - 1;
while (lptr <= rptr) {
int mid = lptr + (rptr - lptr) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
lptr = mid + 1;
} else {
rptr = mid - 1;
}
}
return lptr;
}
};

本文字数:0

预计阅读时间:0 分钟


统计信息加载中...

有问题?请向我提出issue