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

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

题目


给定一个含有 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
}
相关文章
|
6月前
|
算法 JavaScript Java
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
|
3月前
|
算法
【算法】滑动窗口——长度最小的子数组
【算法】滑动窗口——长度最小的子数组
|
6月前
|
算法
|
3月前
|
算法 C++
【算法】前缀和算法——和可被K整除的子数组
【算法】前缀和算法——和可被K整除的子数组
|
3月前
|
算法
【算法】前缀和算法——和为k的子数组之和
【算法】前缀和算法——和为k的子数组之和
|
3月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
42 0
|
5月前
|
机器学习/深度学习 算法 测试技术
【算法优选】 动态规划之子数组、子串系列——壹
【算法优选】 动态规划之子数组、子串系列——壹
|
6月前
|
算法 C语言
[优选算法]------滑动窗⼝——209. 长度最小的子数组
[优选算法]------滑动窗⼝——209. 长度最小的子数组
|
5月前
|
人工智能 算法
【算法优选】 动态规划之子数组、子串系列——贰
【算法优选】 动态规划之子数组、子串系列——贰
|
24天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。