1. 程式人生 > 其它 >第7天--演算法(區間和的個數)

第7天--演算法(區間和的個數)

1.leetCode 327題

給你一個整數陣列nums 以及兩個整數lower 和 upper 。求陣列中,值位於範圍 [lower, upper] (包含lower和upper)之內的 區間和的個數 。

區間和S(i, j)表示在nums中,位置從i到j的元素之和,包含i和j(i ≤ j)。

classSolution{ publicintcountRangeSum(int[]nums,intlower,intupper){ longsum[]=newlong[nums.length]; longres=0; for(inti=0;i<nums.length;i++){ res+=nums[i];
sum[i]=res; } returnmergeSort(sum,0,sum.length-1,lower,upper); } publicintmergeSort(longarr[],intleft,intright,intlower,intupper){ if(left==right){ if(arr[left]>=lower&&arr[left]<=upper){ return1; }else{ return0; } } intmid=(left+right)>>1; returnmergeSort(arr,left,mid,lower,upper)+mergeSort(arr,mid+1,right,lower,upper)+merge(arr,left,mid,right,lower,upper);
} publicintmerge(longarr[],intleft,intmid,intright,intlower,intupper){ intans=0; intwindowL=left; intwindowR=left; for(inti=mid+1;i<=right;i++){ longmin=arr[i]-upper; longmax=arr[i]-lower; while(windowL<=mid&&arr[windowL]<min){ windowL++; } while(windowR<=mid&&arr[windowR]<=max){
windowR++; } ans+=windowR-windowL; } ints1=left; ints2=mid+1; inti=0; longtemp[]=newlong[right-left+1]; while(s1<=mid&&s2<=right){ if(arr[s1]<=arr[s2]){ temp[i++]=arr[s1++]; }else{ temp[i++]=arr[s2++]; } } while(s1<=mid){ temp[i++]=arr[s1++]; } while(s2<=right){ temp[i++]=arr[s2++]; } for(intj=0;j<temp.length;j++){ arr[left+j]=temp[j]; } returnans; } }