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, 长度)
参考:
- Go语言学习笔记 --- 指针和自增自减运算及相关注意事项:https://blog.csdn.net/Tyro_java/article/details/76600015
- Go语言中的次方表示 - 个人文章 - SegmentFault 思否:https://segmentfault.com/a/1190000041428406
- golang怎么求平方-Golang-PHP中文网:https://www.php.cn/faq/506290.html
- 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
}
优化点学习:
- 对常用的变量设个值先存着:n := len(nums)
- 开始把临时变量都一块定义了:i, j, k := 0, n-1, n-1
- 对通用的操作k-- 统一执行;
- 简单的操作统一定义,然后用定义的变量执行,不单独设函数:lm, rm := nums[i]*nums[i], nums[j]*nums[j]