力扣打卡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;
            }
        }
        
    }
}
相关推荐
2301_818419012 小时前
C++中的状态模式实战
开发语言·c++·算法
仰泳的熊猫2 小时前
题目2576:蓝桥杯2020年第十一届省赛真题-解码
数据结构·c++·算法·蓝桥杯
CSDN_kada2 小时前
杭电网安复试编程Day23
c++·考研·算法
灰色小旋风2 小时前
力扣16 最接近的三数之和(C++)
数据结构·c++·算法·leetcode
FMRbpm2 小时前
前缀和与差分:总结与梳理
算法·前缀和·差分
前端达人2 小时前
第 4 篇:内容即数据——frontmatter 规范、数据结构与构建链路的工程化设计
大数据·数据结构
Tisfy2 小时前
LeetCode 3643.垂直翻转子矩阵:原地修改
算法·leetcode·矩阵·模拟
噜啦噜啦嘞好2 小时前
算法篇:滑动窗口
数据结构·算法
无限进步_2 小时前
【C++】单词反转算法详解:原地操作与边界处理
java·开发语言·c++·git·算法·github·visual studio