977.有序数组的平方
题目链接
leetcode.cn/problems/sq…
文章链接
programmercarl.com/0977.%E6%9C…
视频链接
www.bilibili.com/video/BV1QB…
看到题目的第一想法
这道题目的第一想法很简单,对每一个数平方过后再排序,排序调用的是go语言的sort函数,下面附上我的go语言代码:
func sortedSquares(nums []int) []int {
newNums := make([]int, len(nums))
for k, v := range nums {
newNums[k] = v * v
}
sort.Ints(newNums)
return newNums
}
看完代码随想录之后的想法
看了卡哥的视频我才知道还可以用双指针来做这道题,因为数组是有序排列的,所以定义两个变量i和j,最开始i在最左边,即下标为0,j在最后边,即下标为len(nums)-1,同时再重新定义一个数组result,再比较nums[i]的平方和nums[j]的平方的大小,如果前者更大,则将前者的值赋值给result数组的最后一个,注意result数组是从最后一个下标开始倒着赋值,随后i自增1,然后和j下标的数作比较,如果nums[j]的平方更大,则这次将nums[j]的值赋值给result数组的倒是第二个,随后j自减1,以此类推,最终当i > j时,退出循环,result数组也赋值完毕。下面附上我的go语言代码,该代码是用双指针实现的。
func sortedSquares(nums []int) []int {
i, j, k := 0, len(nums)-1, len(nums)-1
result := make([]int, len(nums))
for i <= j {
if nums[i] * nums[i] > nums[j] * nums[j] {
result[k] = nums[i] * nums[i]
k--
i++
} else {
result[k] = nums[j] * nums[j]
k--
j--
}
}
return result
}
实现过程中遇到的困难
昨天学到的双指针法收获很大,虽说第一想法没想到用双指针,但是看到卡哥的思路过后,立马就写了出来。
今日收获
刚刚已经说了,能够灵活运用双指针法就是最大的收获。
209.长度最小的子数组
题目链接
leetcode.cn/problems/mi…
文章链接
programmercarl.com/0209.%E9%95…
视频链接
www.bilibili.com/video/BV1tZ…
看到题目的第一想法
这道题我不知道怎么做,主要卡在子数组的长度不确定这一个问题上。
看完代码随想录之后的想法
看完了过后发现这道题卡哥用滑动窗口的方法来做,也可以用暴力法来做,暴力法做出来答案不对,下一个章节着重讲述错误的过程。滑动窗口的方法由于时间的关系,没时间写,周末补上。下面放上官方版本的go语言代码, 暴力法:
func minSubArrayLen(s int, nums []int) int {
n := len(nums)
if n == 0 {
return 0
}
ans := math.MaxInt32
for i := 0; i < n; i++ {
sum := 0
for j := i; j < n; j++ {
sum += nums[j]
if sum >= s {
ans = min(ans, j - i + 1)
break
}
}
}
if ans == math.MaxInt32 {
return 0
}
return ans
}
func min(x, y int) int {
if x < y {
return x
}
return y
}
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/minimum-size-subarray-sum/solution/chang-du-zui-xiao-de-zi-shu-zu-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
滑动窗口法:
func minSubArrayLen(s int, nums []int) int {
n := len(nums)
if n == 0 {
return 0
}
ans := math.MaxInt32
start, end := 0, 0
sum := 0
for end < n {
sum += nums[end]
for sum >= s {
ans = min(ans, end - start + 1)
sum -= nums[start]
start++
}
end++
}
if ans == math.MaxInt32 {
return 0
}
return ans
}
func min(x, y int) int {
if x < y {
return x
}
return y
}
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/minimum-size-subarray-sum/solution/chang-du-zui-xiao-de-zi-shu-zu-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
实现过程中遇到的困难
用暴力法做了一下该题,发现有以下问题,首先,子数组的元素个数不确定,我只考虑了nums[i] + nums[j] == target的情况,极有可能i和j之间还有元素,所以必须要再定义一个变量sum,用sum来累加,再和target作比较,居然卡在这个地方。周末将暴力法和滑动窗口法都补上。
今日收获
这道题的收获就是又见识到一种方法,滑动窗口法。
59.螺旋矩阵II
题目链接
leetcode.cn/problems/sp…
文章链接
programmercarl.com/0059.%E8%9E…
视频链接
www.bilibili.com/video/BV1SL…
看到题目的第一想法
用纸和笔在草稿纸上画了画,发现规律如下,从二维数组下标来考虑,如果是3x3的矩阵,下标顺序为:(0,0),(0,1),(0,2),(1,2),(2,2),(2,1),(2,0),(1,0),(1,1),我们可以看出先是右下标增加,左下标不变,当加到2时,右下标不变,左下标开始增加,直到加到2,随后左下标又开始减小到0,依次循环往复,但是有一点要注意,之前出现的方格不能重复出现,所以就出现了最后左坐标停留在1,这里我不知道用代码怎么表示。
看完代码随想录之后的想法
没想到这里又涉及到了左闭右开的区间,视频里感觉卡哥和我的想法不一样,周末有时间再来想,前一道题花费了太多的时间,下面附上官方的go语言代码:
func generateMatrix(n int) [][]int {
matrix := make([][]int, n)
for i := range matrix {
matrix[i] = make([]int, n)
}
num := 1
left, right, top, bottom := 0, n-1, 0, n-1
for left <= right && top <= bottom {
for column := left; column <= right; column++ {
matrix[top][column] = num
num++
}
for row := top + 1; row <= bottom; row++ {
matrix[row][right] = num
num++
}
if left < right && top < bottom {
for column := right - 1; column > left; column-- {
matrix[bottom][column] = num
num++
}
for row := bottom; row > top; row-- {
matrix[row][left] = num
num++
}
}
left++
right--
top++
bottom--
}
return matrix
}
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/spiral-matrix-ii/solution/luo-xuan-ju-zhen-ii-by-leetcode-solution-f7fp/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
实现过程中遇到的困难
周末做了再写吧!
今日收获
这道题考得很活,很费脑子!