有序数组的平方

43 阅读1分钟

算法题目笔记

数组

2.有序数组的平方

给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。

  • 暴力解法

最简单的思路就是将数组nums中的每个元素进行平方,然后非递减排序即可。

代码如下:

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

但是毫无疑问,上述解法的时间复杂度比较高,为O(n+nlog n)。

  • 双指针法

题目给出的是一个非递减的数组,因此将数组中的元素进行平方后数组中最大的元素一定是第一个元素或者最后一个元素,不会是中间的某一个元素,因此这道题可以使用双指针法。
使用双指针法,因为平方后最大的元素有可能出现在第一位也有可能出现在最后一位,因此设置两个指针分别指向第一位和最后一位,同时将获取的最大的元素放在新数组中。

代码如下:

  class Solution {
    public int[] sortedSquares(int[] nums) {
    int[] result = new int[nums.length];  // 存放结果
    int firstIndex = 0;  // 设置指向第一位的指针
    int endIndex = nums.length - 1; // 设置指向最后一位的指针
    int length = nums.length - 1; // 结果数组的长度
    for (firstIndex = 0; firstIndex <= endIndex; ) {  // 两个指针相遇的那一个元素也需要处              理,因此这里是 <=
        if (nums[firstIndex] * nums[firstIndex] > nums[endIndex] * nums[endIndex]){ // 头指针所指元素平方后最大
            result[length] = nums[firstIndex] * nums[firstIndex];
            length --; 
            firstIndex ++; // 头指针递增
        }else {
            result[length] = nums[endIndex] * nums[endIndex];
            length --; 
            endIndex --; // 尾指针递减
        }
    }
    return result;
}
}

时间复杂度:O(n),空间复杂度:O(n)。