当前位置: 首页 > 后端技术 > Java

LeetCode第一道Hard题(LeetCode327区间和数)被归并排序秒杀,帅

时间:2023-04-01 14:40:22 Java

大家好,今天是周一。上几个算法,一直在讲归并排序,今天再开一个。再说两个话题。1.大于右边数字的两倍。合并排序怕大家忘了,所以我先带一道题练习一下。1.题目描述在给定数组中查找当前数大于右边数两倍的数2.示例数组:[6,7,3,2,1]当前数大于右边数两倍的数右边是(6,2),(6,1),(7,3),(7,2),(7,1),(3,1)一共是6。3.思考仔细阅读归并排序:解决小和逆序问题的小伙伴都知道,我们在解决的时候,是把它和归并操作放在一起的。但是这个问题如果和merge操作一起解决,难度和代码复杂度都会很高。那么,我们换个角度,很简单,我们把求数的操作和合并的操作分成两个循环分别计算,瞬间就豁然开朗了。4、详细参考代码只有归并操作代码,其他和归并排序完全一样privatestaticintmerge(int[]arr,intl,intmid,intr){intnum=0;//l...mid,mid+1...r,右组当前搜索范围[mid+1,windowR)intwindowR=mid+1;对于(inti=l;i<=mid;i++){while(windowR<=r&&arr[i]>(arr[windowR]<<1)){windowR++;所以不是(windowR-(mid+1))+1num+=windowR-mid-1;}int[]help=newint[r-l+1];诠释我=0;pRintpLint=l;=中+1;while(pL<=mid&&pR<=r){//谁是小副本(左组的等份副本)help[i++]=arr[pL]<=arr[pR]?arr[PL++]:Arr[PR++];}while(PL<=Mid){help[i++]=Arr[PL++];}while(pr<=r){help[i++]=Arr[pr++];}for(intj=0;j*给你一个整数数组nums和两个整数lower和upper.*求数组中数值在[lower,upper]范围内(包括lower和upper)的区间和的个数。*

*区间和S(i,j)表示nums中位置i到j的元素之和,包括i和j(i≤j)。*

*结果直接在leetcode中测试*

**@authorJava与算法学习:周一*/publicclassCountOfRangeSum{publicstaticintcountRangeSum(int[]nums,intlower,intupper){if(nums==null||nums.length<1){返回0;}}//求原数组的前缀和long[]preSum=newlong[nums.length];preSum[0]=int[0];(i=1;i=lower&&preSum[L]<=upper?1:0;}intmid=L+((R-L)>>1);//返回合并过程中满足条件的左右组的累加和returnprocess(preSum,L,mid,lower,upper)+process(preSum,mid+1,R,lower,upper)+merge(preSum,L,mid,R,lower,upper);}privatestaticintmerge(long[]arr,intL,intmid,intR,intlower,intupper){//累计和数intans=0;//左组要找的左位置(必须从当前L位置开始)intwindowL=L;//左组要找的右边位置Sideposition(也必须从当前L位置开始)intwindowR=L;//对右组中的每个数X,求左组中[X-upper,X-lower]之间值的个数for(inti=mid+1;i<=R;i++){longmin=arr[i]-上限;longmax=arr[i]-更低;//因为在左组,所以下标不能超过mid//找到第一个当前值大于max的位置(因为等于max,所以右移一位,所以这个位置不包括)while(windowR<=mid&&arr[windowR]<=max){windowR++;}//找到当前值大于等于min的第一个位置(因为等于时不对,所以它包含这个位置)。最后累加和满足要求的个数为[windowL,windowR),即windowR-windowL和windowR是开区间,所以没有+1ans+=windowR-windowL;}}//下面是经典的合并过程long[]help=newlong[R-L+1];plintinti=0;升;内部pR=中间+1;while(pL<=mid&&pR<=R){help[i++]=arr[pL]<=arr[pR]?arr[pL++]:arr[pR++];wlehi}(pL<=mid){help[i++]=arr[pL++];}while(pR<=R){help[i++]=arr[pR++];}}lethfor(int;jng=0j++){arr[L+j]=help[j];自己的