LeetCode 实践练习56-60

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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值