Day02 双指针

85 阅读1分钟

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

1 977. 有序数组的平方

1.1 题目

在这里插入图片描述

1.2 题解

1.2.1 方法一:内置快速排序

class Solution {
    public int[] sortedSquares(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            nums[i] = (int) Math.pow(nums[i], 2);
        }
        Arrays.sort(nums);
        return nums;
    }
}

1.2.2 方法二:手写归并排序

class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] res = new int[nums.length];

        int i;
        for (i = 0; i < nums.length; i++) {
            if (nums[i] >= 0)
                break;
        }

        int m = i;
        int n = i - 1;

        if (n < 0) {
            for (i = 0; i < nums.length; i++) {
                res[i] = (int) Math.pow(nums[i], 2);
            }
            return res;
        } else {
            for (i = 0; i < nums.length; i++) {
                nums[i] = (int) Math.pow(nums[i], 2);
            }

            int k = 0;
            while (n >= 0 && m <= nums.length - 1) {
                if (nums[n] < nums[m]) {
                    res[k++] = nums[n];
                    n--;
                } else {
                    res[k++] = nums[m];
                    m++;
                }
            }

            if (n < 0 && m > nums.length - 1) {
                return res;
            }

            if (n < 0) {
                while (m < nums.length)
                    res[k++] = nums[m++];
            }

            if (m > nums.length - 1) {
                while (n > -1)
                    res[k++] = nums[n--];
            }
        }
        return res;
    }
}

注:归并排序的思想,合并两个有序的数组,期间采取双指针。

2 189. 轮转数组

2.1 题目

在这里插入图片描述

2.2 题解

2.2.1 方法一:辅助数组

    public static void rotate(int[] nums, int k) {
        // 处理k值,如果k值大于数组长度说明存在循环
        k %= nums.length;

        int[] res = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            res[(i + k) % nums.length] = nums[i];
        }

        System.arraycopy(res, 0, nums, 0, nums.length);
    }

2.2.2 方法二:数组反转

 public static void rotate(int[] nums, int k) {
        k %= nums.length;

        reverse(nums, 0, nums.length - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, nums.length - 1);
    }

    public static void reverse(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }

3 总结

3.1 归并排序模板

详见此文