209.长度最小的子数组
需要考虑好滑动窗口的起始和终止条件
class Solution {
public int minSubArrayLen(int target, int[] nums) {
//使用滑动窗口解决问题
int start = 0;
int end = 0;
int minL = nums.length+1;
int sum = 0;
while (end<nums.length){
sum+=nums[end++];
while (sum>=target){
minL = Math.min(minL,end-start);
sum-=nums[start++];
}
}
if(minL>nums.length){
return 0;
}
return minL;
}
}
59.螺旋矩阵 II
主要考虑边界条件。需要注意的是矩阵是竖排的。
class Solution {
public static int[][] generateMatrix(int n) {
int[][] result = new int[n][n];
if (n == 1) {
result[0][0] = 1;
return result;
}
int x = 0;
int y = 0;
int value = 1;
// 圈数
int number = 1;
for (int i = n; i > 1; i = i - 2) {
// 使用x,y定位当前坐标
// 上侧
while (y < n - number) {
result[x][y++] = value++;
}
// 右侧
while (x < n - number) {
result[x++][y] = value++;
}
// 下侧
while (y > number - 1) {
result[x][y--] = value++;
}
// 左侧
while (x > number - 1) {
result[x--][y] = value++;
}
x++;
y++;
number++;
}
if (n % 2 != 0) {
int mid = n / 2 + 1;
result[mid - 1][mid - 1] = n * n;
}
return result;
}
}
58. 区间和(第九期模拟笔试)
暴力破解如下,执行时间过长。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int size = sc.nextInt();
int[] a = new int[size];
for (int i = 0; i < size; i++) {
a[i]=sc.nextInt();
}
while (sc.hasNext()){
int left = sc.nextInt();
int right =sc.nextInt();
int sum = 0;
for (int i = left; i <=right ; i++) {
sum+=a[i];
}
System.out.println(sum);
}
}
}
在第一步的缓存中,可以预先存入和,区间之内的和就是对应下标的和之差。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int size = sc.nextInt();
int[] a = new int[size];
int[] p = new int[size];
int pSum = 0;
for (int i = 0; i < size; i++) {
a[i]=sc.nextInt();
pSum +=a[i];
p[i]=pSum;
}
while (sc.hasNext()){
int left = sc.nextInt();
int right =sc.nextInt();
int sum = 0;
if(left==0){
sum = p[right];
}else {
sum = p[right]-p[left-1];
}
System.out.println(sum);
}
}
}
44. 开发商购买土地
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int hSize = sc.nextInt();
int lSize = sc.nextInt();
int[][] region = new int[hSize][lSize];
int[] hSums = new int[hSize];
int[] lSums = new int[lSize];
int totalSum = 0;
for (int i = 0; i < hSize; i++) {
for (int j = 0; j < lSize; j++) {
region[i][j] = sc.nextInt();
lSums[i] += region[i][j];
totalSum += region[i][j];
}
}
for (int i = 0; i < lSize; i++) {
for (int j = 0; j < hSize; j++) {
hSums[i] += region[j][i];
}
}
//横向来看,左侧为hSums[n-1],右侧为hSums[hSize-1]-Sums[n-1]
int min = Integer.MAX_VALUE;
int sumH = 0;
for (int i = 0; i < hSize; i++) {
sumH += hSums[i];
min = Math.min(min, Math.abs(totalSum - 2 * sumH));
}
int sumL = 0;
//纵向看,上侧为lSums[n-1],下侧为lSums[lSize-1]-Sums[n-1]
for (int i = 0; i < lSize; i++) {
sumL += lSums[i];
min = Math.min(min, Math.abs(totalSum - 2 * sumL));
}
System.out.println(min);
}
数组相关总结
这两天主要学习了数组相关内容。主要涉及二分法、双指针、滑动窗口和前缀法。这些方法最重要的是边界范围的判断,要理解边界的意义才能更好地解决问题。

被折叠的 条评论
为什么被折叠?



