力扣打卡day09——缺失的第一个正数、矩阵置零

41. 缺失的第一个正数 - 力扣(LeetCode)

思路:

/**

创建一个标记数组

把出现过的正数标记为 1

找第一个没标记(0)的位置

返回它对应的数字

*/

复制代码
class Solution {
    public int firstMissingPositive(int[] nums) {
        /**
        创建一个标记数组
        把出现过的正数标记为 1
        找第一个没标记(0)的位置
        返回它对应的数字
         */
         int n=nums.length;
         if(n==0) return 1;
         int number[]=new int[n];

         for(int i=0;i<n;i++){
            //结果的数据只能在1~n+1里面, 大于n 的没必要看了
            if(nums[i]>0 && nums[i]<=n){
                number[nums[i]-1]=1;// 把出现过的正数标记为 1
            }
         }
         //找第一个没标记(0)的位置
         for(int i=0;i<n;i++){
            if(number[i]==0){
                return i+1;
            }
         }
         //数组都满了,结果就是n+1
         return n+1;  
    }
}

/** 
     直接暴力解法
**/
class Solution {
    public int firstMissingPositive(int[] nums) {
        Set<Integer> set=new HashSet<Integer>();
        for(int i=0;i<nums.length;i++){
            set.add(nums[i]);
        }
        int i=1;
        while(set.contains(i)){
            i++;
        }
        return i;
    }
}

73. 矩阵置零 - 力扣(LeetCode)

思路:

思路一: 用 O(m+n)额外空间

两遍扫matrix,第一遍用集合记录哪些行,哪些列有0;第二遍置0

复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
       Set<Integer> row_set=new HashSet<>();
       Set<Integer> col_set=new HashSet<>();;
       int row=matrix.length;
       int col=matrix[0].length;
       for(int i=0;i<row;i++){
        for(int j=0;j<col;j++){
            if(matrix[i][j]==0){
                row_set.add(i);
                col_set.add(j);
            }
        }
       }
       //将行列置为0
       for(int i=0;i<row;i++){
        for(int j=0;j<col;j++){
            if(row_set.contains(i) || col_set.contains(j)){
                 matrix[i][j]=0;
            }
        }
    }
}
}

思路二: 用O(1)空间

关键思想: 用matrix第一行和第一列记录该行该列是否有0,作为标志位

但是对于第一行,和第一列要设置一个标志位,为了防止自己这一行(一列)也有0的情况.注释写在代码里,直接看代码很好理解!

复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int row_len=matrix.length;
        int col_len=matrix[0].length;
        boolean row_flag=false;
        boolean col_flag=false;

        //记录第一行是否有0
        for(int j=0;j<col_len;j++){
            if(matrix[0][j]==0){
                row_flag=true;
                break;
            }
        }
        //记录第一列是否有0
        for(int j=0;j<row_len;j++){
            if(matrix[j][0]==0){
                col_flag=true;
                break;
            }
        }
        //进行标志位的计算
        for(int i=1;i<row_len;i++){
            for(int j=1;j<col_len;j++){
                if(matrix[i][j]==0){
                    matrix[0][j]=matrix[i][0]=0;
                }
            }
        }
        //进行放置0
        for(int i=1;i<row_len;i++){
            for(int j=1;j<col_len;j++){
                if(matrix[i][0]==0 || matrix[0][j]==0){
                    matrix[i][j]=0;
                }
            }
        }
         
        if(row_flag){
            for(int j=0;j<col_len;j++){
                 matrix[0][j]=0;
            }
        }
        if(col_flag){
            for(int i=0;i<row_len;i++){
                matrix[i][0]=0;
            }
        }
        
    }
}
相关推荐
机器人零零壹2 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
ZhengEnCi4 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
取名真是5 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考6 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
nm_zfyjt8 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
w_zero_one9 小时前
算法--构造
java·数据结构·算法
其实防守也摸鱼9 小时前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php
小超人诞生日记11 小时前
C++ 智能指针的使用及其原理详解
c++·算法
lisw0512 小时前
互联网上的数据结构可视化!
数据结构·信息可视化