【算法 day02】LeetCode 209.长度最小的子数组 | 59.螺旋矩阵II

209.长度最小的子数组

题目链接:长度最小的子数组

文档讲解:代码随想录文章讲解

视频讲解:代码随想录视频讲解

1.思路:要获取的满足>=target的最小数组长度,使用滑动窗口
1.定义左指针,只有当满足条件的时候才去移动左指针
2.定义总和sum=0,minLength因为要取最小的,所以一开始设置成一个较大的值
3.遍历集合,right充当右指针, sum +nums[right]
4.满足条件的时候,while循环 {计算当滑动窗口的大小,移动左指针, sum-nums[left]}
2.代码:
java 复制代码
public int minSubArrayLen(int target, int[] nums) {
       int minLength=Integer.MAX_VALUE;
        //用于记录做左窗口
        int left=0;
        //记录总的相加和
        int sum=0;
        //充当右指针
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            //使用while,因为会出现即使去掉左窗口后,仍然比target大的情况
            //eg: [1 3 7 1 1] target=7 left=0 right=2,此时窗口内数据有1 3 7,
            //去掉1后仍然大于目标值,所以这里是需要while循环判断的
            while (sum >= target) {
                //记录当前数组的长度
                minLength=Math.min(minLength,i-left+1);
                //减掉左窗口值
                sum-=nums[left];
                //左窗口移动
                left++;
            }
        }
        //当其=Integer的最大值时,说明没有满足条件的,返回0
        return minLength==Integer.MAX_VALUE?0:minLength;
        
    }

59.螺旋矩阵II

题目链接:螺旋矩阵II

文档讲解:代码随想录文章讲解

视频讲解:代码随想录视频讲解

1.思路:
1.循环的次数,我们遍历一次是顺时针遍历,从左到右,从上到下,从右到左,从下到上这样一圈, 一圈是2行,总共是n行,所以说需要遍历的次数是n/2
2.循环中,变量的初始值和最终值,每次循环初始值都是递增的,最终值要明确边界点的获取,严格按照左闭右开[left,right)
3.循环中,明确循数组中行和列哪一个在变化,哪一个保持不变,想不明白写一个二维数组
4.一圈结束后,起始位置 startX++,startY++,圈数circle++,边界值offset++,下次循环时,循环变量初始值是根据初始位置变化的,变量最终值是根据offset递减的 * 5.注意考虑到n是奇数的情况,循环结束后,还有一个中心元素的赋值
复制代码
首先明确二维数组,n是偶数
    i\j j=0     j=1    j=2    j=3
    i=0 [0][0] [0][1] [0][2] [0][3]
    i=1 [1][0] [1][1] [1][2] [1][3]
    i=2 [2][0] [2][1] [2][2] [2][3]
    i=3 [3][0] [3][1] [3][2] [3][3]

首先明确二维数组,n是奇数
    i\j j=0     j=1    j=2
    i=0 [0][0] [0][1] [0][2]
    i=1 [1][0] [1][1] [1][2]
    i=2 [2][0] [2][1] [2][2]
2.代码:
java 复制代码
 public int[][] generateMatrix3(int n) {


        int[][] res=new int[n][n];
        //起始位置
        int startX=0;
        int startY=0;
        //记录每次遍历少遍历的数据个数
        int offset=1;
        //当前循环的圈数
        int circle=1;
        //数组存放的值
        int count=1;
        int i ,j;
        //
        while (circle<=n/2){
            //从左往右遍历
            //1.j 的初始值不能写成0,因为在第一次遍历的时候,j=0,但是在后续遍历时,j的初始值并不是0了,而是随着startY变换的
            //eg 第一圈(0,0),第二圈(1,1)
            //  j 的最终值,遵循作左闭又开原则,列(j)不能取到最右边的元素(以上面的二维数组为例:0 1 2 )
            //2.数组中列(j)的值是一直在变化的,行(x)的值是固定的
            for ( j = startY; j <n-offset ; j++) {
                res[startX][j]=count++;
            }
            //从上往下遍历
            //1.i的初始值,需要跟着startX变,i的最终值,遵循左闭右开原则,行不能取到最下面的值(0 1 2 )
            //2.数列中行(i)是一直在递增的,列(j)是不变的:从左往右遍历后的j
            for ( i = startX; i < n-offset  ; i++) {
                //j是不变的,上面循环的最后值
                res[i][j]=count++;
            }
            //从右向左遍历
            // j不用在定义初始值,j是由上次递增的结果开始递减的,j的最终值,遵循左闭右开原则,不能取到startX
            for ( ; j >startX ; j--) {
                //x是不变的,上面循环的最后值
                res[i][j]=count++;
            }
            //从下往上遍历
            // x不用定义初始值,x是由上次递增的结果开始递减的,x的最终值,遵循左闭右开原则,不能取到startY
            for (;  i>startY ; i--) {
                //j是不变的
                res[i][j]=count++;
            }
            //一层循环遍历结束
            startX++;
            startY++;
            offset++;
            circle++;
        }
        //当是奇数时,中心位置还有一个元素,需要对其进行赋值,
        // eg:n是奇数时(上面二维数组)遍历结束后,中间位置[1,1]还没有被赋值
        if(n%2==1){
            res[startX][startY]=count;
        }
        return  res;
    }

**误区:**一开始把数组的行和列的赋值和数学中的x轴和y轴抓混了,以为行数据是(0,0)

(1,0),导致for循环赋值报错,建议可以写一个例子

for循环的变量的起始值写成了0,虽然第一次循环的时候是正确的,但是在后续循环

中,初始值是不对的

注:这道题细节太多了,后续需要重新刷!!1

相关推荐
优创学社22 分钟前
基于springboot的社区生鲜团购系统
java·spring boot·后端
幽络源小助理9 分钟前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
猴哥源码11 分钟前
基于Java+springboot 的车险理赔信息管理系统
java·spring boot
YuTaoShao1 小时前
【LeetCode 热题 100】48. 旋转图像——转置+水平翻转
java·算法·leetcode·职场和发展
生态遥感监测笔记1 小时前
GEE利用已有土地利用数据选取样本点并进行分类
人工智能·算法·机器学习·分类·数据挖掘
Dcs1 小时前
超强推理不止“大”——手把手教你部署 Mistral Small 3.2 24B 大模型
java
东阳马生架构1 小时前
订单初版—1.分布式订单系统的简要设计文档
java
Tony沈哲2 小时前
macOS 上为 Compose Desktop 构建跨架构图像处理 dylib:OpenCV + libraw + libheif 实践指南
opencv·算法
Code blocks2 小时前
使用Jenkins完成springboot项目快速更新
java·运维·spring boot·后端·jenkins
荔枝吻2 小时前
【沉浸式解决问题】idea开发中mapper类中突然找不到对应实体类
java·intellij-idea·mybatis