8:32-10:08 16:14-17:00 总耗时2.5h左右
209. 长度最小的子数组 38:11
题目链接:. - 力扣(LeetCode)
思路不难,踩了俩坑。
1. 应该是右边增加一个,左边就直接循环,缩到最小,而不是让两者位于同一层循环上面。会出现边界问题。
2. 应该先增后减,即先right++再left++,顺序不能反,否则会出现边界问题。
正确写法:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0, right = 0;
int sum = 0, len = 0;
int ans = nums.length + 1;
while (right < nums.length) {
sum+=nums[right++];
len++;
while(sum>=target){
ans=Math.min(ans,len);
sum-=nums[left++];
len--;
System.out.println("left:" +left+" ans:"+ans);
}
System.out.println("right:" +right);
}
return ans==nums.length+1?0:ans ;
}
}
59. 螺旋矩阵II 31:48
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
循环,注意边界的处理,一层一层循环,还有n为奇数的情况。有点难,是边看边写的。
class Solution {
public int[][] generateMatrix(int n) {
int startX=0,startY=0;
int[][] result=new int[n][n];
int i,j;
int count=1,loop=1;
while(loop<=n/2){
for (j = startY; j < n - loop; j++) {
result[startX][j] = count++;
}
for(i=startX ;i < n-loop;i++){
result[i][j]=count++;
}
for(;j>startY;j--){
result[i][j]=count++;
}
for(;i>startX;i--){
result[i][j]=count++;
}
startX++;
startY++;
loop++;
}
if(n%2==1){
result[startX][startY]=n*n;
}
return result;
}
}
区间和 16min
58. 区间和(第九期模拟笔试) (kamacoder.com)
前缀和,比较熟悉了,但不熟悉输入输出比较耗时,注意范围
import java.util.*;
public class Main{
public static void main (String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[] sum = new int[n+1];
for (int i=1;i<=n ;i++ ){
sum[i]=sum[i-1]+input.nextInt();
}
while(input.hasNextInt()){
int left = input.nextInt();
int right = input.nextInt();
System.out.println(sum[right + 1] - sum[left]);
}
}
}
开发商购买土地
可以用前缀和,也可以对暴力的代码进行优化,在最末尾加一个统计。没有自己写出来,思路有点问题。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.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] = sc.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);
}
}