1 题目
给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例 1:
输入:[-4,-1,0,3,10]
输出:[0,1,9,16,100]
示例 2:
输入:[-7,-3,2,3,11]
输出:[4,9,9,49,121]
提示:
1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A 已按非递减顺序排序。
2 解答
解法一:
// 直接用sort包的函数,但是如果是面试肯定是不行的
func sortedSquares(A []int) []int {
A2 := make([]int, 0)
for _, v := range A {
A2 = append(A2, v*v)
}
sort.Ints(A2)
return A2
}
解法二:
// 将切片逆转
func reverse(A []int) []int {
lindex := 0
rindex := len(A) - 1
for lindex < rindex {
A[lindex], A[rindex] = A[rindex], A[lindex]
lindex++
rindex--
}
return A
}
// 由于该数组是个非递减数列,因此,要排序的主要原因是因为数列跨过了正负
// 但是还是有一个性质:两边都是有序的,可以采用类似归并排序的思路
// 从两边分别开始遍历,最大的数组即是当前的最大值,依次往中间执行即可
func sortedSquares(A []int) []int {
A2 := make([]int, 0)
lindex := 0
rindex := len(A) - 1
for lindex < rindex {
if A[lindex]*A[lindex] < A[rindex]*A[rindex] {
A2 = append(A2, A[rindex]*A[rindex])
rindex--
} else {
A2 = append(A2, A[lindex]*A[lindex])
lindex++
}
}
if lindex == rindex {
A2 = append(A2, A[lindex]*A[rindex])
}
return reverse(A2)
}
解法一直接用了库函数,解法二则使用了额外的空间进行归并,从LeetCode上的执行耗时和内存消耗上来看,解法二比解法一优很多,但是如果能够直接在原地做,估计效率更高。