Ejercicios de cepillado de C++ (1): suma de tres números, eliminar elementos repetidos de una matriz ordenada

Introducción

Esta serie es para revisar y resumir las preguntas que se han cepillado antes y las que no se han cepillado. Al mismo tiempo, principalmente quiero intentar usar cpp para cepillar las preguntas. El año pasado, leí las preguntas del código de Wangdao muchas veces, pero no las entendía. Excepto que no aprendí c/c++ antes, las preguntas del libro básicamente no tenían un historial completo, así que a partir de esta sección , registraré las preguntas y las notas de cpp básicas relacionadas.

suma de tres

Tema Descripción

Dada una matriz nums que contiene n enteros, determine si hay tres elementos a, b, c en nums tales que a + b + c = 0. Encuentra todos los triples cuya suma sea 0 y no se repita.

Nota: Las respuestas no pueden contener triples duplicados.

Fuente: Código Leet

Ejemplo 1:

Entrada: números = [-1,0,1,2,-1,-4]
Salida: [[-1,-1,2],[-1,0,1]]

Ejemplo 2:

Entrada: números = []
Salida: []

Ejemplo 3:

Entrada: números = [0]
Salida: []

pensamiento algorítmico

Continuará

análisis de código

/* 从 nums[start] 开始,计算有序数组
 * nums 中所有和为 target 的二元组 */
vector<vector<int>> twoSumTarget(
    vector<int>& nums, int start, int target) {
    
    
    // 左指针改为从 start 开始,其他不变
    int lo = start, hi = nums.size() - 1;
    vector<vector<int>> res;
    while (lo < hi) {
    
    
        ...
    }
    return res;
}

/* 计算数组 nums 中所有和为 target 的三元组 */
vector<vector<int>> threeSumTarget(vector<int>& nums, int target) {
    
    
    // 数组得排个序
    sort(nums.begin(), nums.end());
    int n = nums.size();
    vector<vector<int>> res;
    // 穷举 threeSum 的第一个数
    for (int i = 0; i < n; i++) {
    
    
        // 对 target - nums[i] 计算 twoSum
        vector<vector<int>> 
            tuples = twoSumTarget(nums, i + 1, target - nums[i]);
        // 如果存在满足条件的二元组,再加上 nums[i] 就是结果三元组
        for (vector<int>& tuple : tuples) {
    
    
            tuple.push_back(nums[i]);
            res.push_back(tuple);
        }
        // 跳过第一个数字重复的情况,否则会出现重复结果
        while (i < n - 1 && nums[i] == nums[i + 1]) i++;
    }
    return res;
}

Eliminar elementos duplicados de la matriz ordenada

tema

pensamiento algorítmico

análisis de código

class Solution {
    
    
public:
    int removeDuplicates(vector<int>& nums) {
    
    
        if (nums.empty()) return 0; // 别忘记空数组的判断
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < (nums.size() - 1); fastIndex++){
    
    
            if(nums[fastIndex] != nums[fastIndex + 1]) {
    
     // 发现和后一个不相同
                nums[++slowIndex] = nums[fastIndex + 1]; //slowIndex = 0 的数据一定是不重复的,所以直接 ++slowIndex
            }
        }
        return slowIndex + 1; //别忘了slowIndex是从0开始的,所以返回slowIndex + 1
    }
};

Supongo que te gusta

Origin blog.csdn.net/submarineas/article/details/122954516
Recomendado
Clasificación