news 2026/5/2 3:13:23

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法奇妙屋(五十)-二分与双指针的结合 + 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);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 3:10:10

KMS_VL_ALL_AIO:一劳永逸的Windows和Office激活解决方案

KMS_VL_ALL_AIO&#xff1a;一劳永逸的Windows和Office激活解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活问题而烦恼吗&#xff1f;每次系统更新后都要重新激活…

作者头像 李华
网站建设 2026/5/2 3:09:48

2016年下半年嵌入式系统设计师案例

试题一 【说明】 某综合化智能空气净化器设计以微处理器为核心&#xff0c;包含各种传感器和控制器&#xff0c;具有检测环境空气参数&#xff08;包含温湿度、可燃气体、细颗粒物等&#xff09;&#xff0c;空气净化、加湿、除湿、加热和杀菌等功能&#xff0c;并能通过移动客…

作者头像 李华
网站建设 2026/5/2 3:08:06

pfc (基于优先级的流量控制)

PFC(Priority-based Flow Control,基于优先级的流量控制)基于802.1Qbb 基于优先级的流控 它的核心作用是当网络出现拥塞时,能够只“暂停”特定的高优先级流量(如RoCE流量),而不影响其他普通流量的正常转发。 PFC 是按 8 个 CoS 优先级,单独对某一个队列暂停,互不影响…

作者头像 李华
网站建设 2026/5/2 3:06:26

苹果手机照片去背景怎么操作?2026年最全指南+免费工具推荐

说实话&#xff0c;我之前也被苹果手机照片去背景的问题困扰过。朋友圈里有人需要证件照换底色&#xff0c;有人想把商品图去掉杂乱背景上传到店铺&#xff0c;还有人要给全家福"瘦身"——每次都得折腾半天。直到我找到了几个真正好用的方法&#xff0c;才算彻底解决…

作者头像 李华