hot100----双指针

114 阅读1分钟

移动零(leetcode.283)

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int right = 0,left = 0;
        while(right < nums.size()){
        // 遍历过程中如果元素不为0,则leftright指向同一个元素,自己与自己交换
        // 如果元素为0,则right++,走得比left快,直到right遇到非0元素,直接与left交换
        // 交换后left++,此时left一定为0,如果right再向前遇到非0,依然是和left交换
        // 如果遇到0right继续向前走
            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的去重逻辑一定是上面这样