代码随想录算法训练营第二天|数组part02

89 阅读2分钟

数组算法基础训练

一.长度最小的子数组

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int left = 0;
        int sum = 0;
        int result = Integer.MAX_VALUE;
        for (int right = 0; right < nums.length; right ++){
            sum += nums[right];
            // 判断此时子数组是否满足target要求,满足了说明是当前left最小子数组
            while(sum >= target){
                result = Math.min(result, right - left + 1);
                sum -= nums[left];
                left ++;
            }
        }
        // 最后输出result,别忘了有种情况是所有元素加起来都达不到target,那这时子数组长度应为0
        return result == Integer.MAX_VALUE ? 0 : result;
        
    }
}

二.螺旋矩阵II

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] nums = new int[n][n];
        int startX = 0; // 第一圈开始的行标
        int startY = 0; //第一圈开始的列标
        int offset = 1; //左闭右开的区间,每次圈循环结束,结尾都需要-1
        int count = 1; // 矩阵元素从1开始
        int i, j; // i是我们的行标,j是我们的列标,我们设为全局变量让他不要断
        // 每循环一次,下一次的循环边减少两个元素,我们要留最中心的元素单独赋值
        // 所以向下取整的结果就是我们循环的圈数
        for(int a = 1; a <= (n>>1); a ++){
            // 上行
            for(j = startY; j < n - offset; j ++){
                nums[startX][j] = count;
                count ++;
            }
            // 右列
            for(i = startX; i < n - offset; i ++){
                nums[i][j] = count;
                count ++;
            }
            // 下行
            for( ; j > startY; j --){
                nums[i][j] = count;
                count ++;
            }
            //左列
            for( ; i > startX; i -- ){
                nums[i][j] = count;
                count ++;
            }
            startY ++;
            startX ++;
            offset ++;
        }
        if (n % 2 == 1){
            nums[startX][startY] = count;
        }
        return nums;
    }
}

三.区间和

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int sum = 0;
        int[] prefix_sum = new int[n];
        for (int i = 0; i < n; i++) {
            int nextInt = sc.nextInt();
            sum += nextInt;
            prefix_sum[i] = sum;
        }

        while (sc.hasNextInt()){
            int a = sc.nextInt();
            int b = sc.nextInt();
            if(a != 0){
                System.out.println(prefix_sum[b] - prefix_sum[a - 1]);
            }else{
                System.out.println(prefix_sum[b]);
            }

        }
    }
}

四.开发商购买土地

import java.util.Scanner;

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_row = 0;
        int[] row = new int[n];
        int[] line = new int[m]; // 新建数组每个元素都为0
        // 行前缀和
        for (int i = 0; i < n; i ++){
            for (int j = 0; j < m; j ++){
                int nextInt = sc.nextInt();
                line[j] += nextInt;
                sum_row += nextInt;
            }
            row[i] = sum_row;
        }
        // 列前缀和
        for (int j = 0; j < m; j++){
            if(j == 0){
                line[j] = line[j];
            }else{
                line[j] = line[j] + line[j - 1];
            }
        }
        // 行分割情况,循环统计
        int result = Integer.MAX_VALUE;
        for (int i = 0; i < n-1; i ++){
            result = Math.min(result, Math.abs(row[n-1]-row[i]-row[i]));
        }
        for (int j = 0; j < m-1; j++){
            result = Math.min(result,Math.abs(line[m-1]-line[j]-line[j]));
        }
        System.out.println(result);
        sc.close();
    }
}