Oferta 53-I de Sword Finger. Encuentre el número I en la matriz ordenada (variante de búsqueda binaria, es decir, lower_bound (), upper_bound () a mano)

Jueves 4 de febrero de 2021, hace buen tiempo [No te lamentes del pasado, no desperdicies el presente, no temas al futuro]



1. Introducción

Oferta 53-I de Sword Finger. Encuentra el número I en la matriz ordenada
Inserte la descripción de la imagen aquí

2. Solución

2.1 límite_inferior 结合 límite_uperior

lower_bound (): devuelve el primero es mayor o igual a la ubicación de un elemento de destino , es menor que el retorno end ()
upper_bound, (): devuelve el primero es mayor que las posiciones de destino de los elementos son menores o iguales, luego regresa end ()

class Solution {
    
    
public:
    int search(vector<int>& nums, int target) {
    
    
        vector<int>::iterator it_beg = lower_bound(nums.begin(),nums.end(),target);
        // target不存在的情况
        if(it_beg==nums.end() || *it_beg != target) return 0;
        // 因为上面已经判断过target不存在的情况,所以这里要么返回end(),要么返回第一个
        // 大于target的元素位置,这两种情况可以合并
        vector<int>::iterator it_end = upper_bound(nums.begin(),nums.end(),target);
        // 返回最终结果
        return it_end - it_beg;   
    }
};

2.2 手 撸 límite_inferior () 、 límite_uperior ()

Aquí está la variante de búsqueda binaria, lower_bound () y upper_bound () a mano.
El siguiente es el código, hay 4 detalles en total, se recomienda memorizarlo para no estar nervioso durante la entrevista y olvidar si debe ser =, si se escribe como -1 o más +1.

class Solution {
    
    
public:
    int search(vector<int>& nums, int target) {
    
    
        if(nums.empty()) return 0;
        int idx_beg = 0, idx_end = 0;
        int n = nums.size();

        // 返回 第一个等于target 的元素位置(类似lower_bound,稍有改动),都不等于的话返回 0
        int l = 0, r = n - 1; // 细节1:r = n - 1
        while(l < r){
    
     // 细节2:l < r
            int m = l + (r - l)/2;
            // 细节3:三种情况分开写,便于理解
            if(nums[m] < target) l = m + 1;
            else if(nums[m] == target) r = m;
            else  r = m - 1;
        }
        // 细节4:l == r 的情况单独判断
        if(nums[l]==target) idx_beg = l;
        else return 0;

        // 返回 第一个大于target 的元素位置(类似upper_bound,稍有改动),都小于等于的话
        // 返回最后的索引+1(其实就是对应end())
        l = 0, r = n - 1; // 细节1:r = n - 1
        while(l < r){
    
     // 细节2:l < r
            int m = l + (r - l)/2;
            // 细节3:三种情况分开写,便于理解
            if(nums[m] < target) l = m + 1;
            else if(nums[m] == target) l = m + 1;
            else  r = m;
        }
        // 细节4:l == r 的情况单独判断
        // 如果这里等于,那么就都小于等于target,返回最后的索引+1(对应end())
        if(nums[l]==target) idx_end = l + 1;
        // 否则,返回第一个大于target的元素位置
        else idx_end = l;
    
        return idx_end - idx_beg;
    }
};

referencias

"Oferta de Sword Finger Segunda Edición"

https://www.cnblogs.com/mxj961116/p/11945444.html

Supongo que te gusta

Origin blog.csdn.net/m0_37433111/article/details/113665070
Recomendado
Clasificación