704题目
第一种做法当然是暴力!
但是从现在开始,在做题的时候,要摒弃一上来就暴力的思路
(所以在此就不列出暴力解法了)
二分查找
降低时间和空间复杂度
时间复杂度:O(logn)
原因:每次查找的量都是n/2、n/4……
空间复杂度:O(1)
原因:只使用i、j
第一版:
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
int flag = -1;
//for(int i=0;i<n;i++){
// if(nums[i]==target)
// flag = i;
//}
//二分查找
int i = 0,j=n-1;
while(i<=j){
int mid = (i+j)/2;
if(nums[mid]<target)
i = mid+1;//要找的下标值一定在mid的右边
else if(nums[mid]>target)
j = mid-1;//要找的下标值一定在mid的左边
else{
flag = mid;
break;
}
}
return flag;
}
};
使用flag
反思:没有考虑循环结束条件,在else使得flag = mid 之后,需要break;
道理很简单,因为已经找到了flag,需要立即跳出whille循环
这个 小bug没有及时发现,反思!
也可以直接使用return mid;
在最外层return -1;
第二版:
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
//int flag = -1;
//for(int i=0;i<n;i++){
// if(nums[i]==target)
// flag = i;
//}
//二分查找
int i = 0,j=n-1;
while(i<=j){
int mid = (i+j)/2;
if(nums[mid]<target)
i = mid+1;//要找的下标值一定在mid的右边
else if(nums[mid]>target)
j = mid-1;//要找的下标值一定在mid的左边
else
return mid;
}
return -1;
}
};
对比下来,发现直接返回执行效率更高一些。
27题目
未完待续……