代码随想录算法训练营第二天| 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

74 阅读4分钟

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

实现过程中遇到的困难

周末做了再写吧!

今日收获

这道题考得很活,很费脑子!