// 双指针解法 因为是有序数组,负数平方有可能成为最大值,因此设置左右指针,让左右指针向中间移动,设置一个新数组,从最后记录,每次只求最大的值
func sortedSquares(nums []int) []int {
n := len(nums)
left := 0
right := n - 1
k := n - 1
array := make([]int, n)
for left <= right {
lm := nums[left] * nums[left]
rm := nums[right] * nums[right]
if lm < rm {
array[k] = rm
right--
} else {
array[k] = lm
left++
}
k--
}
return array
}
//解题思路,双指针解法,设置i,j,同时向右移动,j先移动找到大于等于target值,在移动i直到找到最新区间,计算子数组长度并和result比较谁小,把小值赋给result
注意事项,result初始值大于数组长度,便于判断,如果遍历一遍后result值仍然大于数组长度,说明没有符合条件的子数组,返回值0,有则返回result
func minSubArrayLen(target int, nums []int) int {
i := 0
sum := 0
n := len(nums)
result := n + 1
for j := 0; j < len(nums); j++ {
sum += nums[j]
for sum >= target {
sumLength := j - i + 1
if result > sumLength {
result = sumLength
}
sum = sum - nums[i]
i++
}
}
if result > n {
return 0
} else {
return result
}
}
//解题思路,顺时针左闭右开,不断旋转
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
由外向内一圈一圈这么画下去。
func generateMatrix(n int) [][]int {
startx := 0
starty := 0
loop := n / 2
center := n / 2
count := 1
offset := 1
res := make([][]int, n)
for k := 0; k < n; k++ {
res[k] = make([]int, n)
}
for loop > 0 {
i := startx
j := starty
// 行不动,列变动j++
for ; j < n-offset; j++ {
res[startx][j] = count
count++
}
// 行动i++,列不动j
for i = startx; i < n-offset; i++ {
res[i][j] = count
count++
}
// 行不动i,列变动j--
for ; j > starty; j-- {
res[i][j] = count
count++
}
// 行动i--,列不动j
for ; i > startx; i-- {
res[i][j] = count
count++
}
startx++
starty++
offset++
loop--
}
if n%2 == 1 {
res[center][center] = n * n
}
return res
}