题目地址(977. 有序数组的平方)
https://leetcode-cn.com/problems/squares-of-a-sorted-array/
题目描述
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例 1:输入:nums = [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]示例 2:输入:nums = [-7,-3,2,3,11]输出:[4,9,9,49,121]提示:1 <= nums.length <= 104-104 <= nums[i] <= 104nums 已按 非递减顺序 排序进阶:请你设计时间复杂度为 O(n) 的算法解决本问题
前置知识
公司
- 暂无
思路

数组平方 最大的数字只会在两边 不会再中间 定义双指针 left指向0 right 指向 size-1 两个数平方 较大的数字放到数组最后
关键点
- 双指针
- 数组从后往前遍历
代码
- 语言支持:Java
Java Code:
- 暴力解法
class Solution {public int[] sortedSquares(int[] nums) {for (int i = 0; i < nums.length; i++) {nums[i] *= nums[i];}Arrays.sort(nums);return nums;}}

class Solution {public int[] sortedSquares(int[] nums) {int size = nums.length - 1;int[] result = new int[size + 1];int right = size;for (int left = 0; left <= right; ) {if (nums[left] * nums[left] < nums[right] * nums[right]) {result[size--] = nums[right] * nums[right];right--;} else {result[size--] = nums[left] * nums[left];left++;}}return result;}}

复杂度分析
令 n 为数组长度。
- 时间复杂度:暴力解法
#card=math&code=O%28n%29&id=CCsPk)+
#card=math&code=O%28nlogn%29&id=leXvZ) 双指针法
#card=math&code=O%28n%29&id=xcYBL)
- 空间复杂度:
#card=math&code=O%28n%29&id=k9jb5)
