数组篇一

数组

48. 旋转图像 - 力扣(LeetCode)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public void rotate(int[][] matrix) {
int m = matrix.length;
int[][] tmp = new int[m][m];
for(int i = 0; i < m; i++){
for(int j = 0; j < m; j++){
tmp[j][m - i - 1] = matrix[i][j];
}
}
for(int i = 0; i < m; i++){
for(int j = 0; j < m; j++){
matrix[i][j] = tmp[i][j];
}
}

}
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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] = true;
col[j] = true;
}
}
}
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(col[j] == true || row[i] == true) matrix[i][j] = 0;
}
}
}
}

289. 生命游戏 - 力扣(LeetCode)

  • 使用.clone只是对于数组进行了浅拷贝,意思就是,修改到原数组仍然会影响到复制后的数组

对于此题目,我本来想着使用.clone方法直接拷贝一份原数组,然后进行之后的操作发现我修改了复制之后的数组原数组也会跟着改变,这也算是学到了一些吧~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public void gameOfLife(int[][] board) {
int m = board.length;
int n = board[0].length;
int[][] cp = new int[m][n];
int[] neighbours = {-1,0,1};
for(int i = 0; i < m; i++){
System.arraycopy(board[i], 0, cp[i], 0, n);
}

for(int i = 0; i < m; i++){
for (int j = 0; j < n; j++){
//统计每个细胞周围的活细胞
//因为每次统计之后会修改原数组,所以需要复制一份原数组
int live_body = 0;
for (int k = 0; k < 3; k++) {
for (int l = 0; l < 3; l++){
//防止统计到自己
if(!(neighbours[k] == 0 && neighbours[l] == 0)){
int r = i + neighbours[k];
int c = j + neighbours[l];
if ((r >= 0 && r < m) && (c >= 0 && c < n) && cp[r][c] == 1){
live_body ++;
}
}
}
}
if(cp[i][j] == 1 && (live_body < 2 || live_body > 3)) board[i][j] = 0;
if(cp[i][j] == 0 && (live_body == 3)) board[i][j] = 1;
}
}
}
}

661. 图片平滑器 - 力扣(LeetCode)

求周围平均值的模板模拟题类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public int[][] imageSmoother(int[][] img) {
int m = img.length;
int n = img[0].length;
int[][] ans = new int[m][n];
int[] neighbours = {-1, 0, 1};
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {

int avg = 0;//统计每次的平均值
int numbers = 0;
for (int k = 0; k < 3; k++) {
for (int l = 0; l < 3; l++) {
int r = i + neighbours[k];
int c = j + neighbours[l];
if((r >= 0 && r < m) && (c >= 0 && c < n)){
avg += img[r][c];
numbers++;
}
}
}
ans[i][j] = avg/numbers;
}
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public int[][] imageSmoother(int[][] img) {
int m = img.length;
int n = img[0].length;
int[][] ans = new int[m][n];
for(int i = 0; i <= m - 1; i++){
for(int j = 0; j <= n - 1; j++){
ans[i][j] = count(i, j, img);
}
}
return ans;

}
public int count(int a, int b, int[][] img){
int m = img.length;
int n = img[0].length;
int sum = 0, number = 0;
int x = 0, y = 0;
for(int i = -1; i <= 1; i++){
for(int j = -1; j<= 1; j++){
x = a + i;
y = b + j;
if(x >= 0 && x < m && y >= 0 && y < n){
sum += img[x][y];
number++;
}
}
}
return sum/number;
}
}

598. 区间加法 II - 力扣(LeetCode)

1
2
3
4
5
6
7
8
9
class Solution {
public int maxCount(int m, int n, int[][] ops) {
for(int[] op : ops){
m = Math.min(m, op[0]);
n = Math.min(n, op[1]);
}
return m*n;
}
}

419. 甲板上的战舰 - 力扣(LeetCode)

横着或者竖着相连的 ‘X’ 的【一组】代表同一艘战舰。

水平战舰:如果一行中有连续的 ‘X’,它们构成了一艘战舰。

垂直战舰:如果一列中有连续的 ‘X’,它们也构成了一艘战舰。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public int countBattleships(char[][] board) {
int m = board.length, n = board[0].length;
int ans = 0;
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(i > 0 && board[i - 1][j] == 'X') continue;
if(j > 0 && board[i][j - 1] == 'X') continue;
if(board[i][j] == 'X') ans++;
}
}
return ans;
}
}

189. 轮转数组 - 力扣(LeetCode)

1
2
3
4
5
6
7
8
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
int[] newArr = new int[n];
for(int i = 0; i < n; i++) newArr[(i + k) % n] = nums[i];
System.arraycopy(newArr, 0, nums, 0, n);
}
}

396. 旋转函数 - 力扣(LeetCode)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public int maxRotateFunction(int[] nums) {
int n = nums.length;
int[] sum = new int[2*n + 1];
for(int i = 1; i <= 2*n; i++) sum[i] = sum[i - 1] + nums[(i - 1)%n];
int ans = 0;
for(int i = 0; i < n; i++) ans += i*nums[i];
int tmp = ans;
for(int i = n + 1; i <= 2*n; i++){
tmp += nums[(i - 1) % n]*(n - 1);
//这里其实就是减去了一个前缀和
tmp = tmp - (sum[i - 1] - sum[i - n]);
ans = Math.max(ans, tmp);
}
return ans;
}
}

数组篇一
http://example.com/2024/01/29/arr1/
作者
nianjx
发布于
2024年1月29日
许可协议