前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一天一大 leet(长度最小的子数组)难度:中等 DAY-28

一天一大 leet(长度最小的子数组)难度:中等 DAY-28

作者头像
前端小书童
发布2020-09-24 11:28:42
2430
发布2020-09-24 11:28:42
举报
文章被收录于专栏:前端小书童

题目(难度:中等):

给定一个含有 n 个正整数的数组和一个正整数 s,找出该数组中满足其和 ≥s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。

示例

代码语言:javascript
复制
输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。

抛砖引玉

特殊情况
  • nums 为空返回 0
逻辑
  • 循环数组,分别以每个元素当做开始找到其一直连续的数组,开始的索引 start,结束的索引 end
  • 记录每个 start 和 end 对应的和
  • 判断其和是否大于等于 s
  • 如果等于在本次 start 和 end 的距离与之前记录的距离中取最小值
代码语言:javascript
复制
/**
 * @param {number} s
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function (s, nums) {
  let len = nums.length
  if (len == 0) {
    return 0
  }
  let _result = Number.MAX_VALUE
  for (let start = 0; start < len; start++) {
    let sum = 0
    for (let end = start; end < len; end++) {
      sum += nums[end]
      if (sum >= s) {
        _result = Math.min(_result, end - start + 1)
        break
      }
    }
  }
  return _result == Number.MAX_VALUE ? 0 : _result
}

官方答案

  1. 双指针
  • 利用 start 和 end 双指针计算满足条件的子数组之和;
  • 计算完一组满足条件数组之后后,减掉开始位置数据,指针向后移动一位
代码语言:javascript
复制
/**
 * @param {number} s
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function (s, nums) {
  let n = nums.length
  if (n == 0) {
    return 0
  }
  let ans = Number.MAX_VALUE
  let start = 0,
    end = 0
  let sum = 0
  while (end < n) {
    sum += nums[end]
    while (sum >= s) {
      ans = Math.min(ans, end - start + 1)
      // 本轮满足条件的连续子集已得到,减start位置的子集
      sum -= nums[start]
      // start指针向后移动一位
      start++
    }
    end++
  }
  return ans == Number.MAX_VALUE ? 0 : ans
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端小书童 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示例
  • 抛砖引玉
    • 特殊情况
      • 逻辑
      • 官方答案
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档