977.有序数组的平方
力扣题目地址
题目:
给你一个按 非递减顺序 排序的整数数组 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]
方法一:
暴力排序
最直接的方法就是:每个数平方,然后再排序
这个时间复杂度是 O(n + nlogn), 可以说是O(nlogn)的时间复杂度,
但为了和下面双指针法算法时间复杂度有鲜明对比,我记为 O(n + nlog n)。
func sortedSquares(nums []int) []int {
res := make([]int,0)
for _, num := range nums {
num = num*num
res = append(res,num)
}
//res = sortArray(res)
sort.Ints(res)
return res
}
方法二
双指针
数组其实是有序的, 但是因为有负数,导致平方之后顺序会被打乱
但是有个特点是,数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
那么就可以从两端开始逐步比较,然后从最大的开始排列新数组
这个时间复杂度是 O(n)
func sortedSquares2(nums []int) []int {
j, s :=len(nums)-1,len(nums)-1
res := make([]int,len(nums))
for i:=0;i<=j; {
if nums[i]*nums[i]>=nums[j]*nums[j] {
res[s] = nums[i]*nums[i]
i++
}else {
res[s] = nums[j]*nums[j]
j--
}
s--
}
return res
}