• leetcode每天5题-Day10



    落下了day07、day08、day09…
    完了…过了12点了…到day11了

    1.矩阵置零

    leetcode73. 矩阵置零-中等
    题目:给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。
    请使用原地算法。
    了解原地算法
    ①使用标记数组
    用两个标记数组分别记录每一行和每一列是否有零出现
    (1).首先遍历该数组一次,如果某个元素0,那么就将该元素所在的行和列所对应标记数组的位置置为 true
    (2).最后再次遍历该数组,用标记数组更新原数组

    var setZeroes = function(matrix) {
        const m = matrix.length,n = matrix[0].length;
        const clo=new Array(n).fill(false);
        const row=new Array(m).fill(false);
        for(let i=0;i<m;i++){
            for(let j=0;j<n;j++){
                if(matrix[i][j]==0){
                    clo[j]=true;
                    row[i]=true;
                }
            }
        }
    
        for(let i=0;i<m;i++){
            for(let j=0;j<n;j++){
                if(row[i]||clo[j]){
                    matrix[i][j]=0;
                }
            }
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    注:标记数组标记的是整行/整列,若某一行/列为0,则标记数组的整行/整列都被标记为true
    时间复杂度:O(mn)O(mn),其中 mm 是矩阵的行数,nn 是矩阵的列数。我们至多只需要遍历该矩阵两次。

    空间复杂度:O(m+n)O(m+n),其中 mm 是矩阵的行数,nn 是矩阵的列数。我们需要分别记录每一行或每一列是否有零出现。
    ②使用两个标记变量

    var setZeroes = function(matrix) {
        const m = matrix.length,n = matrix[0].length;
        let col=false;
        let row=false;
    
        // 若第一列有0  把clo置true
        for(let i=0;i<m;i++){
            if(matrix[i][0]==0){
                col=true;
            }
        }
    
        // 若第一行有0  把row置true
        for(let j=0;j<n;j++){
            if(matrix[0][j]==0){
                row=true;
            }
        }
    
        for(let i=1;i<m;i++){
            for(let j=1;j<n;j++){
                if(matrix[i][j]==0){
                    matrix[i][0]=matrix[0][j]=0;
                }
            }
        }
    
        // 对于除去第一行和第一列的剩余矩阵  若对应的第一行/列有0 则把其对应的某行/列置0
        for(let i=1;i<m;i++){
            for(let j=1;j<n;j++){
                if(matrix[i][0]==0||matrix[0][j]==0){
                    matrix[i][j]=0;
                }
            }
        }
    
        if(col){
            for(let i=0;i<m;i++){
                matrix[i][0]=0;
            }
        }
    
        if(row){
            for(let j=0;j<n;j++){
                matrix[0][j]=0;
            }
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    个人感觉这个方法好难理解啊,下面👇这个双重for循环想好一会儿才恍然大明白....

    for(let i=1;i<m;i++){
            for(let j=1;j<n;j++){
                if(matrix[i][0]==0||matrix[0][j]==0){
                    matrix[i][j]=0;
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    时间复杂度:O(mn),其中m是矩阵的行数,n是矩阵的列数。我们至多只需要遍历该矩阵两次。
    空间复杂度:O(1),我们只需要常数空间存储若干变量。
    ③使用一个标记变量

    2.合并区间

    leetcode56. 合并区间-中等
    题目:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
    ①排序
    将列表中的区间按照左端点升序排序

    3.求数列的和

    数列定义: 数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和
    输入描述: 输入数据有多组,每组占一行,由两个整数n(n<10000)m(m<1000)组成。
    n和m的含义如前所述
    输出描述: 对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数

    var m;
    var sum,n;
    var sc
    
    while(sc = read_line()){
    	var arr = sc.split(' ');
      n=parseInt(arr[0]);
      m=parseInt(arr[1]);
      sum=0;
      for(var i=0;i<m;i++){
          sum=sum+n;
          n=Math.sqrt(n);
      }
      print(sum.toFixed(2));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4.水仙花数

    定义: 指一个三位数,它的各位数字的立方和等于其本身。现在要求输出所有在m和n范围内的水仙花数
    输入描述: 输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)
    输出描述: 对于每个测试实例,要求输出所有在给定范围内的水仙花数,如果给定范围内不存在水仙花数,则输出no;每个测试实例的输出占一行

    var sc;
    while(sc = read_line()){
        var arr = sc.split(' ');
        n=parseInt(arr[1]);
        m=parseInt(arr[0]);
        if(100<=m&&m<=n&&n<=999){
            var out = [];
            var j=0;
            for(var i=m;i<=n;i++)
            {
                var geWei,shiWei,baiWei;
                baiWei=parseInt(i/100);
                shiWei=parseInt((i-baiWei*100)/10);
                geWei=i-baiWei*100-shiWei*10;
                if(i==geWei*geWei*geWei+shiWei*shiWei*shiWei+baiWei*baiWei*baiWei)
                {
                    j=j+1;
                    if(j>1){
                        out.push(" "+i);
                    }
                    else{
                        out.push(i);
                    }
                }
            }
            if(j==0){
                out.push("no");
            }
            print(out.join(''));
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    5.蓄水

    leetcode-LCP 33. 蓄水-简单
    题目:

    刚看完题的我:这是简单题???
    ①贪心+堆排序
    ②枚举+贪心
    ③枚举+计数

  • 相关阅读:
    IT基础英语
    Kubernetes 可视化管理工具Kuboard V3
    操作系统:文件IO
    【el-table 可实现分页勾选数据】
    基于PSO的UAV三维路径规划(Matlab代码实现)
    Python一键下载视频脚本分享
    [正式学习java③]——字符串在内存中的存储方式、为什么字符串不可变、字符串的拼接原理,键盘录入的小细节。
    浅谈智能型电动机控制器在斯里兰卡电厂中的应用
    EFK架构部署
    C++ 性能优化指南 KurtGuntheroth 第7章 优化热点语句 摘录
  • 原文地址:https://blog.csdn.net/weixin_44286392/article/details/126198422