Jueves 4 de febrero de 2021, hace buen tiempo [No te lamentes del pasado, no desperdicies el presente, no temas al futuro]
Contenido de este artículo
1. Introducción
Oferta 53-I de Sword Finger. Encuentra el número I en la matriz ordenada
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