2354. Nombre de paires de nombres de haute qualité - tri, déduplication et statistiques

2354. Nombre de paires de nombres de haute qualité - tri, déduplication et statistiques

Vous recevez un tableau de nombres entiers positifs avec des index commençant à 0 et un entier positif k.

La paire de nombres (num1, num2) est une bonne paire de nombres si les conditions suivantes sont remplies :

num1 和 num2 都 在数组 nums 中存在。
num1 OR num2 和 num1 AND num2 的二进制表示中值为 1 的位数之和大于等于 k ,其中 OR 是按位 或 操作,而 AND 是按位 与 操作。

Renvoie le nombre de paires de nombres distinctes de haute qualité.

Si a != c ou b != d , alors (a, b) et (c, d) sont considérés comme deux paires de nombres différentes. Par exemple, (1, 2) et (2, 1) sont différents.

Remarque : Si num1 apparaît au moins une fois dans le tableau, la paire de nombres (num1, num2) satisfaisant num1 == num2 peut également être une bonne paire de nombres.

Exemple 1:

Entrée : nums = [1,2,3,1], k = 3
Sortie : 5
Explication : Il existe plusieurs paires de nombres de haute qualité comme suit :

  • (3, 3) Les représentations binaires des deux : (3 ET 3) et (3 OU 3) sont égales à (11). La somme des chiffres de valeur 1 est égale à 2 + 2 = 4, ce qui est supérieur ou égal à k = 3.
  • (2, 3) et (3, 2) : La représentation binaire de (2 ET 3) est égale à (10), et la représentation binaire de (2 OU 3) est égale à (11). La somme des chiffres valant 1 est 1 + 2 = 3.
  • (1, 3) et (3, 1) : La représentation binaire de (1 ET 3) est égale à (01), et la représentation binaire de (1 OU 3) est égale à (11). La somme des chiffres valant 1 est 1 + 2 = 3.
    Le nombre de bonnes paires de nombres est donc 5.

Exemple 2 :

Entrée : nums = [5,1,1], k = 10
Sortie : 0
Explication : Il n'y a pas de bonne paire de nombres dans ce tableau.

Cette question est très difficile. Je vous propose de l'étudier. L'idée est qu'il faut supprimer les doublons, donc on fait un tri puis on supprime les doublons. Après cela, on compte le nombre de 1 binaires dans chaque nombre. Le code solution est comme suit:

int cmp(const void* a, const void* b) {
    
    

    return *(int*)a - *(int*)b;

}

long long countExcellentPairs(int* nums, int numsSize, int k){
    
    
    long long re=0;
    int r[32];

    int newsize = 0;
    qsort(nums, numsSize, sizeof(int), cmp);    //排序原数组

    for (int i = 1; i < numsSize; i++) {
    
    

        if (nums[i] != nums[newsize]) nums[++newsize] = nums[i];

    }//去重原数组

    ++newsize;  

    
   // printf("newsize %d ",newsize);
    numsSize=newsize;


    for(int i=0;i<32;i++){
    
    
        r[i]=0;
    }
     for(int i=0;i<numsSize;i++){
    
    
         int count=0;
         int t=nums[i];
         while(t){
    
    
             if(t&1){
    
    
                 count++;
             }
             t=t>>1;
         }
         r[count]++;
      
    }
    //  for(int i=0;i<32;i++){
    
    
    //     printf("%d ",r[i]);
    // }
    for(int i=0;i<32;i++){
    
    
        if(r[i]!=0){
    
    
            for(int j=i;j<32;j++){
    
    
                if(r[j]!=0){
    
    
                    if(i+j>=k&&i==j){
    
    
                        re=re+(r[j])*(r[j]-1)+r[j];


                    }
                    else if(i+j>=k){
    
    
                        re=re+r[i]*r[j]*2;
                    }
                }
            }
        }
    }
    return re;


}

Supongo que te gusta

Origin blog.csdn.net/weixin_43327597/article/details/133319813
Recomendado
Clasificación