LeetCode 704 二分查找
链接:https://leetcode.cn/problems/binary-search/
点击查看代码
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.size() == 0) return -1;
int left = 0;
int right = nums.size()-1;
while(left <= right){
int mid = left + (right-left)/2;
if(target < nums[mid]) right = mid-1;
else if(target > nums[mid]) left = mid+1;
else return mid;
}
return -1;
}
};
心得:
-
要考虑好区间是闭合还是开放的,如果是左闭右闭,那么循环条件就是小于等于号(因为这时候left和right都是在考虑范围内的!!!),如果是左闭右开,那么就是小于号(这时right不予考虑)。
-
注意,在求中值mid时,最好采用left + (right-left)/2 的写法,如果是(right + left)/2,可能会导致溢出。
LeetCode 27.移除元素
链接:https://leetcode.cn/problems/remove-element/submissions/
点击查看代码
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int left = 0;
for(int right = 0; right < nums.size(); right++){
if(val != nums[right]){
nums[left++] = nums[right];
}
}
return left;
}
};
心得:
- 一开始想到暴力破解是不太巧妙的办法,于是想到了设置两个指针,可是在设计两个指针如何移动的时候出现了问题,我是将快指针设置成了从1开始,并且在用slow从0开始循环进行遍历,中间的判断条件是if(nums[slow] == val),这样写下去,完全就乱套了。后来发现我是没有定义好快慢指针各自的角色,造成混淆了,慢指针的角色就是记录下一个不是val的值的位置,而快指针就是负责遍历整个数组,并且把不是val的角色告诉慢指针,这样想代码就好写多了。以后写代码要思考清楚再动手。