https://leetcode.cn/problems/squares-of-a-sorted-array/

学习内容

给一个有序数组,让返回一个所有元素的平方后,依然有序的一个数组。

该数组的特性是:从左向右及从右向左看,都有一个由大到小的趋势,最大元素一定在两边。

两边有极值的情况,可以考虑用双指针的思路。通过两个指针的操作,逐步向中间合拢,来得到一个有序的数组。

双指针:创建一个等长的数组,通过操作i、j来合拢,然后塞入到新数组的k位置。

代码

func sortedSquares(nums []int) []int {
    // 1. 动态创建数组
    res := make([]int, len(nums))
    // var res[len(nums)] int
    // 2. 因为i,j不是通常的自增减,因此这里用先定义后for改值的方式
    var k = len(nums)-1
    i,j := 0,len(nums)-1
    // 3. 这里不能用math.pow,需要是float
    for i<=j {
        if square(nums[i]) > square(nums[j]){
            res[k] = square(nums[i])
            k--
            i++
        } else {
            res[k] = square(nums[j])
            k--
            j--
        }
    }
    return res
}

func square(num int) int {
    return num * num
}

go补充

go的自增自减语法,++ --都是在变量后面,没有变量在前面的形式;

次方表示用math.Pow(2, 3),2的3次方,但这样返回的结果为float,需要自己定义函数; 初始化数组时出错, 用length表示长度的需要用动态数组的创建方式:make([]int, 长度)

参考:

  1. Go语言学习笔记 --- 指针和自增自减运算及相关注意事项:https://blog.csdn.net/Tyro_java/article/details/76600015
  2. Go语言中的次方表示 - 个人文章 - SegmentFault 思否:https://segmentfault.com/a/1190000041428406
  3. golang怎么求平方-Golang-PHP中文网:https://www.php.cn/faq/506290.html
  4. golang 数组初始化的一个坑:http://www.h1z166.com/articles/2017/10/09/1507525187733.html

标准代码学习

func sortedSquares(nums []int) []int {
	n := len(nums)
	i, j, k := 0, n-1, n-1
	ans := make([]int, n)
	for i <= j {
		lm, rm := nums[i]*nums[i], nums[j]*nums[j]
		if lm > rm {
			ans[k] = lm
			i++
		} else {
			ans[k] = rm
			j--
		}
		k--
	}
	return ans
}

优化点学习:

  1. 对常用的变量设个值先存着:n := len(nums)
  2. 开始把临时变量都一块定义了:i, j, k := 0, n-1, n-1
  3. 对通用的操作k-- 统一执行;
  4. 简单的操作统一定义,然后用定义的变量执行,不单独设函数:lm, rm := nums[i]*nums[i], nums[j]*nums[j]