今日题目:
977.有序数组的平方
209.长度最小的子数组
59.螺旋矩阵II
977.有序数组的平方
要点:
1. 理解只有负数会在平方后打乱结果数组的顺序
2. 根据1的条件可以使用双指针分别处理正数与负数
3. 采用类似归并排序的思想
代码:
func sortedSquares(nums []int) []int {
res := make([]int,len(nums))
i := 0 //左指针指向负数的最小值
j := len(nums)-1 //右指针指向正数的最大值
k :=len(nums)-1 //指向res的指针
for i<=j {
if sqrt(nums[i])<sqrt(nums[j]){
res[k] = sqrt(nums[j])
j--
k--
} else {
res[k] = sqrt(nums[i])
i++
k--
}
}
return res
}
func sqrt(a int) int {
return a*a
}
209. 长度最小的子数组
要点:
1. 使用双指针实现滑动窗口,类似于“虫取法”, 右指针向前探索,左指针维持符合条件的窗口
2. 难点在于对左指针的处理
碰见这种求子数组的题目,首先可以考虑滑动窗口。滑动窗口的一个难点在于如何处理左右指针的相邻元素。这道题中右指针不断向右探索,使得累计和能够大于target即可。但是当sum大于target的时候,此时左指针是有可能向右移动的, 比如 1,1,1,1,100这种序列。所以此时需要固定右指针,左指针不断右移,探索最小长度的情况。
代码:
func minSubArrayLen(target int, nums []int) int {
left := 0
right := 0
minLength := 2147483647
sum := 0
for right < len(nums) {
sum += nums[right]
for sum >= target {
if minLength > right-left+1 {
minLength = right - left +1
}
sum -= nums[left]
left++
}
right++
}
if minLength == 2147483647 {
return 0
} else {
return minLength
}
}
59. 螺旋矩阵 II
要点:
1. 模拟就行,但是要想清楚边界条件,注意旋转圈数和边长的关系
2. 对每条边采用左闭右开的原则从而保证每条边的处理的是相似的
3. 分奇偶情况讨论
代码:
func generateMatrix(n int) [][]int {
matrix := createMatrix(n)
i := 0
j := 0
num := 1
round := 0
isOdd := 0
if n%2 == 1{
isOdd = 1
}
for num<=n*n-isOdd{
for ; j <n-round-1;j++{
matrix[i][j] = num
num++
}
for ; i <n-round-1;i++{
matrix[i][j] = num
num++
}
for ; j >round; j--{
matrix[i][j] = num
num++
}
for ; i >round; i--{
matrix[i][j] = num
num++
}
i++
j++
round++
}
if isOdd == 1 {
matrix[i][j] = num
}
return matrix
}
func createMatrix(n int) [][]int {
matrix := make([][]int, n)
for i := range matrix {
matrix[i] = make([]int, n)
for j := range matrix[i] {
matrix[i][j] = 0
}
}
return matrix
}