刷题笔记(数组)-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的主要内容,如果未能解决你的问题,请参考以下文章