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

长度最小的子数组

时间:2023-04-17 23:14:50浏览次数:40  
标签:target nums int 最小 num result 数组 长度

长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

Python

解一(会超出时间限制):

class Solution(object):
    def minSubArrayLen(self, target, nums):
        """
        :type target: int
        :type nums: List[int]
        :rtype: int
        """
        result_final = []
        tim = 0
        for t in range(len(nums)):
            sum = 0
            flag = 0
            for i in nums[t:]:
                sum += i
                flag += 1
                if sum >= target:
                    result_final.append(flag)
                    break
        if result_final == []:
            return 0
        else:
            return min(result_final)

解二:

class Solution(object):
    def minSubArrayLen(self, target, nums):
        """
        :type target: int
        :type nums: List[int]
        :rtype: int
        """
        first = 0
        result = float('inf')
        num = 0
        for end in range(len(nums)):
            num = num + nums[end]
            while num >= target:
                result = min(result,end - first+1)
                num = num - nums[first]
                first += 1
        return 0 if result == float('inf') else result

笔记

  1. 暴力求解(即解一),时间复杂度较高,会超出时间限制;
  2. 采用滑动窗口法(双指针法),两个指针一个指向所求区间尾端(end),另一个指向所求区间首段(first),根据题意要求的是最小的能使其和大于等于target的区间,因此当区间内和小于target时尾端应该右移,扩大区间,当区间内和大于等于target时,首端应右移,减少区间内元素个数。

标签:target,nums,int,最小,num,result,数组,长度
From: https://www.cnblogs.com/zhiyue-bit/p/17327896.html

相关文章

  • 【LBLD】常数时间删除-查找数组中的任意元素
    常数时间删除-查找数组中的任意元素380.O(1)时间插入、删除和获取随机元素classRandomizedSet{private:vector<int>nums;unordered_map<int,int>num2index;public:RandomizedSet(){srand(time(0));}boolinsert(intval){......
  • 轮换数组——给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数
    示例输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,5]向右轮转3步:[5,6,7,1,2,3,4]这里使用reverse函数来解决问题,思路是:1.反转整个字符串2.反转区间为前k的子串3.反转区间为k到末尾的......
  • 定义函数数组
    interfaceFunctionArrayInterface//定义接口,希望批量执行的函数用统一的名称定义在接口内{voidrunit();}classfuncAimplementsFunctionArrayInterface//函数A{publicvoidrunit(){System.out.println("你运行了函数func......
  • 基于遗传算法的最优潮流 以IEEE30节点的输电网为研究对象 以系统发电成本最小为目标函
    基于遗传算法的最优潮流 以IEEE30节点的输电网为研究对象以系统发电成本最小为目标函数以机组出力为优化变量其中出力与成本的关系是经典的二次函数关系 通过优化求解得到最佳机组出力ID:2550672838253871......
  • sequence (牛客多校) (区间包含某个值的最大最小, 和那个东西)
     思路:一步一步的拆解分析有一个min(al...r)通过这个东西那么就可以根据这个ai值分区间,可以通过单调zhai处理当然也可以去利用启发式合并处理,  在处理区间的时候,因为这个有正负,要分类讨论正就是最大负数就是最小遇到区间包含某个值的区间最大最小那么就......
  • 基于拦截器去实现数据长度等校验
    因为之前基于了HandlerInterceptorAdapter去实现过我们数据的拦截。后来一想这个都可以用来对传递的数据做拦截那么这个时候我们就可以用它来加上自定义注解去实现一个入参的数据校验这样就避免了大量的逻辑。可以去实现每个入参进来的时候数据的校验等等。packagecom.cyi.Inte......
  • 第五章 数组
    5.1数组的概述5.1.1数组的定义数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称为一个数据元素,每一个数据元素可以通过一个下标来访问他们。5.2数组的声明创建5.2.1数组的声明与创建首先必......
  • reduce 构建新对象或者 数组
    //原对象constinfo=[{name:"A",value:4,},{name:"B",value:7,},{name:"C",value:10,}];//期望对象{A:4,B:7,C:10,}//reduce:co......
  • C# 数组深拷贝浅拷贝
    1bool[]tmp1={true,true};2bool[]tmp2;34//tmp2=tmp1;//浅拷贝更改tmp2会影响tmp156tmp2=(bool[])tmp1.Clone();//克隆深拷贝更改tmp2不会影响tmp178tmp2[0]=false;9......
  • 动态规划:剑指 Offer 42. 连续子数组的最大和
    题目描述:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 提示:1<= arr.length<=10^5-100<=arr[i]<=100   classSolution{publicintmaxSubArray(intnums[]){intres......