代码随想录Day02


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~
还需要再消化消化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值