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

算法奇妙屋(五十)-二分与双指针的结合 + 2024秦皇岛-Problem D

文章目录

  • 一. 力扣 [713. 乘积小于 K 的子数组](https://leetcode.cn/problems/subarray-product-less-than-k/description/)
    • 1. 题目解析
    • 2. 滑动窗口算法原理
    • 3. 二分+对数+前缀和+双指针
    • 3. 代码
  • 二. 2024秦皇岛-Problem D
    • 1. 题目解析
    • 2. 算法原理
    • 3. 代码

一. 力扣713. 乘积小于 K 的子数组

1. 题目解析

题意简单明了, 成绩小于指定的k, 子数组指的是连续的区间

2. 滑动窗口算法原理

3. 二分+对数+前缀和+双指针

3. 代码

滑动窗口代码👇

classSolution{publicintnumSubarrayProductLessThanK(int[]nums,intk){intl=0,r=0,mul=1,ret=0;// k为1, 可以直接返回0, 因为这里乘积最小值为1, 且numd[i]最小值也是1if(k<=1)return0;while(r<nums.length){mul*=nums[r];while(mul>=k){mul/=nums[l];l++;}ret+=r-l+1;r++;}returnret;}}

二分+双指针代码👇

classSolution{publicintnumSubarrayProductLessThanK(int[]nums,intk){if(k<=1){return0;}intn=nums.length;double[]dp=newdouble[n+1];for(inti=1;i<=n;i++){dp[i]=dp[i-1]+Math.log(nums[i-1]);}doublelogk=Math.log(k);intret=0;for(intj=0;j<n;j++){intl=0;// l左端点可能为0intr=j;// r最大就是右端点inti=j+1;// 左端点的最坏情况,nums[j]本身也不满足doublet=dp[j+1]-logk+1e-10;while(l<=r){intmid=l+(r-l)/2;if(dp[mid]>t){i=mid;r=mid-1;}else{l=mid+1;}}ret+=j-i+1;}returnret;}}

二. 2024秦皇岛-Problem D

小编总结了两天的超详细解析

1. 题目解析

2. 算法原理

这道题用到的算法思想还是较多的, 动态规划 + 正难则反 + 贡献计数

3. 代码

importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.util.Arrays;importjava.util.StringTokenizer;publicclassMy_Main{// 封装从左面挑选两个的方法staticintselect2(intleft){return(left)*(left-1)/2;}publicstaticvoidmain(String[]args)throwsException{// 读取输入BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));StringTokenizerst=newStringTokenizer(br.readLine());char[]cc=st.nextToken().toCharArray();st=newStringTokenizer(br.readLine());intm=Integer.valueOf(st.nextToken());intn=cc.length;// 统计字符c的数量 和 记录c的下标intC=0;for(charch:cc)if(ch=='c')C++;intP=n-C;intidx=1;int[]pos=newint[C+1];//我们要填的是下一个数, 即i+1这个数, 因此i从0开始遍历,for(inti=0;i<n;i++){if(cc[i]=='c'){pos[idx++]=i+1;// 让index从1开始, 同时每个index绑定的下标也右移一位, 即原本cc[0]位置为c, 对应的就是pos[1] = 1}}// 建立dp表int[][][]dp=newint[n+1][C+1][m+1];// 初始化for(inti=0;i<=n;i++){for(intj=0;j<=C;j++){Arrays.fill(dp[i][j],-1);}}dp[0][0][0]=0;for(inti=0;i<n;i++){// j 表示的是c的个数,超过i或者C都没有意义, 因此选择较小的那一个for(intj=0;j<=Math.min(i,C);j++){for(intk=0;k<=m;k++){// 当前位置j和k不能满足,满足的话会被提前填写if(dp[i][j][k]<0)continue;// 放p,先判断是否有剩余if(i-j<P){intaddP=select2(j)*(C-j);dp[i+1][j][k]=Math.max(dp[i+1][j][k],dp[i][j][k]+addP);}// 放c, j<C才有意义, 才可以放cif(j<C){intaddC=select2(i-j)*(P-(i-j));// 求总代价intcost=k+Math.abs(i+1-pos[j+1]);if(cost<=m){dp[i+1][j+1][cost]=Math.max(dp[i+1][j+1][cost],dp[i][j][k]+addC);}}}}}intret=0;for(intk=m;k>=0;k-=2){ret=Math.max(dp[n][C][k],ret);}System.out.println(ret);}}
http://www.jsqmd.com/news/735629/

相关文章:

  • 电脑定时关机怎么设置?【图文讲解】定时关机设置?定时关机命令?定时关机命令
  • KMS_VL_ALL_AIO:一劳永逸的Windows和Office激活解决方案
  • Understand——根据代码自动生成类图的工具
  • EpiQAL评测基准:提升AI在公共卫生领域的专业性与时效性
  • Transformer算法核心:功能等价性与模型收敛机制解析
  • AI时代,济南企业如何借力GEO优化抢占流量先机?
  • Android蓝牙开发深度指南:从基础到实践
  • [图解]CF2226D-Reserved Reversals
  • Java基础·第5篇:Java多态——不用再写三个重载方法了!
  • 014浮点算术模拟
  • LLM学习-day04
  • 利用MCP协议实现App Store Connect自动化管理:从API封装到AI助手集成
  • 5大实用技巧:用LinkSwift实现多网盘高效下载
  • Ostrakon-VL-8B开发者案例:通过API接入钉钉机器人,违规项实时推送负责人
  • AI抠图去除背景完全攻略:2026年最实用的工具推荐与使用技巧
  • Source Han Serif CN:开源中文字体的终极解决方案与完整应用指南
  • XDM浏览器插件高级配置指南:网络监控与下载管理技术深度解析
  • UVa 12409 Kisu Pari Na 1
  • AI代理如何重塑项目管理:从自然语言到Jira工单的自动化实践
  • Arm Neoverse MMU S3架构解析与性能优化
  • 深搜练习(目标和)(6)
  • 快速掌握网络分析仪差分信号4端口信号S参数测试
  • 如何安全备份微信聊天记录?3步完成数据解析与恢复的终极指南
  • 账单追溯功能如何帮助厘清团队成员的模型使用明细
  • Go语言爬虫工具claw-tools:高并发数据抓取与自动化实战指南
  • MCP:破解大模型困境的更优解,重构AI与世界的交互范式
  • 使用 context 工具管理命令执行环境:提升开发与自动化效率
  • 终极二维码修复工具:QRazyBox让失效二维码快速重获新生
  • 深搜练习(组合总和)(7)
  • 2026年专业旧房改造装修公司实力排行盘点:三室两厅两卫装修实景,公寓装修小户型装修公司,优选推荐! - 优质品牌商家