每日算法(二)

每日算法(二)

209.长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

示例:

  • 输入:s = 7, nums = [2,3,1,2,4,3]

  • 输出:2

  • 解释:子数组 [4,3] 是该条件下的长度最小的子数组。

提示:

  • 1 <= target <= 10^9

  • 1 <= nums.length <= 10^5

  • 1 <= nums[i] <= 10^5

public int minSubArrayLen(int target, int[] nums) {
    int result = Integer.MAX_VALUE;
    int l = 0;
    int sum =0;
    for(int r = 0;r<nums.length;r++){
        sum+= nums[r];
        while(sum >= target){
            result = Math.min(result,r-l+1);
            sum -= nums[l++];
        }
    }
    return result == Integer.MAX_VALUE ?0 : result;
}

##

59.螺旋矩阵II

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]

public int[][] generateMatrix(int n) {
    int[][] nums = new int[n][n];
    int startX = 0, startY = 0;
    int loop = 1;
    int count = 1;
    int offset = 1;
    int i , j;
    while (loop <= n / 2) {
        // 第一层
        for(j = startY;j<n-offset;j++){
            nums[startX][j] = count++;
        }
        for(i = startX;i<n-offset;i++){
            nums[i][j] = count++;
        }
        for(;j>startY;j--){
            nums[i][j] = count++;
        }
        for(;i>startX;i--){
            nums[i][j] = count++;
        }
        startX++;
        startY++;
        offset++;
        loop++;
​
​
    }
    if (n % 2 == 1) { // n 为奇数时,单独处理矩阵中心的值
        nums[startX][startY] = count;
    }
    return nums;
}

58. 区间和

题目描述

给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。

输入描述

第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间,直至文件结束。

输出描述

输出每个指定区间内元素的总和。

这个题目可以暴力 也可以用贪心 我还是推荐贪心算法

import java.util.Scanner;
​
public class Main {
    public static void main(String[] args) {
        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);
        }
​
        scanner.close();
    }
}

LICENSED UNDER CC BY-NC-SA 4.0