首页 > 其他分享 >209. 长度最小的子数组

209. 长度最小的子数组

时间:2022-12-18 22:13:55浏览次数:71  
标签:count right nums 209 sum ++ int 数组 长度

209. 长度最小的子数组

力扣题目链接

我的代码:错误的滑动窗口

    public int minSubArrayLen(int target, int[] nums) {
        int left = 0, right = 0;
        int sum = nums[0];
        int count = 10000;
        for (int i = 1; i < nums.length; i++) {
            sum += nums[i];
        }
        if (sum < target) return 0;
        sum = nums[0];
        while (true) {
            if (right < nums.length - 1 && sum < target) {
                right++;
                sum += nums[right];
            }
            else if (left < nums.length - 1 && sum >= target) {
                count = Math.min(count, right - left + 1);
                sum -= nums[left];
                left++;
            } else {
                break;
            }
        }
        return count;
    }

暴力

    public int minSubArrayLen(int target, int[] nums) {
        // 暴力
        int sum = 0, count = Integer.MAX_VALUE;
        for (int i = 0; i < nums.length; i++) {
            sum = 0;
            for (int j = i; j < nums.length; j++) {
                sum += nums[j];
                if (sum >= target) {
                    count = Math.min(count, j - i + 1);
                    break;
                }
            }
        }
        return count == Integer.MAX_VALUE? 0:count;
    }

正确的滑动窗口

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

思考:

  1. 学会了 return 时的特殊情况判断
  2. 退出循环的条件要找到
  3. 基本思路:不断扩大区间(right++),如果sum >= target,就缩小区间(left++)。即外层循环不断扩大区间,内层循环判断是否缩小区间。

标签:count,right,nums,209,sum,++,int,数组,长度
From: https://www.cnblogs.com/cyrui/p/16991046.html

相关文章

  • Java数组(08)稀疏数组
       红标列不打印,第一行为总计数量       ......
  • 【LeeCode】697. 数组的度
    【题目描述】给定一个非空且只包含非负数的整数数组 ​​nums​​,数组的 度 的定义是指数组里任一元素出现频数的最大值。你的任务是在 ​​nums​​​ 中找到与 ​​......
  • 链表与数组的区别
    原文链接:https://baijiahao.baidu.com/s?id=1743478279629141019物理存储结构不同链表与数组在计算机中存储元素采用不同的物理存储结构,数组是顺序存储结构,链表是链式......
  • 稀疏数组
    分析问题因为二维数组的很多默认值是0,因此记录了很多没有意义的数据解决:稀疏数组(记录有效的坐标)稀疏数组介绍1使用条件:当一个数组中大部分元素为0,或者为同一值的数组......
  • 简单认识指针数组与数组指针
    指针数组:指针数组就是一个存放指针的数组。//指针数组#include<stdio.h>intmain(){inta[5]={1,2,3,4,5};intb[]={2,3,4,5,6};intc[]=......
  • 【LeeCode】4. 寻找两个正序数组的中位数
    【题目描述】给定两个大小分别为 ​​m​​​ 和 ​​n​​​ 的正序(从小到大)数组 ​​nums1​​​ 和 ​​nums2​​。请你找出并返回这两个正序数组的 中位数 。......
  • 最后一个字符长度(C语言)
    一、题目:给定一个仅包含大小写字母和空格 '' 的字符串,返回其最后一个单词的长度。如果不存在最后一个单词,请返回0 。说明:一个单词是指由字母组成,但不包含任何空格的......
  • 1764. 通过连接另一个数组的子数组得到一个数组
    1764.通过连接另一个数组的子数组得到一个数组题解:数据范围小,直接暴力双指针publicbooleancanChoose(int[][]groups,int[]nums){intn=groups.le......
  • 「双指针/kmp」通过连接另一个数组的子数组得到一个数组(力扣第1764题)
    本题为12月17日力扣每日一题题目来源:力扣第1764题题目tag:双指针kmp题面题目描述给你一个长度为n的二维整数数组groups,同时给你一个整数数组nums。你是否可以从n......
  • 力扣每日一题2022.12.17---1764. 通过连接另一个数组的子数组得到一个数组
    给你一个长度为n 的二维整数数组 groups ,同时给你一个整数数组 nums 。你是否可以从nums 中选出n 个不相交的子数组,使得第i 个子数组与groups[i] (下标从0......