移动零(leetcode.283)
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int right = 0,left = 0;
while(right < nums.size()){
// 遍历过程中如果元素不为0,则left和right指向同一个元素,自己与自己交换
// 如果元素为0,则right++,走得比left快,直到right遇到非0元素,直接与left交换
// 交换后left++,此时left一定为0,如果right再向前遇到非0,依然是和left交换
// 如果遇到0,right继续向前走
if(nums[right]){
swap(nums[left],nums[right]);
left++;
}
right++;
}
}
};
盛最多水的容器(leetcode.11)
class Solution {
public:
int maxArea(vector<int>& height) {
int l = 0,r = height.size() - 1;
int ans = 0;
// 左指针从最左端开始,右指针从最右端开始
while(l < r){
// 面积 = 垂线高度 * 左右指针距离
int area = min(height[l],height[r])*(r - l);
ans = max(ans, area);
// 左右指针之间的距离只能缩小,那么应该在距离缩小的过程中保证高度尽可能增大
if(height[l] < height[r]){
++l;
}else{
--r;
}
}
return ans;
}
};
三数之和(leetcode.15)
代码随想录 (programmercarl.com):双指针
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
sort(nums.begin(),nums.end());
for(int i = 0; i < nums.size(); i++){
if(nums[i] > 0){
return result;
}
// a去重
if(i > 0 && nums[i] == nums[i-1]){
continue;
}
int left = i + 1;
int right = nums.size() - 1;
while(left < right){
if(nums[i] + nums[left] + nums[right] > 0){
right--;
}else if(nums[i] + nums[left] + nums[right] < 0){
left++;
}else{
result.push_back(vector<int>{nums[i],nums[left],nums[right]});
//b去重
while(left < right && nums[right] == nums[right-1]){
right--;
}
//c去重
while(left < right && nums[left] == nums[left + 1]){
left++;
}
right--;
left++;
}
}
}
return result;
}
};
注意点:
- a、b、c的去重逻辑一定是上面这样