算法题解-长度最小的子数组

简介: 算法题解-长度最小的子数组

题目


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

输入: target = 4, nums = [1,4,4]
输出: 1


题解


第一种


我们这里先采用暴力枚举进行实现,首先我们在函数中接受两个参数,一个数字s和一个数组nums,在函数使用两个指针i和j分别表示子数组的起始位置和终止位置,默认值我们先设为0,在函数使用一个变量minl来记录当前找到的最小子数组的长度,初始值为数组nums的长度加1,在函数中我们使用一个while循环来遍历数组nums,在循环中,我们首先计算从i开始的连续j个元素的和total,如果total大于等于s,我们则更新minl的值为min,如果total小于s,我们则继续向右移动j,直到total大于等于s或者j超出数组范围为止,如果minl的值没有被更新,则说明找不到符合条件的子数组,最后我们将minl变量返回出去即可

var minSubArrayLen = function (s, nums) {
  let minl = nums.length + 1
  for (let i = 0; i < nums.length; i++) {
    let total = nums[i]
    let j = 1
    while (total < s && i + j < nums.length) {
      total += nums[i + j]
      ++j
    }
    if (total >= s) {
      minl = Math.min(minl, j)
    }
  }
  if (minl === nums.length + 1) {
    minl = 0
  }
  return minl
}


第二种


我们这里还可以采用双指针方式进行实现,我们在函数中先使用两个指针start和end分别代表子数组的起始位置和终止位置,初始值我们先设为0,函数中我们使用一个变量sum来记录当前子数组的元素之和,值为0,使用一个变量minLen来记录当前找到的最小子数组的长度,初始值为正无穷,接下来我们在函数中使用while循环进行遍历数组nums,循环中我们首先计算从start到end的元素之和sum,如果sum小于s,我们则将end右移一位,继续向右扩展子数组,如果sum大于等于s,我们则更新minLen的值为min,然后我们将start右移一位并将sum减去移除的第一个元素和移动后的第一个元素,这样就得到了一个新的子数组,继续判断其元素之和是否大于等于s,最后如果minLen的值没有被更新,则说明找不到符合条件的子数组返回0否则返回minLen即可

var minSubArrayLen = function (s, nums) {
  let start = 0
  let end = 0
  let sum = 0
  let minLen = +Infinity
  while (end < nums.length) {
    sum = sum + nums[end]
    if (sum < s) {
      end++
    } else {
      minLen = Math.min(minLen, end - start + 1)
      sum = sum - nums[start] - nums[end]
      start++
    }
  }
  return minLen == +Infinity ? 0 : minLen
}
相关文章
|
2月前
|
存储 算法
算法入门:专题二---滑动窗口(长度最小的子数组)类型题目攻克!
给定一个正整数数组和目标值target,找出总和大于等于target的最短连续子数组长度。利用滑动窗口(双指针)优化,维护窗口内元素和,通过单调性避免重复枚举,时间复杂度O(n)。当窗口和满足条件时收缩左边界,更新最小长度,最终返回结果。
|
算法
【算法】滑动窗口——长度最小的子数组
【算法】滑动窗口——长度最小的子数组
162 0
|
算法 C++
【算法】前缀和算法——和可被K整除的子数组
【算法】前缀和算法——和可被K整除的子数组
128 0
|
算法
【算法】前缀和算法——和为k的子数组之和
【算法】前缀和算法——和为k的子数组之和
141 0
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
175 0
|
机器学习/深度学习 算法 测试技术
【算法优选】 动态规划之子数组、子串系列——壹
【算法优选】 动态规划之子数组、子串系列——壹
|
算法 C语言
[优选算法]------滑动窗⼝——209. 长度最小的子数组
[优选算法]------滑动窗⼝——209. 长度最小的子数组
130 2
|
人工智能 算法
【算法优选】 动态规划之子数组、子串系列——贰
【算法优选】 动态规划之子数组、子串系列——贰
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
232 0

热门文章

最新文章