LeetCode—56(合并区间)
方法:发现若区间重叠,则后面区间的start > 前面区间的end。但是前提是得排序。因此先进行排序,将第一个区间存入结果,然后第二个开始遍历区间集,判断是否重叠,如果有重叠则将res中最后一个区间的end值与当前遍历end值取max。然后继续遍历。
C++代码:
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
if(intervals.empty()) return {};
sort(intervals.begin(),intervals.end(),[](Interval&a,Interval&b){return a.start < b.start;});
vector<Interval> res{intervals[0]};
for(int i = 1;i < intervals.size();i++){
if(res.back().end < intervals[i].start){
res.push_back(intervals[i]);
}else{
res.back().end = max(res.back().end,intervals[i].end);
}
}
return res;
}
};
LeetCode—57(插入区间)
方法:在上一个合并区间的基础上改变的,循环遍历区间集,每一次判断是够可以合并,不可以则将其加入到res,若可以则合并为插入区间,(期间判断下一个区间加入是否大于插入区间),直至将插入区间加入res,随后将其他的全部加入res.返回即可。若循环结束,还没有返回,表示插入区间在最后,则将其加入res,返回。(纪念渣渣自己独立写出,虽然很复杂)
C++代码:
class Solution {
public:
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
if(intervals.empty()){//空则就返回newInterval
intervals.push_back(newInterval);
return intervals;
}
vector<Interval> res;
for(int i = 0;i < intervals.size();i++){
if(intervals[i].end < newInterval.start){//区间小于插区间,加入res
res.push_back(intervals[i]);
}else{
if(intervals[i].start > newInterval.end){//区间大于插区间,插区间加入res,剩余的全部加入res
res.push_back(newInterval);
res.insert(res.end(),intervals.begin()+i,intervals.begin()+intervals.size());//记住这个操作
return res;
}else{//合并区间
newInterval.start = min(newInterval.start,intervals[i].start);
newInterval.end = max(newInterval.end,intervals[i].end);
}
}
}
res.push_back(newInterval);//循环结束,将插区间加入
return res;
}
};
LeetCode—58(最后一个单词的长度)
方法:由于我们只关心最后一个单词的长度,因此我们可以直接从最后开始,首先把后面’ ‘去掉,随后计数最后一个单词的长度,直到再次到’ '或者遍历完字符串。
C++代码:
class Solution {
public:
int lengthOfLastWord(string s) {
int right = s.size()-1,res = 0;
while(right >= 0 && s[right] == ' ') right --;
while(right >= 0 && s[right] != ' ') {
right--;
res++;
}
return res;
}
};
LeetCode—59(螺旋矩阵II)
方法:这道题与54题(螺旋矩阵)类似,但是上一题是让输入螺旋数列,这次是让给出螺旋数列。以下代码根据54题相同的思路解出。
C++代码:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
//Runtime Error Message:reference binding to null pointer of type 'value_type'
//不初始化 就会报错
vector<vector<int>> res(n);//初始化
for (int i = 0;i < res.size();i++) res[i].resize(n); // 这里也要进行初始化
int up = 0,down = n-1,left = 0,right = n-1,cur = 1;
while(true){//四个判断条件一定要想清楚
for(int j = left;j <= right;j++) {res[up][j] = cur;cur++;}
if(++up > down) break;
for(int i = up;i <= down;i++) {res[i][right] = cur;cur++;}
if(--right < left) break;
for(int j = right;j >= left;--j) {res[down][j] = cur;cur++;}
if(--down < up) break;
for(int i = down;i >= up;--i) {res[i][left] = cur;cur++;}
if(++left > right) break;
}
return res;
}
};
LeetCode—60(第k个排序)
方法(自己的方法):自己的方法太麻烦,结果不对,得继续研究
C++代码:
class Solution {
public:
string getPermutation(int n, int k) {
string res;
int num = 0;
digui(n,k,num,res);
return res;
}
void digui(int n,int k,int num,string res){
if(n == 1) return ;
num = k/jc(n-1) + 1;
k = k%jc(n-1);
for(char c:res){
if(num == c - '0') num++;
}
res = res + ((char)(num + '0'));
digui(n-1,k,num,res);
}
int jc(int n) {
if(n == 1) // 终止状态
return 1;
else
return n * jc(n - 1); // 归纳项
}
};
C++正确代码:
class Solution {
public:
string getPermutation(int n, int k) {
string res;
string num = "123456789";
vector<int> f(n, 1);
for (int i = 1; i < n; ++i) f[i] = f[i - 1] * i;
--k;
for (int i = n; i >= 1; --i) {
int j = k / f[i - 1];
k %= f[i - 1];
res.push_back(num[j]);
num.erase(j, 1);
}
return res;
}
};