【算法】数组-长度最小的子数组

给定一个含有 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 <= numsi <= 10^5

本题对应力扣209题

首先是暴力求解

复制代码
public class MinimumSubArrayLength {
    public static int minSubArrayLen(int s, int[] nums) {
        int result = Integer.MAX_VALUE; // 最终的结果
        int sum = 0; // 子序列的数值之和
        int subLength = 0; // 子序列的长度
        for (int i = 0; i < nums.length; i++) { // 设置子序列起点为i
            sum = 0;
            for (int j = i; j < nums.length; j++) { // 设置子序列终止位置为j
                sum += nums[j];       
                if (sum >= s) { // 一旦发现子序列和超过了s,更新result
                    subLength = j - i + 1; // 取子序列的长度
                    result = Math.min(result, subLength);
                    break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
                }
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == Integer.MAX_VALUE ? 0 : result;
    }

    public static void main(String[] args) {
        int[] nums = {2, 3, 1, 2, 4, 3};
        int s = 7;
        int result = minSubArrayLen(s, nums);
        System.out.println("输出:" + result);
    }
}

第二种方法是滑动求解,目的是用一层循环代替两层循环,降低复杂度

复制代码
public class MinimumSubArrayLength {
    public static int minSubArrayLen(int s, int[] nums) {
        int sum = 0,left = 0;
        int result = Integer.MAX_VALUE;
        for(int right = 0;right<nums.length;right++){
            sum = sum + nums[right];
            while(sum >= s){ //要持续滑动,不能只判断一次就停止了
                result = Math.min(result, right - left + 1);
                sum = sum - nums[left];
                left++;

            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }

    public static void main(String[] args) {
        int[] nums = {2, 3, 1, 2, 4, 3};

        int s = 7;
        int result = minSubArrayLen(s, nums);
        System.out.println("输出:" + result);
    }
}
相关推荐
特立独行的猫A3 分钟前
我用仓颉写了个多平台发文工具:一份 Markdown,一条命令发六个平台
java·后端·python
ikgy16 分钟前
JAVA EE:1.计算机是如何工作的
java·java-ee
闻缺陷则喜何志丹21 分钟前
【C++特性】四种类型转
c++·算法·类型转换
喵本喵叁肆31 分钟前
用 Boosting 把弱隐私算法炼成强隐私算法(英文原题:Boosting and Differential Privacy (FOCS 2010))
算法·集成学习·boosting
.痞老板.1 小时前
java ee--计算机是如何工作的
java·开发语言·java-ee
GrowingIO技术社区1 小时前
CDP、行为分析、归因与营销自动化有什么区别?
数据结构·数据挖掘·数据分析
GrowingIO技术社区1 小时前
实时标签怎样验收?从数据更新到分群可用
数据结构·数据挖掘·数据分析
青梅味猪大肠1 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
CoderYanger1 小时前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)
java·数据库·spring·面试·职场和发展·java-ee·mybatis
程序员沉梦听雨1 小时前
【搜索引擎】Kibana使用指南
java·后端·学习笔记