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

leetcode 209. 长度最小的子数组

时间:2023-12-13 23:37:26浏览次数:48  
标签:target nums 209 sum int result 数组 leetcode

题目:

209. 长度最小的子数组

题目描述:

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

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

我的思路:

这道题目暴力破解法会超时,使用双层 for 循环进行暴力破解,就是枚举的思想。时间复杂度 O(n*n)。

滑动窗口的思想,也就是双指针,不过是同向双指针,看两边界之间的和是否大于目标值,如果大于等于的话右移左边界,小于的话右移右边界,每次大于等于的时候记录两个边界的距离,和之前最小的进行对比。

/**
 * 暴力破解法,双层 for 循环,判断每一层的个数,暴力破解在 leetcode 会超出时间限制
 *
 * @param target 目标值
 * @param nums   数组
 * @return 最小连续子数组的长度
 */
public int minSubArrayLen(int target, int[] nums) {
    int result = Integer.MAX_VALUE;
    for (int i = 0; i < nums.length; i++) {
        int sum = nums[i];
        if (sum >= target) {
            result = Math.min(result, 1);
        }
        for (int j = i + 1; j < nums.length; j++) {
            sum += nums[j];
            if (sum >= target) {
                result = Math.min(result, j - i + 1);
                break;
            }
        }
    }
    return result == Integer.MAX_VALUE ? 0 : result;
}

/**
 * 使用滑动窗口看看,滑动窗口也算是双指针的使用
 * @param target 目标值
 * @param nums   数组
 * @return 最小连续子数组的长度
 */
public static int minSubArrayLen2(int target, int[] nums) {
    // 左边界
    int left = 0;
    // 右边界
    int right = 0;
    // 滑动窗口内的所有数之和
    int sum = nums[0];
    // 滑动窗口之间的距离
    int result = Integer.MAX_VALUE;
    while (left <= right && right < nums.length ) {
        // 大于右移左边界
        while (sum >= target && left <= right) {
            result = Math.min(result, right - left + 1);
            sum -= nums[left];
            left ++;
        }
        // 小于右移右边界
        while (sum < target && left <= right && ++ right < nums.length) {
            sum += nums[right];
        }
    }
    return result == Integer.MAX_VALUE ? 0 : result;
}

标签:target,nums,209,sum,int,result,数组,leetcode
From: https://www.cnblogs.com/wadmwz/p/17900186.html

相关文章

  • 238题:除自身以外数组的乘积
    238题:除自身以外数组的乘积写作背景:由于最近在练习leetcode,这道题刚开始思路不太清晰,所以将自己的解题思路记录下来,以便后续复习。题目描述:给你一个整数数组nums,返回数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。题目数据保证数组nums之......
  • 代码随想录算法训练营第一天 | 数组理论基础,704. 二分查找,27. 移除元素
    一、数组理论基础学习前:1.数组定义一些在内存上连续存储的相同数据类型的数据的集合2.数组特征便于查询数组元素,不便于增删数据元素学习后:对于Java,二维数组不一定在内存上连续。如int[i][j],唯一确定的是int[i][]在内存上连续二、704.二分查找LeetCode704.二分查找......
  • 代码随想录算法训练营第一天| LeetCode704 二分查找、27移除元素
     Leetcode704:二分查找今日学习的文章链接:代码随想录(programmercarl.com) 题目链接:704.二分查找-力扣(LeetCode)●  自己看到题目的第一想法这题我会,但是还没明白卡尔说的循环不变量是什么意思。我的固定思路就是,target比中间值大,左指针右移到mid+1;target比中间值......
  • delphi 变体Variant数组常用操作
    变体Variant数组常用操作代码procedureTForm1.Button1Click(Sender:TObject);varArr1,Arr2,Arr3:Variant;I,J:Integer;begin//创建包含10个整数类型元素的变体数组Arr1:=VarArrayCreate([0,9],varInteger);//创建2维数组,其中第1维是3个元素,第2维是5......
  • 将value值是true、false的转为1、0,然后将yData数组里的值全部加个2
         ......
  • 将第2层数据中的数组对象中的ts属性、value属性遍历单独存放到一个新数组中xData、yDa
          ......
  • js中数组map和集合map
    js中数组的map:使用情况:想要对一个数组进行操作,然后又不想改变原来的数组数据,还想基于原来数组的数据进行改造,那么可以使用map写法一:letarr=[1,2,3,4]letnewArr=arr.map(item=>{return++item})console.log(newArr,arr)//输出[2,3,4,5][1,2,3,4]letarr=[1......
  • 二维数组页码分页
    $param=$this->request->param();$data=[['id'=>1,'name'=>'11'],['id'=>2,'name'=>'22'],['id'=>3,&......
  • 【教3妹学编程-算法题】交换得到字典序最小的数组
    3妹:2哥2哥,你有没有看到新闻:周海媚姐因病医治无效,于2023年12月11日离开了我们。2哥 :看到了,真是个悲伤的消息,早晨还看到辟谣,以为没事了呢。3妹:是啊,#再见周芷若#2哥:童年的女神,周海媚演的这版“周芷若”真的很深入人心!被评为“最美周芷若”3妹:哎,人有生老病死,R.I.P.2哥:唉,说点高兴的......
  • [LeetCode] LeetCode92. 反转链表II
    题目描述思路:同LeetCode25.K个一组翻转链表因为涉及到可能链表的头节点会改变,所以设置dummy节点先走left-1步到达left的左边一个节点查看后面是否存在right-left+1个节点先翻转内部节点指向right-left次再翻转外部节点方法一:/***Definitionforsingly-lin......