力扣打卡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;
            }
        }
        
    }
}
相关推荐
大明者省35 分钟前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
白狐_7982 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2583 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记3 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI3 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型4 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光4 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
叠层归一研究院5 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
zlinear数据采集卡6 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
杨石兴6 小时前
31、玩具MoM:用2x2矩阵串起全套流程
人工智能·算法·矩阵·电磁学