从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
提示:
- 你可以假设
nums中的所有元素是不重复的。 n将在[1, 10000]之间。nums的每个元素都将在[-9999, 9999]之间。
二、思路分析
二分法的难点主要体现在以下几个方面:
- 实现细节:二分法的实现需要考虑很多细节问题,如左右边界的确定、循环终止条件的设置、中间值的计算等等。这些细节问题如果处理不好,容易导致算法出现边界问题、死循环等错误。
- 边界问题:二分法需要通过不断缩小区间范围来逼近目标值,但如果边界条件设置不合理,就可能会导致算法失效。例如,如果左右边界的初始值不合理,可能会导致算法无法找到目标值,或者出现数组下标越界等问题。
- 复杂度分析:虽然二分法的时间复杂度很低,但是对于一些复杂的问题,例如带有多个变量的函数,二分法的复杂度分析可能会比较困难。这时候需要对问题进行抽象,找到问题的瓶颈所在,再结合二分法的特点进行分析。
- 应用场景:二分法并不是所有问题都适用的算法,有些问题可能需要其他算法来解决。因此,在应用二分法时,需要根据问题的特点和算法的优势进行合理的选择。
三、AC代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0,right=nums.size()-1;
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]>target){
right=--mid;
}
else if(nums[mid]<target){
left=++mid;
}
else{
return mid;
}
}
return -1;
}
};
四、总结
二分法虽然看起来简单,但是在实际应用中还是有很多需要注意的地方。需要仔细分析问题、合理设计算法,才能得到正确的结果。