代码随想录二刷第二天 | 209.长度最小的子数组、59. 螺旋矩阵 II、58. 区间和

55 阅读2分钟

209.长度最小的子数组

题目:209. 长度最小的子数组 - 力扣(LeetCode)

题解:代码随想录 (programmercarl.com)

状态:最小为一个元素的情形没考虑到,导致卡了一段时间

扩展题目:

904. 水果成篮

(注意map的getOrDefault(nums[i], 0)函数,put函数可以直接覆盖原先的值)

76. 最小覆盖子串 - 力扣(LeetCode)

思路

关键条件:子数组

注意:要分清边界条件,right=0还是1sum=0还是nums[0]

代码

时间复杂度:O(n) 空间复杂度:O(1)

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

59. 螺旋矩阵 II

题目:59. 螺旋矩阵 II - 力扣(LeetCode)

题解:代码随想录 (programmercarl.com)

状态:单数情况要考虑将中间值补全

扩展题目: 54. 螺旋矩阵

要考虑清楚怎么模拟的,和螺旋矩阵模板一致时,还要考虑内层循环终止条件,不如改成四边界的情况

思路

注意:要注意圈数记录

代码

时间复杂度:O(n^2) 空间复杂度:O(n)

螺旋矩阵,方阵

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int loop = 1, cur = 1;
        List<Integer> ans = new ArrayList<>();
        int m = matrix.length;
        int n = matrix[0].length;
        while(cur < m * n){
            int i = loop - 1, j = loop - 1;
            while(j < n - loop && cur <= m*n){
                ans.add(matrix[i][j]);
                j++;
                cur++;
            }
            while(i < m - loop && cur <= m*n){
                ans.add(matrix[i][j]);
                i++;
                cur++;
            }
            while(j > loop - 1 && cur <= m*n){
                ans.add(matrix[i][j]);
                j--;
                cur++;
            }
            while(i > loop - 1 && cur <= m*n){
                ans.add(matrix[i][j]);
                i--;
                cur++;
            }
            loop++;
        }
        if(m == n && m % 2 == 1) ans.add(matrix[m / 2][n / 2]);
        return ans;
    }
}

螺旋矩阵,矩阵

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1;
        List<Integer> res = new ArrayList<>();
        while(true){
            for(int i = l; i <= r; i++) res.add(matrix[t][i]);
            if(++t > b) break;
            for(int i = t; i <= b; i++) res.add(matrix[i][r]);
            if(--r < l) break;
            for(int i = r; i >= l; i--) res.add(matrix[b][i]);
            if(--b < t) break;
            for(int i = b; i >= t; i--) res.add(matrix[i][l]);
            if(++l > r) break;
        }
        return res;
    }
}

58. 区间和

题目:58. 区间和(第九期模拟笔试) (kamacoder.com)

题解:58. 区间和 | 代码随想录 (programmercarl.com)

状态:

思路

关键条件:区间内元素总和

注意:注意前缀和数组第一位补0

代码

时间复杂度:O(n) 空间复杂度:O(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();
    }
}