代码随想录速发训练营第二天

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]);
        }
        
    }
}

开发商购买土地

44. 开发商购买土地 | 代码随想录

可以用前缀和,也可以对暴力的代码进行优化,在最末尾加一个统计。没有自己写出来,思路有点问题。

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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

endless_?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值