LeetCode——977.有序数组的平方

通过万岁!!!

  • 题目:要求对一个有序数组,每个数进行平方,并且还是有序的。注意这里面由负数。
  • 基本思路:先将负数转换为正数,然后sort,然后再fori遍历,进行平方。时间复杂度就是排序的时间复杂度。
  • 进阶思路:也就是时间复杂度为o(n)。其实核心就是我们找到正数和负数的分界线,然后双指针即可。找到以后,一个正数指针,一个负数指针,然后定义一个返回的数组ans,依次填充到ans中即可。

java代码——基本思路

class Solution {
    public int[] sortedSquares(int[] nums) {
        int len = nums.length;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] < 0) {
                nums[i] = -nums[i];
            } else {
                break;
            }
        }
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++) {
            nums[i] *= nums[i];
        }
        return nums;
    }
}

java代码——进阶思路

class Solution {
    public int[] sortedSquares(int[] nums) {
        int len = nums.length;
        int positiveIdx = 0;
        int[] ans = new int[len];
        while (positiveIdx < len && nums[positiveIdx] < 0) {
            positiveIdx++;
        }
        int negativeIdx = positiveIdx - 1;
        int idx = 0;
        while (negativeIdx >= 0 && positiveIdx < len) {// 都不会越界
            if (-nums[negativeIdx] > nums[positiveIdx]) {
                ans[idx++] = nums[positiveIdx] * nums[positiveIdx++];
            } else {
                ans[idx++] = nums[negativeIdx] * nums[negativeIdx--];
            }
        }
        while (negativeIdx >= 0) {
            ans[idx++] = nums[negativeIdx] * nums[negativeIdx--];
        }
        while (positiveIdx < len) {
            ans[idx++] = nums[positiveIdx] * nums[positiveIdx++];
        }
        return ans;
    }
}
  • 总结:题目比较简单,主要是进阶思路。但是进阶思路的空间复杂度会有所提升,因为我们需要定义一个ans数组,用来存储我们要返回的内容。

你可能感兴趣的:(算法,leetcode,算法,java)