题目地址(977. 有序数组的平方)

https://leetcode-cn.com/problems/squares-of-a-sorted-array/

题目描述

  1. 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
  2. 示例 1
  3. 输入:nums = [-4,-1,0,3,10]
  4. 输出:[0,1,9,16,100]
  5. 解释:平方后,数组变为 [16,1,0,9,100]
  6. 排序后,数组变为 [0,1,9,16,100]
  7. 示例 2
  8. 输入:nums = [-7,-3,2,3,11]
  9. 输出:[4,9,9,49,121]
  10. 提示:
  11. 1 <= nums.length <= 104
  12. -104 <= nums[i] <= 104
  13. nums 已按 非递减顺序 排序
  14. 进阶:
  15. 请你设计时间复杂度为 O(n) 的算法解决本问题

前置知识


公司

  • 暂无

思路

977.有序数组的平方.gif
数组平方 最大的数字只会在两边 不会再中间 定义双指针 left指向0 right 指向 size-1 两个数平方 较大的数字放到数组最后

关键点

  • 双指针
  • 数组从后往前遍历

代码

  • 语言支持:Java

Java Code:

  • 暴力解法
  1. class Solution {
  2. public int[] sortedSquares(int[] nums) {
  3. for (int i = 0; i < nums.length; i++) {
  4. nums[i] *= nums[i];
  5. }
  6. Arrays.sort(nums);
  7. return nums;
  8. }
  9. }

image.png

  1. class Solution {
  2. public int[] sortedSquares(int[] nums) {
  3. int size = nums.length - 1;
  4. int[] result = new int[size + 1];
  5. int right = size;
  6. for (int left = 0; left <= right; ) {
  7. if (nums[left] * nums[left] < nums[right] * nums[right]) {
  8. result[size--] = nums[right] * nums[right];
  9. right--;
  10. } else {
  11. result[size--] = nums[left] * nums[left];
  12. left++;
  13. }
  14. }
  15. return result;
  16. }
  17. }

image.png

复杂度分析

令 n 为数组长度。

  • 时间复杂度:暴力解法 977. 有序数组的平方 - 图4#card=math&code=O%28n%29&id=CCsPk)+977. 有序数组的平方 - 图5#card=math&code=O%28nlogn%29&id=leXvZ) 双指针法977. 有序数组的平方 - 图6#card=math&code=O%28n%29&id=xcYBL)
  • 空间复杂度:977. 有序数组的平方 - 图7#card=math&code=O%28n%29&id=k9jb5)