Notas de cepillado de Leetcode (C++) - matriz

Notas de cepillado de Leetcode (C++) - matriz

Ordene las ideas en el proceso de repasar las preguntas, resúmalas y compártalas aquí.
dirección de github: https://github.com/lvjian0706/Leetcode-solutions
El proyecto de github se creó recientemente, y el código y las ideas se cargarán uno tras otro. El código está basado en C++ y python. Al mismo tiempo, el algoritmo de clasificación básico también se clasificará y cargará.

66. Más uno

Dado un entero no negativo representado por una matriz no vacía de enteros, suma uno al número.

El dígito más alto se almacena en la cabeza de la matriz, y cada elemento de la matriz almacena solo un número.

Puede suponer que este entero no comenzará con un cero que no sea el entero 0.

Ejemplo 1:
Entrada: [1,2,3]
Salida: [1,2,4]
Explicación: La matriz de entrada representa el número 123.
Ejemplo 2:
Entrada: [4,3,2,1]
Salida: [4,3,2,2]
Explicación: La matriz de entrada representa el número 4321.

class Solution {
    
    
public:
    /*
    给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
    1. 将该数组反转,编程从低位到高位的顺序;
    2. 进行加1运算,其中,定义flag变量用于记录是否进位,其中运算到最后如果flag等于1,说明答案数组比原始数组多1位,需要push_back(1);
    3. 将结果数组反转;
    */
    vector<int> plusOne(vector<int>& digits) {
    
    
        reverse(digits.begin(), digits.end());
        int flag = 1;
        for(int i=0; i<digits.size(); i++){
    
    
            if((digits[i] + flag) >= 10){
    
    
                digits[i] = (digits[i] + flag) % 10;
            }
            else{
    
    
                digits[i] = digits[i] + flag;
                flag = 0;
            }
        }
        if(flag==1) digits.push_back(1);
        reverse(digits.begin(), digits.end());
        return digits;
    }
};

350. Intersección de dos matrices II

Dadas dos matrices, escribe una función para calcular su intersección.

Ejemplo 1:
Entrada: nums1 = [1,2,2,1], nums2 = [2,2]
Salida: [2,2]
Ejemplo 2:
Entrada: nums1 = [4,9,5], nums2 = [9 ,4,9,8,4]
salida: [4,9]

class Solution {
    
    
public:
    /*
    计算两个数组的交集:
    方法1. 先排序,后使用双指针遍历
    1. 将两个数组排序,从小到大即可;
    2. 定义两个指针用于遍历两个数组;
    3. 当两个元素相等时,存入答案中,nums1[i]<nums2[j]时,i++,找比nums1[i]大的元素继续判断,当nums1[i]>nums2[j]时,j++,找比nums2[j]大的元素继续判断;
    */
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
    
    
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());
        vector<int> ans;
        int i=0, j=0;
        while(i<nums1.size() && j<nums2.size()){
    
    
            if(nums1[i]==nums2[j]){
    
    
                ans.push_back(nums1[i]);
                i++;
                j++;
            }
            else if(nums1[i]<nums2[j]) i++;
            else if(nums1[i]>nums2[j]) j++;
        }
        return ans;
    }
};


class Solution {
    
    
public:
    /*
    计算两个数组的交集:
    方法2. 使用哈希表存放nums1中的元素以及出现次数,然后遍历nums2并将重复元素放入答案中,遍历过程中,碰到重复元素需要将哈希表中的出现次数减1;
    */
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
    
    
        map<int, int> nums1_map;
        vector<int> ans;
        for(int i=0; i<nums1.size(); i++){
    
    
            if(nums1_map.find(nums1[i]) == nums1_map.end()){
    
    
                nums1_map[nums1[i]] = 1;
            }
            else nums1_map[nums1[i]]++;
        }
        for(int j=0; j<nums2.size(); j++){
    
    
            if(nums1_map.find(nums2[j]) != nums1_map.end() && nums1_map[nums2[j]] > 0){
    
    
                ans.push_back(nums2[j]);
                nums1_map[nums2[j]]--;
            }
        }
        return ans;
    }
};

Supongo que te gusta

Origin blog.csdn.net/weixin_43273742/article/details/107733421
Recomendado
Clasificación