谈两道LeetCode——跳跃游戏,矩阵置零

标题说明了一切,话不多说,开始正文吧!


跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例 2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jump-game

题目分析与解题

一开始看错题目了,以为数组中的元素就表示当前跳跃的固定距离了,结果发现写错了。。。
后来发现是最大长度。
其实解法有很多了,很多大佬给出了各式各样的解题思路,让人叹为观止,这里介绍一种比较简单的方法吧

需要注意到:
当我们到达一个地方时i,下一步可以到达的最远的地方是i+nums[i]。
同时需要注意的是,并不是跳得越远就可以到达终点的(这里的意思是,不能当到达某一点后就以当前点可到的最大长度进行下一次跳跃)。
下一步最远可以到达的最远地方i+nums[i]之前的点都是可达的。
在正确的路径下,到达终点前的一个点i,有i+nums[i] >= nums.size()-1,返回true。
在没有正确的路径下,最后一个可以到达的点,有i+nums[i] < nums.size()-1,返回false。

在进行一番分析后,我们大致有了思路,虽然要注意的东西有很多,但是程序可以多多精简一些
程序如下:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int index=0;
        for(int i=0;i<nums.size();i++){
            if(i>index)
                return false;
            if(index>=nums.size()-1)
                return true;
            index=max(index,i+nums[i]);
        }
        return true;
    }
};

结果如下:

图片.png
图片.png

值得说明的是
index=max(index,i+nums[i]);
始终表示可以到达的最大位置,同时在此之前的位置都是可达的
直到到达的位置大于终点

这个提交的结果还不错

下一题!!!

矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。

示例 1:

输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]

示例 2:

输入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
输出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]

进阶:

一个直接的解决方案是使用  O(mn) 的额外空间,但这并不是一个好的解决方案。
一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
你能想出一个常数空间的解决方案吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/set-matrix-zeroes

题目分析与解题

鉴于进阶处的提示,不妨就使用常数空间来解决吧

个人觉得,本题很重要的一点应该是标志位了,使用O(mn)或者O(m + n)来做都不难,用常数空间来解决,还是有不少需要注意的地方

这里介绍下本人的思路吧

应该需要先遍历一遍矩阵,记住那些行列是需要置零的,绝对不是边扫描边置零的

行列都需要标志,而我们却只使用常数空间,用什么来标志呢?

当然是矩阵的原有空间啦,那放在哪呢?

为了不影响遍历,我们可以使用第一行,第一列,如何标志呢?

遍历的时候,如果某一个元素 matrix[i][j] 为0,那么 matrix[i][0],matrix[0][j]赋值为0,在遍历为完成后,扫描第一行,将为0的元素所在的所有列置零。扫描第一列时,将为0的元素所在的所有行置零。那这样似乎就大功告成了,是吗?

不是,还有坑呢,试想下,这个方法确实很好,但是,对矩阵所有元素都是可以的吗?不是,我们用第一行,列作为标志位,对除第一行,列的所有元素都能处理,但是,第一行,列有0的元素,那么它所在的行,列是不是忘了置零呢?

那么我们可以额外设置两个标志位来标志第一行,列是否含有0元素,如果有,第一行的所有元素都要置零,第一列也是如此

经过上面这些理性分析(胡乱分析),这个题基本上差不多了,虽然题不算难,但是在常数空间下完成,需要注意的东西还是有不少的。

程序如下:

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int lines=matrix.size();
        int lists=matrix[0].size();
        bool line=false;
        bool list=false;
        for(int i=0;i<lines;i++){
            for(int j=0;j<lists;j++){
                if(matrix[i][j]==0&&i!=0&&j!=0){
                    matrix[0][j]=0;
                    matrix[i][0]=0;
                }
                if(i==0&&matrix[0][j]==0){
                    line=true;
                }
                if(j==0&&matrix[i][0]==0){
                    list=true;
                }
            }
        }
        //将第1至最后一列含0的列所在的行赋值为0
        //若这些列有0,行置零
        for(int j=1;j<lists;j++){
            if(matrix[0][j]==0){
                for(int i=0;i<lines;i++){
                    matrix[i][j]=0;
                }
            }
        }
        //将第1至最后一行含0的列所在的行赋值为0
        //若这些行有0,列置零
        for(int i=1;i<lines;i++){
            if(matrix[i][0]==0){
                for(int j=0;j<lists;j++){
                    matrix[i][j]=0;
                }
            }
        }
        if(line){
            for(int j=0;j<lists;j++){
                matrix[0][j]=0;
            }
        }
        if(list){
            for(int i=0;i<lines;i++){
                matrix[i][0]=0;
            }
        }
    }
};

结果如下:

图片.png
图片.png

提交结果还算不错

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

推荐阅读更多精彩内容