Bootstrap

有序数组的平方

  • 暴力排序法:对数组中的每个数字进行平方操作,然后对结果数组进行排序。
  • class Solution {
        public int[] sortedSquares(int[] nums) {
            int[] ans = new int[nums.length];
            for (int i = 0; i < nums.length; ++i) {
                ans[i] = nums[i] * nums[i];
            }
            Arrays.sort(ans);
            return ans;
        }
    }
    

  • 双指针法:利用数组已经是有序的特性,使用双指针从数组的两端开始,逐步向中间移动,比较并平方,然后填充到结果数组中。
  • class Solution {
        public int[] sortedSquares(int[] nums) {
            int n = nums.length;
            int[] ans = new int[n];
            for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {
                if (nums[i] * nums[i] > nums[j] * nums[j]) {
                    ans[pos] = nums[i] * nums[i];
                    ++i;
                } else {
                    ans[pos] = nums[j] * nums[j];
                    --j;
                }
                --pos;
            }
            return ans;
        }
    }

### 方法一:直接排序
- **思路**:对数组`nums`中的每个数进行平方,然后对结果数组进行排序。
- **代码实现**:使用Java的`Arrays.sort()`方法对平方后的数组进行排序。
- **复杂度分析**:
  - 时间复杂度:O(nlogn),其中n是数组`nums`的长度。
  - 空间复杂度:O(logn),这是排序算法所需的栈空间。

### 方法二:双指针(分界线法)
- **思路**:利用数组已经排序的特点,找到负数和非负数的分界线,然后使用类似归并排序的方法将平方后的数放入结果数组。
- **代码实现**:使用两个指针`i`和`j`分别从数组的两端开始,根据平方的大小交替放入结果数组。
- **复杂度分析**:
  - 时间复杂度:O(n)。
  - 空间复杂度:O(1),只需要常量额外空间。

### 方法三:双指针(逆序法)
- **思路**:使用两个指针从数组两端开始,每次选择平方较大的数放入结果数组的前端,逆序填充。
- **代码实现**:与方法二类似,但每次将较大的平方数放入结果数组的前端。
- **复杂度分析**:
  - 时间复杂度:O(n)。
  - 空间复杂度:O(1)。

这三种方法各有特点,方法一简单直接但效率不是最优,方法二和方法三都利用了数组的有序性,以线性时间复杂度解决问题。在实际应用中,选择哪种方法取决于对时间复杂度和空间复杂度的需求以及具体场景。


 

 

;