Sujet : 240. Recherche d'une matrice bidimensionnelle II
Solution : forme en Z
Parcourez depuis le coin supérieur droit, interrogez la taille du coin inférieur gauche jusqu'à (x, y), si elle est supérieure à la cible, alors y–, si elle est inférieure à la cible, x++
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m=matrix.size(), n=matrix[0].size();
int x=0, y=n-1;
while(x<m && y>=0){
if(matrix[x][y]==target){
return true;
}else if(matrix[x][y]>target){
--y;
}else{
++x;
}
}
return false;
}
};
Sujet : 435. Pas d'intervalles qui se chevauchent
Solution : gourmand
Les extrémités droites de chaque intervalle sont triées de petit à grand. L'extrémité droite du premier intervalle est initialement utilisée comme limite droite. Il est jugé si l'extrémité gauche de l'intervalle suivant est supérieure ou égale à la limite droite. Si ainsi, la limite droite est mise à jour jusqu'à l'extrémité droite du nouvel intervalle. Sinon, déterminez l'intervalle suivant.
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.empty()) return 0; //特判
sort(intervals.begin(), intervals.end(), [](vector<int> &u, vector<int> &v){
return u[1]<v[1];
}); //按照右端点对intervals进行排序,注意判断函数的写法[]{}
int n = intervals.size();
int right = intervals[0][1], ans=1; //初始化右界right和ans(不重叠区间数量,注意为1,即intervals[0])
for(int i=1; i<n; ++i){
//从1开始
if(intervals[i][0]>=right){
//如果区间左端点大于等于右界,则不重叠,ans++,更新右界
++ans;
right = intervals[i][1];
}
}
return n-ans; //总数减去不重叠区间数即为需要去除的区间数量
}
};