1. 数组二分法查找
力扣题号:704. 二分查找
第一天比较简单,但也不算没有要点。二分查找要点感觉在下标更新方式与区间开闭的对应上。主要可以分为左闭右闭和左闭右开两种。
1.1 左闭右闭
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1; // 看这里,一开始right的下标是有效的,所以区间是左闭右闭
while (left <= right) { // 因为是左闭右闭,所以left==right的时候[left, right]这个区间是有效的,所以也要放在循环里
int middle = left + ((right - left) / 2);
if (nums[middle] < target) left = middle + 1;
else if (nums[middle] > target) right = middle - 1; // 这里right更新与初始化的方式是类似的
else return middle;
}
return -1;
}
};
1.2 左闭右开
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size(); // 看这里,一开始right的下标是无效的,所以区间是左闭右开
while (left < right) { // 因为是左闭右闭,所以left==right的时候[left, right)这个区间是无效的,所以要剔除出去
int middle = left + ((right - left) / 2);
if (nums[middle] < target) left = middle + 1;
else if (nums[middle] > target) right = middle; // 这里right更新与初始化的方式是类似的
else return middle;
}
return -1;
}
};
2. 移除元素
力扣题号:27.移除元素
这应该是比较经典的也比较入门的双指针题目了。其实拆解来看的话,快指针只要遍历一边数组就可以了,慢指针根据快指针所指的元素是否为val
在原地像append()
一样就可以了。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int fast = 0, slow = 0;
while (fast < nums.size()) {
if (nums[fast] != val) {
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
};
如果不是原地的话,其实思路看起来有点像这样:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
vector<int> result;
int fast = 0;
while (fast < nums.size()) {
if (nums[fast] != val) {
result.append(nums[fast]);
}
return result.size();
}
}
};