算法题(普通数组、矩阵)

一、题目

1、除自身以外数组的乘积(LC 238)

2、缺失的第一个正数(LC 41)

3、矩阵置零(LC 73)

二、题解

1、除自身以外数组的乘积(LC 238)

(1)分析

如果使用除法,可以先计算数组中元素为零的个数,再计算除了零以外其他元素的总乘积。当零的个数大于等于二,返回的数组answer中元素都为零;当零的个数等于一,answer中只有对应下标的元素等于乘积,answer中其余元素都都为零;当没有零,answer中每个元素都等于总乘积除以对应下标的nums元素。

不使用除法,可以用动态规划的方法解决。先计算每个元素左侧所有元素的乘积,再计算每个元素右侧所有元素的乘积,每个元素对应的两个乘积相乘,结果就是answer对应位置的元素。

(2)解答

java 复制代码
class Solution {
    public int[] productExceptSelf(int[] nums) {
        int[] ans = new int [nums.length];
        ans[0] = 1;
        int temp = 1;

        for(int i = 1; i<nums.length; i++){
            ans[i] = ans[i-1]*nums[i-1];
        }
        for(int i = nums.length-2; i>=0; i--){
            temp = nums[i+1] * temp;
            ans[i] = ans[i] * temp;

        }
        return ans;
    }
}

2、缺失的第一个正数(LC 41)

(1)分析

本题使用原地哈希的方法解决。因为所求的是数组中没出现的最小正整数,可以将元素n放到下标为n-1的位置,如数组1,2,0,把元素1放在nums0,把元素2放在nums1,这样,这个数组中没出现的最小正整数,就是最先没出出现在对应位置的那个整数。如1,2,0,下标为2的位置应该是3,但是是0不是3,那么3就是数组中没出现的最小正整数。

把每个符合条件的元素放在对应位置上,遍历过程中需要加一条判断numsi!=numsnums\[i - 1],防止因为重复元素导致出现死循环。

(2)解答

java 复制代码
class Solution {
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        for(int i = 0; i<n; i++){
            while(nums[i]>=1 && nums[i]<=n && nums[i]!=nums[nums[i] - 1]){
                swap(nums, nums[i] - 1, i);

            }
        }
        for(int i=1; i<=n; i++){
            if(i != nums[i-1]){
                return i;
            }
        }
        return n+1;
        
    }
    public void swap(int[] nums ,int index1, int index2){
        int temp = nums[index1];
        nums[index1] = nums[index2];
        nums[index2] = temp;

    }
}

3、矩阵置零(LC 73)

(1)分析

遍历数组中每个元素,当某个元素为0,将该元素所在行和所在列的第一个元素设为0,然后根据第一行的元素和第一列的元素来决定是否设为0。但是有弊端,如果第一行都为1,第一列有0,那么就会把第一个元素matrix00设为0,会导致置零时将第一列都置为零。所以第一行第一列的元素要单独考虑,用两个变量来表示第一行、第一列是否含有零。先考虑其他行和列,最后根据这两个变量决定第一行和第一列是否需要指令。时间复杂度为O(mn),空间复杂度为O(1)。

(2)解答

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        boolean firstRowHasZero = false;
        for(int x : matrix[0]){
            if(x == 0){
            firstRowHasZero = true;
            break;

            }
        }
        boolean firstColHasZero = false;
        for(int i = 0; i<m; i++){
            if(matrix[i][0] == 0){
            firstColHasZero = true;
            break;
            }
        }
        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++){
                if(matrix[i][j] == 0){
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }

        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++){
                if(matrix[i][0] == 0 || matrix[0][j] == 0){
                    matrix[i][j] = 0;
                }
            }
        }

        if(firstRowHasZero){
            for(int i = 0; i < n; i++){
                matrix[0][i] = 0;
            }
        }
        if(firstColHasZero){
            for(int i = 0; i < m; i++){
                matrix[i][0] = 0;
            }
        }
        
    }
}
相关推荐
lqqjuly7 分钟前
知识蒸馏:理论、算法与可运行实现
人工智能·深度学习·算法
水上冰石16 分钟前
comfui的sd1.5模型,有多少采样算法,详解每一个采样算法
人工智能·算法
2601_9578848432 分钟前
AI赋能的内容工程学:短视频矩阵系统的多模态内容生成与量产边界
人工智能·矩阵·音视频
黎阳之光34 分钟前
视频孪生+空天地水工融合,黎阳之光构建智慧水利监测新范式
大数据·人工智能·物联网·算法·安全
cheems95271 小时前
[算法手记] 贪心 爬楼梯问题
算法·贪心算法
KaMeidebaby1 小时前
卡梅德生物技术快报|酵母双杂交 cDNA 文库构建与蛋白互作筛选流程
服务器·前端·数据库·人工智能·算法
sheeta19981 小时前
LeetCode 每日一题笔记 日期:2026.05.27 题目:3121. 统计特殊字母的数量 II
笔记·算法·leetcode
ST——Jess1 小时前
年度行业趋势研究报告:泛心理数字化赛道“流日推演”的算法困境与高保真交互范式重构
人工智能·算法·架构
Tisfy1 小时前
LeetCode 3300.替换为数位和以后的最小元素:一次遍历
数学·算法·leetcode·模拟
garmin Chen1 小时前
LeetcodeHot100打卡(14、合并空间,15、轮转数组,16、除了自身以外数组乘积,17.缺失的第一个整数)
java·笔记·学习·算法