[Leetcode] 493.フリップペア(ツリー配列+離散化+二分)

タイトル説明:

ここに画像の説明を挿入

ACコード:


class Bit{
    
    
   private int n;
   private int[] C;
   public Bit(int n){
    
    
   this.n=n;
   C=new int[n+1];
   }
   public int lowbit(int x){
    
    return x&(-x);}
   public int getsum(int x){
    
    
   int sum=0;
   for(int i=x;i>0;i-=lowbit(i))    
   sum+=C[i];
   return sum;
   }
   public void update(int x,int v){
    
    
   for(int i=x;i<=n;i+=lowbit(i))    
    C[i]+=v;
   }
   }
class Solution {
    
    
    public int low(long []a,long x){
    
    
    int l=-1,r=a.length;
    while(l+1!=r){
    
    
    int m=(l+r)/2;
    if(a[m]<x) l=m;
    else r=m;
    }
    return l+1;
    }
    public int reversePairs(int[] nums) {
    
    
    int n=nums.length;
    long copy[]=new long[n];
    for(int i=0;i<n;i++) copy[i]=2l*nums[i];
    Arrays.sort(copy);
    Bit bit=new Bit(n);
    int ans=0;
    for(int i=n-1;i>=0;i--){
    
    
    ans+=bit.getsum(low(copy,1l*nums[i]));
    bit.update(low(copy,2l*nums[i])+1,1);
    }
    return ans;
    }
}

前のブログ:[Niuke.com]シーケンス間隔の最大値(ツリー配列)

おすすめ

転載: blog.csdn.net/IAMLSL/article/details/114298299