209、长度最小的子数组
public int minSubArrayLen(int target, int[] nums) {
int subRes = 0, minSubArrayLen = Integer.MAX_VALUE, left = 0, right = 0;
while (right < nums.length) {
subRes += nums[right];
while (subRes >= target) {
minSubArrayLen = Math.min(right - left + 1, minSubArrayLen);
subRes -= nums[left];
left++;
}
right++;
}
return minSubArrayLen == Integer.MAX_VALUE ? 0 : minSubArrayLen;
}
注意窗口的滑动
59、螺旋矩阵II
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
int x, y, startX = 0, startY = 0, loop = 1, num = 1;
while (loop <= n / 2) {
for (y = startY; y < n - loop; y++) {
matrix[startX][y] = num++;
}
for (x = startX; x < n - loop; x++) {
matrix[x][y] = num++;
}
for (; y > startY; y--) {
matrix[x][y] = num++;
}
for (; x > startX; x--) {
matrix[x][y] = num++;
}
startX++;
startY++;
loop++;
}
if (n % 2 == 1) {
matrix[n / 2][n / 2] = num++;
}
return matrix;
}
还是得多写多练,熟悉矩阵循环的遍历方式
补充 58、区间和
题目地址:区间和
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
try (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);
}
}
}
}
相当于先预计算好每个点的前项和,然后根据区间点位求得区间和;且因为是预计算好的结果,所以随拿随用,无需重复计算。
补充 44、开发商购买土地
题目地址:开发商购买土地
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 result = Integer.MAX_VALUE;
int count = 0; // 统计遍历过的行
// 行切分
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
count += vec[i][j];
// 遍历到行末尾时候开始统计
if (j == m - 1) {
result = Math.min(result, Math.abs(sum - 2 * count));
}
}
}
count = 0;
// 列切分
for (int j = 0; j < m; j++) {
for (int i = 0; i < n; i++) {
count += vec[i][j];
// 遍历到列末尾时候开始统计
if (i == n - 1) {
result = Math.min(result, Math.abs(sum - 2 * count));
}
}
}
System.out.println(result);
scanner.close();
}
}
这题头痛 ing~
还需要再消化消化