Skip to content

双指针


283. 移动零

java
class Solution {
    public void moveZeroes(int[] nums) {
        for(int i = 0, j = 0; i < nums.length; i++){
            if(nums[i] != 0){
                int temp = nums[i];
                nums[i] = 0;        // 直接刷为0
                nums[j++] = temp;
            }
        }
    }
}

11. 盛最多水的容器

java
class Solution {
    public int maxArea(int[] height) {
        int ans = 0;
        int left = 0, right = height.length - 1, minH;
        while (left < right) {
            minH = Math.min(height[left], height[right]);
            ans = Math.max(ans, minH * (right - left));

            // 两边高度不一致,短边进入while循环
            // 连边高度一致时,都要进入while循环
            while (left < right && height[left] <= minH) {
                left++;
            }

            while (left < right && height[right] <= minH) {
                right--;
            }
        }
        return ans;
    }
}

15. 三数之和

java
// 题目要求去重,因此排序比较好
// 参考灵神
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        int n = nums.length;
        List<List<Integer>> ans = new ArrayList<>();
        Arrays.sort(nums);
        for (int i = 0; i < n - 2; i++) {
            if (nums[i] + nums[i + 1] + nums[i + 2] > 0) {
                break; // 最小和大于0,这里是break结束循环
            }
            if (nums[i] + nums[n - 1] + nums[n - 2] < 0) {
                continue; // 最大和小于0,这里是当前i不满足条件,循环继续
            }
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue; // 去重
            }
            int j = i + 1, k = n - 1;
            while (j < k) {
                int sum = nums[i] + nums[j] + nums[k];
                if (sum < 0) {
                    j++;
                } else if (sum > 0) {
                    k--;
                } else {
                    ans.add(List.of(nums[i], nums[j], nums[k]));
                    for (j++; j < k && nums[j] == nums[j - 1]; j++) {
                    }
                    for (k--; j < k && nums[k] == nums[k + 1]; k--) {
                    }
                }
            }
        }

        return ans;
    }
}