力扣打卡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;
            }
        }
        
    }
}
相关推荐
_olone1 分钟前
AtCoder Beginner Contest 465 D - X to Y
c++·算法
青山木5 分钟前
Hot 100 --- LRU 缓存
java·数据结构·算法·leetcode·链表·缓存·哈希
“码”力全开5 分钟前
ONVIF摄像头接入项目实战记录
人工智能·算法·边缘计算
AI科技星33 分钟前
公理化数学化学|48小时确权终稿(完整投产包)
人工智能·数学·算法·重构·拓扑学·乖乖数学·全域数学
想你依然心痛1 小时前
AtomCode在算法竞赛中的实战体验:LeetCode周赛辅助编程
linux·算法·leetcode
SilentSamsara1 小时前
模型部署方案选型:REST/gRPC/批量推理/边缘部署的场景决策
人工智能·深度学习·算法·机器学习
zzz_23681 小时前
【Java实习面试算法冲刺】哈希!
java·算法·面试
大耳朵糊涂1 小时前
找前/后驱节点
算法
孤狼warrior1 小时前
从冒泡到传送带流水线:一个3D沉浸式算法靶场,让思想的伟力改变世界
python·算法·typescript
bu_shuo1 小时前
计算机二级学习-查找和排序
学习·算法·排序算法