大家好,今天是周一。上几个算法,一直在讲归并排序,今天再开一个。再说两个话题。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 *区间和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
