@[TOC] 代码随想录算法训练营第二天打卡
题目链接:
双指针: 977.有序数组的平方
滑动窗口: 209.长度最小的子数组
模拟:59.螺旋矩阵II
攻略链接:
代码随想录
双指针
977.有序数组的平方
没什么好说的,
另外开辟了一个数组内存result,通过相向遍历,将最大的数依次存入新数组的后端
func sortedSquares(nums []int) []int {
result := make([]int, len(nums))
left, right := 0, len(nums) - 1
index := len(result) - 1
for left <= right {
if -nums[left] < nums[right] {
result[index] = nums[right] * nums[right]
index --
right --
}else {
result[index] = nums[left] * nums[left]
index --
left ++
}
}
return result
}
滑动窗口
滑动窗口: 209.长度最小的子数组
跟双指针差不多,
首先左指针待命,先用右指针滑动数组,满足条件后再滑动左指针,依次滑动直到结束
func minSubArrayLen(target int, nums []int) int {
left := 0 // 左指针待命
sums := 0
minLength := len(nums) + 1
// 右指针向右滑动
for right := 0; right < len(nums); right++{
sums = sums + nums[right] //滑动相加
for sums >= target {
length := right - left + 1
if length < minLength {
minLength = length
}
sums -= nums[left]
left++
}
}
if minLength == len(nums) + 1 {
return 0
}else {
return minLength
}
}
坑
- 两个for循环分别滑动两个指针,先滑动右指针出去寻找食物,左指针在家待命;找到以后左指针再出去,一步一步,小心翼翼;
- minLength最小长度初始值一定要设置比数组长度大的数值,否则在return 0时,会返回数组长度导致运行出错;
- 后续在初始化某个值时,不要吝啬,不舍得给值,有多大就给多大!有多小就给多小!
模拟
59.螺旋矩阵II
此题没有什么算法含量,就是单纯写逻辑的过程,但是属于哪种一写就废,一看就会的典型题目。说明对代码的掌控力度不足。
考验对代码的掌控力以及逻辑思维能力
func generateMatrix(n int) [][]int {
left, right := 0, n - 1
up, down := 0, n - 1
v := 1
res := make([][]int, n)
for i := 0 ; i < n; i ++ {
res[i] = make([]int, n)
}
for v <= n * n {
// 循环内嵌套四个循环,从上到下依次执行
for i := left; i <= right; i++ {
res[up][i] = v // 注意行索引始终都是up等定义的四个值,然后遍历另一个维度赋值
v++
}
up++ //注意第up行赋值结束后,up+1
// 对最右侧列的所有行赋值
for i := up; i <= down; i++ {
res[i][right] = v
v++
}
right--
// 最下行
for i := right; i >= left; i-- {
res[down][i] = v
v++
}
down--
for i := down; i >= up; i-- {
res[i][left] = v
v++
}
left++
}
return res
}
坑
- 注意golang是如何开辟一个二维矩阵的!
- 外层for循环内,又开辟了四个for循环,按顺序依次执行
- 一开始用的if判定边界条件,但是非常麻烦,且时间不够充裕,就不完善了,直接引用攻略的写法吧。