概述
分析
- 题目说明数组是有序的,然后又是一个查找问题,很容易想到二分法
思路
如何实现二分法?
这里不详述,基本上有模版
代码实现
class Solution {
public:
int search(vector<int>& nums, int target) {
int L = 0 , R = nums.size() - 1;
while (L <= R) {
int mid = (R - L) / 2 + L;
if (target == nums[mid]) return mid;
else if (target > nums[mid]) L = mid + 1; // 这里个人比较建议先写target,不容易出错
else R = mid - 1;
}
return -1;
}
};
考虑
为什么R = nums.size() - 1, 而不是R = num.size()?
-
首先第二种写法是可以的,但是要修改下面的循环判断条件;
class Solution { public: int search(vector<int>& nums, int target) { int L = 0 , R = nums.size(); while (L < R) { // 修改1:因为L==R是无意义的,说明该区间为空 int mid = (R - L) / 2 + L; if (target == nums[mid]) return mid; else if (target > nums[mid]) L = mid + 1; else R = mid; // 修改2:因为右区间是开的,所以有效区间是[L,mid - 1],那索引就应该为mid } return -1; } };
-
但是,我们可以看到,这样写需要修改两处地方,而且需要多考虑一些问题**,所以建议按第一种写法**
二分法相关题目
35. 搜索插入位置
34. 在排序数组中查找元素的第一个和最后一个位置
69. x 的平方根
367. 有效的完全平方数
版权声明:本文为qq_40725780原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。