数组 - 有序数组的平方

69 阅读1分钟

数组 - 有序数组的平方

本题以力扣上的977号题目为例,大概就是给定一个有序序列,存在负数,将序列中各个元素的平方后进行升序输出。

image.png 当两个元素的平方相等时,顺序不管。

最开始我的想法是

image.png 但其实这种想法不太成立,当遇到[-5, -4, -3, -2, -1]这种序列,得出的结果就不对。

其实题目给的有序序列元素平方后,有一个特点,就是最大值一定是在两边。所以我们通过比较左右两边的就可以得出谁是最大值,继而不断向中间收缩范围。

找到最大值就往新定义的数组中插入,是从最后开始插入

func sortedSquares(nums []int) []int {
    // 全部元素取平方并存入
    res := make([]int, len(nums))
    index := len(nums) - 1
    i := 0
    j := len(nums)-1
    for i <= j { // 这里是小于等于,如果忽略等于,就会少考虑一种情况
        if nums[i] * nums[i]  > nums[j] * nums[j] {
            res[index] = nums[i] * nums[i]
            index--
            i++
        } else {
            res[index] = nums[j] * nums[j]
            index--
            j--
        }
    }
    return res
}