刷题笔记(数组)-11

Posted 康小庄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题笔记(数组)-11相关的知识,希望对你有一定的参考价值。

有效的数独

题目地址:36. 有效的数独 - 力扣(LeetCode) (leetcode-cn.com)

题目太长,大家自己去官网看题目!

思路:

遍历该 9 x 9 数独 次,以确保:

  • 行中没有重复的数字。
  • 列中没有重复的数字。
  • 3 x 3 子数独内没有重复的数字。
class Solution {
    public boolean isValidSudoku(char[][] board) {
         // 定义三个二维数组
        int[][] rows = new int[9][9];
        int[][] cols = new int[9][9];
        int[][] boxes = new int[9][9];

        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (board[i][j] != '.') {
                    int num = board[i][j] - '1';
                    int index_box = (i / 3) * 3 + j / 3;
                    if (rows[i][num] == 1) {
                        return false;
                    } else {
                        rows[i][num] = 1;
                    }
                    if (cols[j][num] == 1) {
                        return false;
                    } else {
                        cols[j][num] = 1;
                    }
                    if (boxes[index_box][num] == 1) {
                        return false;
                    } else {
                        boxes[index_box][num] = 1;
                    }
                }
            }
        }
        return true;
    }
}

复杂度分析

  • 时间复杂度:O(1),因为我们只对 81 个单元格进行了一次迭代
  • 空间复杂度:O(1)

矩阵置零

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

题目太长,大家自己去官网看题目!

思路

题目意思,为0的那一列和那一行的元素都要为0

  • 先创建两个Set集合,遍历二维数组,遇到为0的元素,在两个集合中分别记录第几行第几列
  • 遍历行元素,如果Set1集合中含有索引,将那一行的元素都置为0
  • 遍历列元素,如果Set2集合中含有索引,将那一列的元素都置为0
  • 最后返回数组!
class Solution {
    public void setZeroes(int[][] matrix) {
        HashSet<Integer> row = new HashSet<>();
        HashSet<Integer> col = new HashSet<>();
        int m = matrix.length;
        int n = matrix[0].length;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    row.add(i);
                    col.add(j);
                }
            }
        }
        for (int i = 0; i < m; i++) {
            if (row.contains(i)){
                for (int j = 0; j < n; j++) {
                    matrix[i][j]=0;
                }
            }
        }
        for (int j = 0; j < n; j++) {
            if (col.contains(j)){
                for (int i = 0; i < m; i++) {
                    matrix[i][j]=0;
                }
            }
        }
    }
}

看了下官方题解,用的布尔数组,记录下这种巧妙的方法

  • 定义两个布尔数组,逐行逐列扫描是否为0的元素
  • 如果元素为0,布尔数组中置为true
  • 再遍历数组,将有0元素的那一行和那一列都置为0
class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        boolean[] row = new boolean[m];
        boolean[] col = new boolean[n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    row[i] = col[j] = true;
                }
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (row[i] || col[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

复杂度分析

  • 时间复杂度:O(mn),其中m是矩阵的行数,n是矩阵的列数。我们至多只需要遍历该矩阵两次。

  • 空间复杂度:O(m+n),其中 m是矩阵的行数,n是矩阵的列数。我们需要分别记录每一行或每一列是否有零出现

最富有的客户的资产总量

题目地址:1672. 最富有客户的资产总量 - 力扣(LeetCode) (leetcode-cn.com)

  • 先存客户的临时资产
  • 最后返回最大的临时资产即可
class Solution {
    public int maximumWealth(int[][] accounts) {
         int max = 0;
        int m = accounts.length;
        int n = accounts[0].length;
        for (int i = 0; i < m; i++) {
            int temp = 0;
            for (int j = 0; j < n; j++) {
                temp += accounts[i][j];
            }
            max=Math.max(max,temp);
        }
        return max;
    }
}

拥有最多糖果的孩子

题目地址:1431. 拥有最多糖果的孩子 - 力扣(LeetCode) (leetcode-cn.com)

思路

  • 遍历看谁最大,最后加上额外数就返回list集合即可
class Solution {
    public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
           // 先定义数组
        ArrayList<Boolean> list = new ArrayList<Boolean>(candies.length);
        int max=0;
        for (int candy : candies) {
            // 看谁最大
            max=Math.max(candy,max);
        }
        for (int candy : candies) {
            list.add(candy+extraCandies>=max);
        }
        return list; 
    }
}

代码均由力扣编译器,提交通过,描述编写不当地方还请大家评论区指出💪!

以上是关于刷题笔记(数组)-11的主要内容,如果未能解决你的问题,请参考以下文章

算法通关手册 刷题笔记2 数组排序之冒泡排序选择排序

[AI助力] 算法通关手册 刷题笔记2 数组排序之冒泡排序选择排序

LeetCode刷题笔记-动态规划-day6

LeetCode刷题笔记-动态规划-day6

LeetCode刷题笔记-动态规划-day6

LeetCode刷题笔记-动态规划-day5