题目:240. 搜索二维矩阵II
解法:Z字型
从右上角开始遍历,查询左下到(x,y)范围内的大小,如果大于target,则y–,如果小于target,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;
}
};
题目:435. 无重叠区间
解法:贪心
按照每个区间的右端点从小到大排序,初始以第一个区间的右端点为右界,判断接下来的区间左端点是否大于等于右界,若是,右界更新为新区间的右端点,否则判断下一个区间。
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; //总数减去不重叠区间数即为需要去除的区间数量
}
};