1.题目
2.算法思路
暴力解法:可以将数组遍历一遍,就可以找到。时间复杂度为O(n)。不算太差,可以接受。
但是有更优秀的解法:
就是二分查找算法。
算法的特点:我们所查找的“数组”具有二段性。这里的二段性不一定有序。而是我们可以找到某种规律,可以让我们把数组分为两部分,然后舍掉一部分,对另一部分进行求解。
本题中数组的有序就是二段性的一种体现。
在后面的题目中,我会举一个无序的但是可以用二分查找算法解决的题目。
3.代码
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-1;
else if(nums[mid]<target) left=mid+1;
else return mid;
}
return -1;
}
};
时间复杂度:O(longn)。