刷题笔记(数组)-11

勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

导读:本篇文章讲解 刷题笔记(数组)-11,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

有效的数独

题目地址: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)

WW29tU.png

思路

  • 遍历看谁最大,最后加上额外数就返回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; 
    }
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/140707.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!