Day03 双指针

85 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1 283. 移动零

1.1 题目

在这里插入图片描述

1.2 题解

class Solution {
    public void moveZeroes(int[] nums) {
        // 双指针:m负责遍历数组中不为零的数,n负责移动后数组不为零数字的下标
        int m = 0;
        int n = 0;
        int len = nums.length;

        while (m < len) {
            if (nums[m] != 0) {
                nums[n++] = nums[m];
            }
            m++;
        }

        while (n < len)
            nums[n++] = 0;
    }
}

2 167. 两数之和 II - 输入有序数组

2.1 题目

在这里插入图片描述

2.2 题解

2.2.1 方法一

public static int[] twoSum(int[] numbers, int target) {

        int left = 0;
        int right = numbers.length - 1;

        // 一步一步寻找,可以在寻找right时嵌套二分查找
        while (left < right) {
            if (numbers[left] + numbers[right] == target)
                return new int[]{left + 1, right + 1};
            else if (numbers[left] + numbers[right] < target)
                left++;
            else right--;
        }

        return null;
    }

2.2.2 方法二

class Solution {
    public int[] twoSum(int[] numbers, int target) {
     for (int i = 0; i < numbers.length; i++) {
            int left = i + 1;
            int right = numbers.length - 1;

            while (left <= right) {
                int mid = left + (right - left) / 2;
                if (numbers[i] + numbers[mid] == target)
                    return new int[]{i + 1, mid + 1};
                else if (numbers[i] + numbers[mid] > target)
                    right = mid - 1;
                else left = mid + 1;
            }
        }
        return null;
    }
}

3 总结

3.1 双指针的原理