当前位置: 首页 > web >正文

2302. 统计得分小于 K 的子数组数目 滑动窗口 or 前缀和+二分

2302. 统计得分小于 K 的子数组数目

在这里插入图片描述

在这里插入图片描述

  • 典型的滑动窗口之越短越合法的统计数目的问题,对于这个不定长滑动窗口问题,大家可以看我的另一篇博客不定长滑动窗口

  • 在这里就不详细介绍滑动窗口方法的代码啦,模版题目来的

class Solution:def countSubarrays(self, nums: List[int], k: int) -> int:# 滑动窗口,越短越好的计数问题ans,tmp,left = 0,0,0n = len(nums)for right,c in enumerate(nums):tmp += c while tmp * (right - left + 1) >= k :tmp -= nums[left]left += 1ans += right - left + 1return ans
  • 主要介绍如何使用这个前缀和+二分如何求解
  • 首先这个前缀和的思路来源:由于需要求解子数组的和的问题,那么为了在o(n)时间复杂度之内求解出区间和,所以会用到这个前缀和
  • 二分:这个二分就不是很好求解了,下面给出思路,我们逐个遍历nums[i],求解出以nums[i]结尾的满足的子数组的个数,那么最长的情况就是从下标0到nums[i]的位置,我们只需使用check函数进行判断,然后二分即可
# 前缀和+ 二分n = len(nums)pre = [0]*(n+1)for i in range(n):pre[i+1] = pre[i] + nums[i]print(pre)def check(mid,right):tmp = (right-mid+1)*(pre[right+1] - pre[mid])return tmp < k # 二分检验ans = 0# 枚举以每一个元素作为结尾for right,c in enumerate(nums):l,r = 0,right res = 0 while l<=r:mid = (l+r) // 2 if check(mid,right):res = max(res,right-mid+1)r = mid - 1else:l = mid + 1ans += res return ans

思考

  • 其实前缀和+二分感觉就是滑动窗口的重复情况,因为滑动窗口不会重新移动左边界变小,而是在不断向右变大右窗口,相比之下,前缀和+二分会每次都设置做窗口的最小值为0,虽然二分的时间复杂度只有o(logn),但是也是重复计算了,不过我们可以学习这种二分的方法!
http://www.xdnf.cn/news/2802.html

相关文章:

  • 6. 页面对象开发的第一种实现方式:页面继承
  • 应用在通信网络设备的爱普生晶振SG2016CBN
  • Matplotlib可视化基础
  • 如何获取按关键字搜索京东商品详情(代码示例)
  • 无需手动重建!Altium到Cadence的封装转换:ASCII文件方法详解
  • LangChain4j +DeepSeek大模型应用开发——3 人工智能服务 AIService
  • 网工备考考纲变化总结
  • 【大模型ChatGPT+R-Meta】AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表“
  • AE插件中文汉化 RGB色彩通道分离故障复古视觉特效 RGB Split v1.0.0
  • watch 监视器
  • 剑指offer经典题目(七)
  • C语言高频面试题——局部变量和全局变量可以重名吗?
  • vs 安装完番茄助手visual assist 后 菜单栏不显示
  • mysql约束
  • Django 缓存框架
  • 同步电路与异步电路
  • 如何在 IntelliJ IDEA 中编写 Speak 程序
  • Spark知识总结
  • 前缀树(Trie)(字典树)
  • C++网络通信大小端原理详解
  • 《系统分析师-第三阶段—总结(六)》
  • 集成电路流片随笔19:full_handshake
  • Web技术与HTTP协议
  • 【linux】一文掌握 Tmux 的各种指令(Tmux备忘清单)
  • mtrace和memleak源码分析
  • 游戏盾与高防CDN的协同防御策略分析
  • element-ui carousel 组件源码分享
  • 深入剖析二叉树家族:二叉树、平衡二叉树、满二叉树与搜索二叉树
  • 系统架构-软件可靠性
  • 【前端】1h 搞定 TypeScript 教程_只说重点