704 二分查找
题目链接:704.二分查找
class Solution {
public:
int search(vector<int>& nums, int target) {
int min,max,flag;
min = 0;
max = nums.size()-1;
while(min<=max){
flag = (min+max)/2;
if(target==nums[flag]){
return flag;
}else if(target>nums[flag]){
min = flag+1;
}else if(target<nums[flag]){
max = flag-1;
}
}
return -1;
}
};
这道题已经做过非常多遍了,所以举个例子比比划划很快就AC了。需要注意的是while的条件和min、max以及中值的选取,举几个例子试一试其实就挺清楚了。
27 移除元素
题目链接:27移除元素
参考学习链接:数组中移除元素并不容易
双指针法
快指针p:用来寻找旧数组中需要删除的 元素
慢指针q:则指向新数组所需要的元素
那么两个指针如何进行挪动完成元素的移除呢?
思路是:快指针采用for进行循环,一直在往后移,快指针还没遇到需要移除的元素的时候,q指针会跟着往后挪,不断的把旧数组中的元素放进新数组中。当快指针找到需要移除的元素时,慢指针就不会跟着快指针进行挪动,直到找到下一个可以更新的元素。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int q=0;
for(int p=0;p<nums.size();p++){
if(nums[p]!=val){
nums[q++]=nums[p];
}
}
return q;
}
};
这道题几个月前做过一次,但是已经完全忘记双指针这个做法了,看完代码随想录中的动图后,又在草稿纸上演练了几回。因为想着把两个指针的挪动都包在一个个i的for循环里,,所以在p和q++放的位置这里思考了很久,是先挪呢还是先判断呢,是把q++放到判断里呢还是判断外呢,好像总是想不出来一个满足所有特殊情况的做法。
直到看到代码随想录的代码,豁然开朗。原来可以直接把p放进for循环,以p指针没有遇到需要移除的元素为条件,来对q进行更改。这样,也就不用管p远离q很远了,反正遇到不移除的q更新就好了。
感想
昨天旅游回来发现今天正好有一期开营,所以很巧地赶上了这一期。希望接下来两个月能完成代码随想录一刷~
加油!