Leetcode周赛365补题(3 / 3)

news/2024/5/20 6:44:48 标签: 算法, java, leetcode, 滑动窗口, 前缀和

目录

1、2、有序三元组的最大值 - 预处理前后最大值 + 遍历

(1)预处理前后值+遍历(枚举j) 

(2)枚举k

2、无限数组的最短子数组 - 前缀和 + 滑动窗口


1、2、有序三元组的最大值 - 预处理前后最大值 + 遍历

2874. 有序三元组中的最大值 II

(1)预处理前后值+遍历(枚举j) 

思路:

这题思路跟第368场的100114. 元素和最小的山形三元组 II很像

我自己写的!

我们可以预处理nums[j]的前后最大值pre[j]和beh[j](在【1,n-2】范围内)

然后枚举【1,n-2】区间的(pre[i] - nums[i])* beh[i],更新最大值即可

这样可以保证ijk的下标顺序,也能顺利找到最大值

java">class Solution {
    public long maximumTripletValue(int[] nums) {
        long maxx=0;
        int n=nums.length;
        int[] pre=new int[n],beh=new int[n];
        pre[0]=nums[0];
        beh[n-1]=nums[n-1];
        
        for(int j=1;j<n-1;j++)
            if(nums[j-1]>pre[j-1]) pre[j]=nums[j-1];
            else pre[j]=pre[j-1];
        
        for(int j=n-2;j>0;j--)
            if(nums[j+1]>beh[j+1]) beh[j]=nums[j+1];
            else beh[j]=beh[j+1];
        
        for(int j=1;j<n-1;j++)
            maxx=Math.max(maxx,(long)(pre[j]-nums[j])*beh[j]);
        
        return maxx==0? 0:maxx;
    }
}

(2)枚举k

思路:

我们枚举k,然后维护k左边(nums[i]-nums[j])的最大值

我们可以在遍历的过程中,维护 nums[i]的最大值 preMax,同时维护preMax 减当前元素的最大值 maxDiff,这就是 k 左边 nums[i]−nums[j] 的最大值。

java">class Solution {
    public long maximumTripletValue(int[] nums) {
        long maxx=0;
        int premaxdiff=0,premax=0;

        for(int x:nums)
        {
            maxx=Math.max(maxx,(long)premaxdiff*x);
            premaxdiff=Math.max(premaxdiff,premax-x);
            premax=Math.max(premax,x);
        }
        
        return maxx==0? 0:maxx;
    }
}

 

2、无限数组的最短子数组 - 前缀和 + 滑动窗口

2875. 无限数组的最短子数组

思路:

第一次思路跟灵神一样!激动!

设sum为数组值之和

因为求的是子数组的和,因此可以用前缀和优化

无穷个拼接数组,实际上就是【某后段+中间完整段+某前段】,中间完整段之和是固定的

因此我们可以只考虑两端拼接后的数组newnums,找newnums中子数组之和 = target%sum 的最短元素个数minx,最后答案返回minx+中间段数*数组元素个数即可

当我们去掉中间完整段后,找满足条件的最小子数组长度可以用滑动窗口

java">class Solution {
    public int minSizeSubarray(int[] nums, int target) {
        int n=nums.length,res=Integer.MAX_VALUE;
        long tol=0;
        
        int[] s=new int[2*n+1];

        for(int i=1;i<=2*n;i++) s[i]=s[i-1]+nums[(i-1)%n]; //求两段连起来的数组的前缀和
        
        int st=0;
        for(int ed=0;ed<2*n;ed++) //滑动窗口求最短元素个数
        {
            tol=s[ed+1]-s[st];
            while(tol>target%s[n])
            {
                tol-=nums[st++%n];
            }
            if(tol==target%s[n]) res=Math.min(res,ed-st+1);
        }

        return res==Integer.MAX_VALUE? -1:res+(int)(target/s[n])*n; //最后再加上中间省略的完整段
    }
}


http://www.niftyadmin.cn/n/5121318.html

相关文章

【哈希数组】【字符串 转化为 字符数组】Leetcode 383 赎金信

【哈希表】【字符串 转化为 字符数组】Leetcode 383 赎金信 解法1 【哈希数组】 String 转化为 字符数组char[ ] .toCharArray ⭐️String 转化为 字符数组char[ ] .toCharArray 解法1 【哈希数组】 String 转化为 字符数组char[ ] .toCharArray 时间复杂度O(N) 这个解决方案…

成集云 | 成销云-移动订货集成用友NC | 解决方案

方案介绍 成销云移动订货系统支持多终端下单、业务员代下单、分级定价、数据分析、财务结算、对接ERP等功能&#xff0c;帮助客户解决、订货困难、错单漏单、价格体系混乱等问题&#xff0c;为商家提供更精准的营销和库存管理手段。 用友NC是用友NC产品的全新系列&#xff0c…

家电翻页电子画册制作秘籍,轻松打造炫酷电子书!

在家电市场上&#xff0c;翻页电子画册已经成为了越来越多人的选择。它不仅具有传统纸质画册的优点&#xff0c;还具有更多的功能和特点&#xff0c;如翻页动画、音效等&#xff0c;让阅读变得更加有趣和生动。那么&#xff0c;如何制作一款炫酷的电子画册呢&#xff1f;今天就…

微机原理:汇编指令集——调用传送指令、算术运算指令、转移类指令(详解)

文章目录 一、通用传送类指令1、数据传送指令2、堆栈操作指令 二、算术运算指令1、总图2、加减运算指令2.1 例子2.2 INC/DEC指令 3、比较指令 三、转移类指令1、无条件转移2、有条件转移2.1 无符号数条件转移指令2.2 有符号数条件转移指令2.3 例题一2.4 循环控制指令&#xff0…

在window系统用 python 做slam回环检测和图优化位姿(附代码思路)

因为 fast lio 没有回环模块&#xff0c;现有的添加回环的一些 github 项目工程又各自有各自的问题&#xff0c;所以我把它每个节点的点云数据和位姿信息保存了下来&#xff0c;自己做一个单独的回环图优化模块&#xff0c;和 LIO 激光里程计模块完全解耦&#xff0c;并且要足够…

文件防泄密软件哪个好?

文件防泄密软件哪个好&#xff1f; 在互联网数据时代发展模式下&#xff0c;很多企业的数据都是公司的重要命脉&#xff0c;然后也会有很多人铤而走险&#xff0c;盗取公司机密信息&#xff0c;做违法的事情&#xff0c;然而&#xff0c;保护好公司数据不被泄密成了很多老板头…

hive使用中的参数优化与问题排查

1.使用hive的虚拟列排查错误案例 set hive.exec.rowoffsettrue; SELECT –输入文件名 INPUT__FILE__NAME, –文件中的块内偏移量 BLOCK__OFFSET__INSIDE__FILE, –文件行偏移量 ROW__OFFSET__INSIDE__BLOCK, * from hdp_lbg_zhaopin_defaultdb.zzdetail where dt‘20201117’…

【Python机器学习】零基础掌握HistGradientBoostingRegressor集成学习

如何更准确地预测糖尿病患者的未来健康状况? 糖尿病是一个普遍存在的健康问题,对患者的生活质量有着严重影响。医生和研究人员经常依赖各种数据,如年龄、性别、体重和血糖水平,来预测糖尿病患者的未来健康状况。但是,传统的预测方法可能不够精准。 那么有没有更先进、更…