【代码随想录】 209.长度最小的子数组 59.螺旋矩阵II 区间和 开发商购买土地

209.长度最小的子数组

leetcode: 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

leetcode: 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. 区间和(第九期模拟笔试)

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. 开发商购买土地

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

数组相关总结

这两天主要学习了数组相关内容。主要涉及二分法、双指针、滑动窗口和前缀法。这些方法最重要的是边界范围的判断,要理解边界的意义才能更好地解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值