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

@[TOC] 代码随想录算法训练营第二天打卡

题目链接
双指针: 977.有序数组的平方
滑动窗口: 209.长度最小的子数组
模拟:59.螺旋矩阵II
攻略链接
代码随想录

双指针

977.有序数组的平方
没什么好说的,
另外开辟了一个数组内存result,通过相向遍历,将最大的数依次存入新数组的后端

func sortedSquares(nums []int) []int {
    result := make([]int, len(nums))
    left, right := 0, len(nums) - 1
    index := len(result) - 1
    for left <= right {
        if -nums[left] < nums[right] {
            result[index] = nums[right] * nums[right]
            index -- 
            right --
        }else {
            result[index] = nums[left] * nums[left]
            index --
            left ++
        }
    }
    return result
}

滑动窗口

滑动窗口: 209.长度最小的子数组

跟双指针差不多,
首先左指针待命,先用右指针滑动数组,满足条件后再滑动左指针,依次滑动直到结束

func minSubArrayLen(target int, nums []int) int {
    left := 0   // 左指针待命
    sums := 0
    minLength := len(nums) + 1
    // 右指针向右滑动
    for right := 0; right < len(nums); right++{
        sums = sums + nums[right]  //滑动相加
        for sums >= target {
            length := right - left + 1  
            if length < minLength {
                minLength = length
            }
            sums -= nums[left]
            left++
        } 
    }


    if minLength == len(nums) + 1 {
        return 0
    }else {
        return minLength
    }
}

  • 两个for循环分别滑动两个指针,先滑动右指针出去寻找食物,左指针在家待命;找到以后左指针再出去,一步一步,小心翼翼;
  • minLength最小长度初始值一定要设置比数组长度大的数值,否则在return 0时,会返回数组长度导致运行出错;
  • 后续在初始化某个值时,不要吝啬,不舍得给值,有多大就给多大!有多小就给多小!

模拟

59.螺旋矩阵II
此题没有什么算法含量,就是单纯写逻辑的过程,但是属于哪种一写就废,一看就会的典型题目。说明对代码的掌控力度不足。

考验对代码的掌控力以及逻辑思维能力

func generateMatrix(n int) [][]int {
    left, right := 0, n - 1
    up, down := 0, n - 1
    v := 1
    res := make([][]int, n)
    for i := 0 ; i < n; i ++ {
        res[i] = make([]int, n)
    }
    for v <= n * n {
        // 循环内嵌套四个循环,从上到下依次执行
        for i := left; i <= right; i++ {
            res[up][i] = v  // 注意行索引始终都是up等定义的四个值,然后遍历另一个维度赋值
            v++
        }
        up++    //注意第up行赋值结束后,up+1
        // 对最右侧列的所有行赋值
        for i := up; i <= down; i++ {
            res[i][right] = v
            v++
        }
        right--
        // 最下行
        for i := right; i >= left; i-- {
            res[down][i] = v
            v++
        }
        down--

        for i := down; i >= up; i-- {
            res[i][left] = v
            v++
        }
        left++ 
    }
    return res
}

  • 注意golang是如何开辟一个二维矩阵的!
  • 外层for循环内,又开辟了四个for循环,按顺序依次执行
  • 一开始用的if判定边界条件,但是非常麻烦,且时间不够充裕,就不完善了,直接引用攻略的写法吧。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值