给你一个按 非递减顺序 排序的整数数组 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] <= 104
nums
已按 非递减顺序 排序
解法一:
思路:最直观的思路莫过于暴力求解,并且这道题的数据量也不是很大,遍历数组nums,将里面的值都更新为平方值,然后利用sorted进行升序排序,返回即可。
这种解法在数据量很大的情况下肯定是效率不高的,因此看下面的解法二。
代码(Python):
class Solution(object):
def sortedSquares(self, nums):
for i,num in enumerate(nums):
nums[i] = num * num
return sorted(nums)
解法二:
思路:题目已经说明给定的数组是 已按 非递减顺序 排序的,因此原本的数组就是有序的,仔细观察后可以发现,最大值一定是最左边的那个元素的平方或者是最右边的那个元素的平方,那么很自然而然地我们可以想到每次都比较左右边界的两个元素,将更大的那个放到数组中,然后一直往前推,直到两个边界重合。
这就是双指针法,i=0,j=len(nums)-1表示两个边界下标,result存储最后的结果数组,k是result数组的下标,因为我们每次都找最大值,所以k的范围从len(nums)-1到0。当i <=j也就是左右范围还存在的时候,一直循环比较,每次找最大值赋给result,同时更新边界。
代码(Python):
class Solution(object):
def sortedSquares(self, nums):
i = 0
j = len(nums) - 1
result = [0] * len(nums)
k = len(nums) - 1
while i <= j:
inum = nums[i] ** 2
jnum = nums[j] ** 2
if inum <= jnum:
result[k] = jnum
j -= 1
else:
result[k] = inum
i += 1
k -= 1
return result