代码随想录——第二天

--------------------------------------------------209.长度最小的子数组------------------------------------------------------------------------------------题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。  拓展题目可以先不做。

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/

文章讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html

视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE

暴力解法和滑动窗口对应

暴力解法先确定起始位置的循环 滑动窗口确定结束位置的循环

错误解法

class Solution {

    public int minSubArrayLen(int target, int[] nums) {

        int slow = 0, sum = 0;

        int minSubL = nums.length;

        for(int fast = 0; fast < nums.length; fast ++){

            //fast的范围

            sum += nums[fast];

            if(sum >= target){

                while(sum - nums[slow] >= target){

                    slow ++;

                }

                int subL = fast - slow + 1;

                minSubL = Math.min(minSubL, subL);

            }

        }

        if(minSubL == nums.length){

            return 0;

        }else{

            return minSubL;

        }

    }

}

问题:未更新sum,而且无论如何找到了 slow都应该往前走

class Solution {

    public int minSubArrayLen(int target, int[] nums) {

        int slow = 0, sum = 0;

        int minSubL = nums.length;

        for(int fast = 0; fast < nums.length; fast ++){

            //fast的范围

            sum += nums[fast];

            while(sum >= target){

                int subL = fast - slow + 1;

                minSubL = Math.min(minSubL, subL);

                sum = sum - nums[slow];

                slow ++;

            }

        }

        if(minSubL == nums.length){

            return 0;

        }else{

            return minSubL;

        }

    }

}

错误实例:

target =

15

nums =

[1,2,3,4,5]

添加到测试用例

输出

0

预期结果

5

原因:  不够大int minSubL = nums.length;加一

更改结果:

class Solution {

    public int minSubArrayLen(int target, int[] nums) {

        int slow = 0, sum = 0;

        int minSubL = nums.length + 1;

        for(int fast = 0; fast < nums.length; fast ++){

            //fast的范围

            sum += nums[fast];

            while(sum >= target){

                int subL = fast - slow + 1;

                minSubL = Math.min(minSubL, subL);

                sum = sum - nums[slow];

                slow ++;

            }

        }

        if(minSubL == nums.length+1){

            return 0;

        }else{

            return minSubL;

        }

    }

}

注意时间复杂度 每个元素进来时被操作一次 出去被操作一次 所以是O(2*N)即O(N)

-------------------------------------------------------------------59.螺旋矩阵II------------------------------------------------------------------------------

题目建议:  本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。

题目链接:https://leetcoxde.cn/problems/spiral-matrix-ii/

文章讲解:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html

视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/


注意 i 和 j有记录作用 定义在循环外 注意开区间

class Solution {

    public int[][] generateMatrix(int n) {

        int startx = 0, starty = 0;

        int count = 1, offset =1;

        int i, j, q =0;

        int[][] reslut = new int[n][n];//初始化写法 动态

        while(q < n/2){

            for(j = starty; j < n - offset; j ++){

                reslut[startx][j] = count++;

            }

            for(i = startx; i < n - offset; i ++){

                reslut[i][j] = count++;

            }

            for(; j > 0; j --){

                reslut[i][j] = count++;

            }

            for(; i > 0; i --){

                reslut[i][j] = count++;

            }

        }

        if (n % 2 != 0) {

            reslut[n/2][n/2] = count++;

        }

        return reslut;

    }

}

改进一:

class Solution {

    public int[][] generateMatrix(int n) {

        int startx = 0, starty = 0;

        int count = 1, offset =1;

        int i, j, q =0;

        int[][] reslut = new int[n][n];

        while(q < n/2){

            for(j = starty; j < n - offset; j ++){

                reslut[startx][j] = count++;

            }

            for(i = startx; i < n - offset; i ++){

                reslut[i][j] = count++;

            }

            for(; j > startx; j --){

                reslut[i][j] = count++;

            }

            for(; i > starty; i --){

                reslut[i][j] = count++;

            }

            startx ++;

            starty ++;

        }

        if (n % 2 != 0) {

            reslut[n/2][n/2] = count++;

        }

        return reslut;

    }

}

改进2:

class Solution {

    public int[][] generateMatrix(int n) {

        int startx = 0, starty = 0;

        int count = 1, offset =1;

        int i, j, q =0;

        int[][] reslut = new int[n][n];

        while(q < n/2){

            for(j = starty; j < n - offset; j ++){

                reslut[startx][j] = count++;

            }

            for(i = startx; i < n - offset; i ++){

                reslut[i][j] = count++;

            }

            for(; j > starty; j --){

                reslut[i][j] = count++;

            }

            for(; i > startx; i --){

                reslut[i][j] = count++;

            }

            startx ++;

            starty ++;

            offset ++;

        }

        if (n % 2 != 0) {

            reslut[n/2][n/2] = count++;

        }

        return reslut;

    }

}

改进3:

q ++;

正确版本:

class Solution {

    public int[][] generateMatrix(int n) {

        int startx = 0, starty = 0;

        int count = 1, offset =1;

        int i, j, q =0;

        int[][] reslut = new int[n][n];

        while(q < n/2){

            for(j = starty; j < n - offset; j ++){

                reslut[startx][j] = count++;

            }

            for(i = startx; i < n - offset; i ++){

                reslut[i][j] = count++;

            }

            for(; j > starty; j --){

                reslut[i][j] = count++;

            }

            for(; i > startx; i --){

                reslut[i][j] = count++;

            }

            startx ++;

            starty ++;

            offset ++;

            q ++;

        }

        if (n % 2 != 0) {

            reslut[n/2][n/2] = count++;

        }

        return reslut;

    }

}

区间和

前缀和是一种思维巧妙很实用 而且 很有容易理解的一种算法思想,大家可以体会一下

文章讲解:https://www.programmercarl.com/kamacoder/0058.%E5%8C%BA%E9%97%B4%E5%92%8C.html

开发商购买土地

https://www.programmercarl.com/kamacoder/0044.%E5%BC%80%E5%8F%91%E5%95%86%E8%B4%AD%E4%B9%B0%E5%9C%9F%E5%9C%B0.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,313评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,369评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,916评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,333评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,425评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,481评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,491评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,268评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,719评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,004评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,179评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,832评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,510评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,153评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,402评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,045评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,071评论 2 352

推荐阅读更多精彩内容