Maison > développement back-end > C++ > Écrivez du code en C++ pour trouver le nombre de sous-tableaux avec des bits ou des valeurs supérieurs ou égaux à K

Écrivez du code en C++ pour trouver le nombre de sous-tableaux avec des bits ou des valeurs supérieurs ou égaux à K

WBOY
Libérer: 2023-08-27 15:17:06
avant
1083 Les gens l'ont consulté

Écrivez du code en C++ pour trouver le nombre de sous-tableaux avec des bits ou des valeurs supérieurs ou égaux à K

Dans cet article, nous expliquerons brièvement comment résoudre le nombre de sous-tableaux avec OR>=K au niveau du bit en C++. Nous avons donc un tableau arr[] et un entier K, et nous devons trouver le nombre de sous-tableaux dont le OU (OU au niveau du bit) est supérieur ou égal à K. Voici donc l'exemple du problème donné -

Input: arr[] = {1, 2, 3} K = 3
Output: 4

Bitwise OR of sub-arrays:
{1} = 1
{1, 2} = 3
{1, 2, 3} = 3
{2} = 2
{2, 3} = 3
{3} = 3
4 sub-arrays have bitwise OR ≥ 3
Input: arr[] = {3, 4, 5} K = 6
Output: 2
Copier après la connexion

Façons de trouver la solution

Nous allons maintenant utiliser deux méthodes différentes pour résoudre le problème en utilisant C++ -

Force brute

Dans cette méthode, nous allons simplement Parcourez tous les sous-tableaux qui peuvent être formés et vérifiez si OR est supérieur ou égal à K. Si oui, nous ajouterons notre réponse.

Exemple

#include <bits/stdc++.h>
using namespace std;
int main(){
    int arr[] = {1, 2, 3}; // given array.
    int k = 3;
    int size = sizeof(arr) / sizeof(int); // the size of our array.
    int answer = 0; // the counter variable.
    for(int i = 0; i < size; i++){
        int bitwise = 0; // the variable that we compare to k.
        for(int j = i; j < size; j++){ // all the subarrays starting from i.
            bitwise = bitwise | arr[j];
            if(bitwise >= k) // if bitwise >= k increment answer.
               answer++;
        }
    }
    cout << answer << "\n";
    return 0;
}
Copier après la connexion

Output

4
Copier après la connexion
Copier après la connexion

Cette méthode est très simple mais elle a ses inconvénients car cette méthode n'est pas bonne pour des contraintes plus élevées et pour des contraintes plus élevées cela prend trop de temps car ceci La complexité temporelle de cette méthode est O( N *N), où N est la taille du tableau donné, nous allons donc maintenant adopter une méthode efficace.

Méthode efficace

Dans cette méthode, nous utiliserons certaines propriétés de l'opérateur OU, c'est-à-dire que même si nous ajoutons plus de nombres, il ne diminuera pas, donc si nous obtenons un sous-tableau de i à j, son OU est supérieur ou égal à K, alors chaque sous-tableau contenant la plage {i,j} aura un OU supérieur à K. Nous profitons de cette propriété et améliorons notre code.

Exemple

#include <bits/stdc++.h>
#define N 1000
using namespace std;
int t[4*N];
void build(int* a, int v, int start, int end){ // segment tree building
    if(start == end){
       t[v] = a[start];
       return;
    }
    int mid = (start + end)/2;
    build(a, 2 * v, start, mid);
    build(a, 2 * v + 1, mid + 1, end);
    t[v] = t[2 * v] | t[2 * v + 1];
}
int query(int v, int tl, int tr, int l, int r){ // for processing our queries or subarrays.
    if (l > r)
       return 0;
    if(tl == l && tr == r)
       return t[v];
    int tm = (tl + tr)/2;
    int q1 = query(2*v, tl, tm, l, min(tm, r));
    int q2 = query((2*v)+1, tm+1, tr, max(tm+1, l), r);
    return q1 | q2;
}
int main(){
    int arr[] = {1, 2, 3}; // given array.
    int k = 3;
    int size = sizeof(arr) / sizeof(arr[0]); // the size of our array.
    int answer = 0; // the counter variable.
    build(arr, 1, 0, size - 1); // building segment tree.
    for(int i = 0; i < size; i++){
        int start = i, end = size-1;
        int ind = INT_MAX;
        while(start <= end){ // binary search
            int mid = (start + end) / 2;
            if(query(1, 0, size-1, i, mid) >= k){ // checking subarray.
               ind = min(mid, ind);
               end = mid - 1;
            }
            else
               start = mid + 1;
        }
        if(ind != INT_MAX) // if ind is changed then increment the answer.
            answer += size - ind;
    }
    cout << answer << "\n";
    return 0;
}
Copier après la connexion

Output

4
Copier après la connexion
Copier après la connexion

Dans cette méthode, nous utilisons la recherche binaire et l'arbre de segments, ce qui permet de réduire la complexité temporelle de O(N*N) à O(Nlog(N)), c'est très bien . Désormais, contrairement à la procédure précédente, cette procédure peut également être appliquée à des contraintes plus importantes.

Conclusion

Dans cet article, nous avons résolu un problème pour trouver le nombre de sous-tableaux avec OR >= K en utilisant recherche binaire et arbres de segments avec une complexité temporelle O(nlog(n)). Nous avons également appris un programme C++ pour résoudre ce problème et une manière complète de résoudre ce problème (normale et efficace). Nous pouvons écrire le même programme dans d'autres langages tels que C, Java, Python et d'autres langages. J'espère que cet article vous sera utile.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:tutorialspoint.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal