在数组结构中,要实现O(n)或者O(1)的时间复杂度时,双指针这个方法是个很好的解题思路。

原题描述:

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

解题思路:

1. 因为是有序的,所以可以看成是y=x^2函数图像性质。最大的在两端,越靠近中间,平方后的值越小
2. 定义左右两个指针,分别指向起始和结束。指针往中心移动
3. 比较两个指针指向的值的大小,大的放入结果集,同时移动指针。

go示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
func sortedSquares(nums []int) []int {
    left := 0
    right := len(nums) - 1
    results := make([]int, len(nums))
    index := right
    for index >= 0 {
        if nums[left] *  nums[left] > nums[right] * nums[right] {
            results[index] = nums[left] * nums[left]
            left += 1
        } else {
            results[index] = nums[right] * nums[right]
            right -= 1
        }
        index -= 1
    }
    return results
}