977 有序数组的平方
就是一个非递减的数据,每个元素平方后,依然是非递减的输出
- 第一想法: 先把每个元素平方,再排序
- 第二想法:双指针?
func sortedSquares(nums []int) []int {
for i := 0; i < len(nums); i++{
nums[i] = nums[i]*nums[i]
}
left := 0
right := len(nums)-1
ans := make([]int, len(nums))
k := len(nums)-1
for right >= left {
if nums[right] > nums[left]{
ans[k] = nums[right]
right --
}else{
ans[k] = nums[left]
left ++
}
k--
}
return ans
}
- 看来解析之后:双指针+开辟额外的空间保存数组
- 今日收获:双指针+开辟额外空间+值从两端到里面是逐渐减小的,所以指针要从两端往里移动 用时20min
209 长度最小的子数组
返回一个数组中,符合要求的最小长度的子数组,返回子数组的长度
- 第一想法:两个指针,但是想不到滑动窗口
func minSubArrayLen(target int, nums []int) int {
left := 0
sum := 0
ans := len(nums)+1
for i := 0; i < len(nums); i++{
sum += nums[i]
for sum >= target{
tmp := i - left +1
if tmp < ans{
ans = tmp
}
sum -= nums[left]
left ++
}
}
if ans == len(nums)+1{
return 0
}else{
return ans
}
}
- 看了答案之后:滑动窗口 这个窗口如何设置? for 循环作为窗口的右边,窗口往右扩大需要 sum+,窗口往左缩小时,需要减去左边的值,并且left++;最大的子串是 数组的长度,令原始的答案为 长度+1,最坏的情况就是最大的子串,让子串< 子串+1,就可以设置答案了
- 心得:滑动窗口如何写?一开始的result = 数组长度+1 ,这样可以获得最长的子串。用时30
59 螺旋矩阵
给你一个正整数 n
,生成一个包含 1
到 n^2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
- 第一想法:没什么思路,看了一下别人的说是寻找不变量。。。。
- 模拟顺时针画矩阵的过程: 从左到右、从上到下、从右到左、从下到上,转几圈?
先确定 转几圈,当n为偶数时,最后一个值单拿出来赋值,不算最后一圈;然后模拟每一圈,上下左右四次赋值时,的情况,根据情况编写代码。
func generateMatrix(n int) [][]int {
// 初始化一个二维数组
ans := make([][]int,n)
for i:=0; i<n;i++{
ans[i] = make([]int,n)
}
startIndex := 0
lens := n-1
loop := n/2
if n%2 != 0{
tmp := n/2
ans[tmp][tmp] = n*n
}
value :=1
j := 0
i := 0
j1 := 0
i1:=0
for loop >0{
for j = startIndex; j < startIndex+lens; j++{
ans[startIndex][j] = value
fmt.Printf("ans[%d][%d] = %d\n",startIndex,j,ans[startIndex][j])
value++
}
for i = startIndex; i < startIndex+lens;i++{
ans[i][j] = value
fmt.Printf("ans[%d][%d] = %d\n",i,j, ans[i][j])
value++
}
for j1 = j; j1 > j - lens;j1--{
ans[i][j1] = value
fmt.Printf("ans[%d][%d] = %d\n",i,j1,ans[i][j1])
value++
}
for i1 = i; i1 > i -lens; i1 -- {
ans[i1][j1] = value
fmt.Printf("ans[%d][%d] = %d\n",i1,j1,ans[i1][j1])
value ++
}
startIndex ++
lens -= 2
loop --
}
return ans
}
今日收获:先画出来,写出来 再用代码实现;二维数组的创建;for循环中的变量,只存在循环中,如果循环体外也想访问变量,需要在外面声明变量。
数组总结:
1. 二维数组的创建
2.一维数组的创建
3.二分查找法(有顺序的数组中)
4. 双指针法(有序数组的平方,平方后的数组由两端向中间逐渐减小,使用双指针交换两端的值使其变得有序)
5. 滑动窗口(最小子串,滑动窗口和双指针不同的是:符合条件地情况下,窗口的一边值可能不变,只滑动另一边的指针,寻找符合要求的答案)
6.