59. 螺旋矩阵 II
题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)
难度:中等
解题思路:left、right、row、col分别是当前顺时针填充的左边界,右边界、上边界、下边界。
代码:
class Solution {
public int[][] generateMatrix(int n) {
int left = 0, right = n - 1, row = 0, col = n - 1;
int[][] ans = new int[n][n];
int num = 1;
while(num <= n*n){
for(int i = left; i <= right; i++) ans[row][i] = num++;
row++;
for(int i = row; i <= col; i++) ans[i][right] = num++;
right--;
for(int i = right; i >= left; i--) ans[col][i] = num++;
col--;
for(int i = col; i >= row; i--) ans[i][left] = num++;
left++;
}
return ans;
}
}
58. 区间和(卡玛网)
题目链接:58. 区间和(第九期模拟笔试) (kamacoder.com)
解题思路:计算数组每个位置上的元素与之前元素的总和,得到新的数组,得到某个区间的位置,只需减去左区间位置之前的元素和。
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] vec = new int[n];
int[] p = new int[n];
int presum = 0;
for (int i = 0; i < n; i++) {
vec[i] = scanner.nextInt();
presum += vec[i];
p[i] = presum;
}
while (scanner.hasNextInt()) {
int a = scanner.nextInt();
int b = scanner.nextInt();
int sum;
if (a == 0) {
sum = p[b];
} else {
sum = p[b] - p[a - 1];
}
System.out.println(sum);
}
scanner.close();
}
}
44. 开发商购买土地
题目链接:44. 开发商购买土地(第五期模拟笔试) (kamacoder.com)
解题思路:暴力求解,计算总和,行和,列和,然后比较横切竖切差值最小
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int sum = 0;
int[][] vec = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
vec[i][j] = scanner.nextInt();
sum += vec[i][j];
}
}
// 统计横向
int[] horizontal = new int[n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
horizontal[i] += vec[i][j];
}
}
// 统计纵向
int[] vertical = new int[m];
for (int j = 0; j < m; j++) {
for (int i = 0; i < n; i++) {
vertical[j] += vec[i][j];
}
}
int result = Integer.MAX_VALUE;
int horizontalCut = 0;
for (int i = 0; i < n; i++) {
horizontalCut += horizontal[i];
result = Math.min(result, Math.abs(sum - 2 * horizontalCut));
}
int verticalCut = 0;
for (int j = 0; j < m; j++) {
verticalCut += vertical[j];
result = Math.min(result, Math.abs(sum - 2 * verticalCut));
}
System.out.println(result);
scanner.close();
}
}