Soluciones a Problemas de Programación en C++

13. Encontrar Números Duplicados en un Arreglo

class Solucion {
public:
    int encontrarDuplicado(vector<int>& arreglo) {
        if(arreglo.empty()) return -1;
        unordered_map<int, int> contador;
        int tam = arreglo.size();
        for(int num : arreglo) {
            if(num < 0 || num >= tam) 
                return -1;
            contador[num]++;
        }
        for(auto& par : contador) {
            if(par.second > 1) 
                return par.first;
        }
        return -1;
    }
};

15. Búsqueda en Matriz Bidimensional

class Solucion {
public:
    bool buscarMatriz(vector<vector<int>> matriz, int objetivo) {
        if(matriz.empty() || matriz[0].empty()) return false;
        int fila = 0, col = matriz[0].size() - 1;
        while(fila < matriz.size() && col >= 0) {
            int valor = matriz[fila][col];
            if(valor == objetivo) return true;
            else if(valor > objetivo) col--;
            else fila++;
        }
        return false;
    }
};

21. Secuencia Fiboancci

class Solucion {
public:
    int fibonacci(int n) {
        if(n == 0) return 0;
        int prev = 0, actual = 1;
        for(int i = 1; i < n; i++) {
            int sig = prev + actual;
            prev = actual;
            actual = sig;
        }
        return actual;
    }
};

22. Mínimo en Arreglo Rotado

class Solucion {
public:
    int encontrarMinimo(vector<int>& nums) {
        if(nums.empty()) return -1;
        int minimo = nums[0];
        for(int i = 1; i < nums.size(); i++) {
            minimo = min(minimo, nums[i]);
        }
        return minimo;
    }
};

26. Contar Bits Activos

class Solucion {
public:
    int bitBajo(int x) {
        return x & -x;
    }
    int contarUnos(int n) {
        int total = 0;
        while(n) {
            n -= bitBajo(n);
            total++;
        }
        return total;
    }
};

35. Invertir Lista Enlazada

// Iterativo
class Solucion {
public:
    ListNode* invertirLista(ListNode* cabeza) {
        if(!cabeza || !cabeza->next) return cabeza;
        ListNode* anterior = cabeza;
        ListNode* actual = cabeza->next;
        while(actual) {
            ListNode* sig = actual->next;
            actual->next = anterior;
            anterior = actual;
            actual = sig;
        }
        cabeza->next = nullptr;
        return anterior;
    }
};

// Recursivo
class Solucion {
public:
    ListNode* invertirLista(ListNode* cabeza) {
        if(!cabeza || !cabeza->next) return cabeza;
        ListNode* resto = invertirLista(cabeza->next);
        cabeza->next->next = cabeza;
        cabeza->next = nullptr;
        return resto;
    }
};

36. Fusionar Listas Ordenadas

class Solucion {
public:
    ListNode* fusionar(ListNode* lista1, ListNode* lista2) {
        ListNode* ficticio = new ListNode(-1);
        ListNode* actual = ficticio;
        while(lista1 && lista2) {
            if(lista1->val < lista2->val) {
                actual->next = lista1;
                lista1 = lista1->next;
            } else {
                actual->next = lista2;
                lista2 = lista2->next;
            }
            actual = actual->next;
        }
        actual->next = lista1 ? lista1 : lista2;
        return ficticio->next;
    }
};

52. Elemento Mayoritario

class Solucion {
public:
    int elementoMayoritario(vector<int>& nums) {
        int cont = 0, candidato;
        for(int num : nums) {
            if(!cont) candidato = num;
            if(num == candidato) cont++;
            else cont--;
        }
        return candidato;
    }
};

53. k Elementos Más Pequeños

// Ordenamiento
class Solucion {
public:
    vector<int> menoresK(vector<int> entrada, int k) {
        sort(entrada.begin(), entrada.end());
        return vector<int>(entrada.begin(), entrada.begin() + k);
    }
};

// Min-Heap
class Solucion {
public:
    vector<int> menoresK(vector<int> entrada, int k) {
        priority_queue<int, vector<int>, greater<int>> heap;
        for(int num : entrada) heap.push(num);
        vector<int> resultado;
        while(k--) {
            resultado.push_back(heap.top());
            heap.pop();
        }
        return resultado;
    }
};

55. Máxima Suma Subarreglo

class Solucion {
public:
    int maxSubArray(vector<int>& nums) {
        int maxActual = nums[0];
        int maxGlobal = nums[0];
        for(int i = 1; i < nums.size(); i++) {
            maxActual = max(nums[i], maxActual + nums[i]);
            maxGlobal = max(maxGlobal, maxActual);
        }
        return maxGlobal;
    }
};

62. Generar Número Ugly

class Solucion {
public:
    int obtenerUgly(int n) {
        vector<int> uglies = {1};
        int i2 = 0, i3 = 0, i5 = 0;
        while(--n) {
            int sig = min({uglies[i2]*2, uglies[i3]*3, uglies[i5]*5});
            uglies.push_back(sig);
            if(sig == uglies[i2]*2) i2++;
            if(sig == uglies[i3]*3) i3++;
            if(sig == uglies[i5]*5) i5++;
        }
        return uglies.back();
    }
};

263. Verificar Número Ugly

class Solucion {
public:
    bool esUgly(int n) {
        if(n < 1) return false;
        while(n % 2 == 0) n /= 2;
        while(n % 3 == 0) n /= 3;
        while(n % 5 == 0) n /= 5;
        return n == 1;
    }
};

68. Número Faltante

class Solucion {
public:
    int encontrarFaltante(vector<int>& nums) {
        for(int i = 0; i < nums.size(); i++)
            if(i != nums[i]) return i;
        return nums.size();
    }
};

69. Elemento Igual a Índice

class Solucion {
public:
    int elementoIgualIndice(vector<int>& nums) {
        for(int i = 0; i < nums.size(); i++)
            if(i == nums[i]) return i;
        return -1;
    }
};

71. Profundidad de Árbol Binario

class Solucion {
public:
    int profundidad(TreeNode* raiz) {
        if(!raiz) return 0;
        return max(profundidad(raiz->left), profundidad(raiz->right)) + 1;
    }
};

73. Elementos Únicos en Arreglo

class Solucion {
public:
    vector<int> encontrarUnicos(vector<int>& nums) {
        unordered_map<int, int> frecuencia;
        for(int num : nums) frecuencia[num]++;
        vector<int> resultado;
        for(int num : nums)
            if(frecuencia[num] == 1)
                resultado.push_back(num);
        return resultado;
    }
};

77. Invertir Palabras

class Solucion {
public:
    string invertirPalabras(string s) {
        reverse(s.begin(), s.end());
        int inicio = 0;
        for(int i = 0; i <= s.size(); i++) {
            if(i == s.size() || s[i] == ' ') {
                reverse(s.begin() + inicio, s.begin() + i);
                inicio = i + 1;
            }
        }
        return s;
    }
};

78. Rotación Izquierda de Cadena

class Solucion {
public:
    string rotarIzquierda(string str, int n) {
        reverse(str.begin(), str.end());
        reverse(str.begin(), str.end() - n);
        reverse(str.end() - n, str.end());
        return str;
    }
};

Etiquetas: C++ algoritmos estructuras de datos Matrices Lista Enlazada

Publicado el 7-10 17:51