算法刷题计划(十六)合并区间、插入区间、最后一个单词的长度、螺旋矩阵 II

22 篇文章 0 订阅
20 篇文章 0 订阅
这篇博客介绍了LeetCode中涉及区间操作的两种问题——合并区间和插入区间,以及解决这两个问题的不同方法。同时,还讲解了如何找到字符串中最后一个单词的长度,并展示了生成螺旋矩阵的算法实现。这些题目覆盖了数组处理和二维空间的逻辑思维,对于提升编程能力很有帮助。
摘要由CSDN通过智能技术生成

一、合并区间

  • 题目
    在这里插入图片描述
  • 题解:
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        int n=intervals.size();
        vector<vector<int>>res;
        vector<int>start,end;
        for(int i=0;i<n;i++){
            start.emplace_back(intervals[i][0]);
            end.emplace_back(intervals[i][1]);
        }
        sort(start.begin(),start.end());
        sort(end.begin(),end.end());
        for(int i =0,j=0;i<n;i++){
            if(i==n-1||start[i+1]>end[i]){
                res.push_back({start[j],end[i]});
                j=i+1;
            }
        }
        return res;
    }
};

二、插入区间

  • 题目:
    在这里插入图片描述

  • 题解:

  • 方法一(合并区间方法+插入新数组):

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        if(intervals.size()==0&&newInterval.empty()) return {{}};
        vector<vector<int>>res;
        vector<vector<int>>copy=intervals;
        copy.push_back(newInterval);
        vector<int>start,end;
        for(int i=0;i<copy.size();i++){
            start.emplace_back(copy[i][0]);
            end.emplace_back(copy[i][1]);
        }
        sort(start.begin(),start.end());
        sort(end.begin(),end.end());

        for(int i=0, j=0;i<copy.size();i++){
            if(i==copy.size()-1||start[i+1]>end[i]){
                res.push_back({start[j],end[i]});
                j=i+1;
            }
        }
        return res;
     }
  • 方法二(分左右区间):
class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        vector<vector<int>>res;
        int left=newInterval[0];
        int right=newInterval[1];
        bool flag=false; 
        for(const auto&pr:intervals){
            //无交集,在左侧
            if(pr[0]>right){
                if(!flag){
                    res.push_back({left,right});
                    flag=true;
                }
                res.push_back(pr);
            }
            else if(pr[1]<left){//无交集,在右侧
                res.push_back(pr);
            }
            else{//有交集
                left=min(left,pr[0]);
                right=max(right,pr[1]);
            }
        }
        if(!flag){
            res.push_back({left,right});
        }
        return res;
    }
};

三、最后一个单词的长度

  • 题目:
    在这里插入图片描述
  • 题解:
class Solution {
public:
    int lengthOfLastWord(string s) {
        int n=s.size()-1;
        int len=0;
        for(int i=n;i>=0;i--){
            if(s[i]==' '&&len!=0)   break;
            else if(s[i]!=' '){
                len++;
            }
        }
        return len;
    }
};

四、螺旋矩阵 II

  • 题目:
    在这里插入图片描述
  • 题解:
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        if(n==1||n==0)  return {{n}};
        int left=0,right=n-1;
        int top=0,bottom=n-1;
        vector<vector<int>>matrix(n,vector<int>(n));
        int sum=n*n;
        int index=1;
        while(sum>=1){
            for(int i=left;i<=right&&sum>=1;i++){
                matrix[top][i]=index;
                index++;
                sum--;
            }
            top++;
            for(int i=top;i<=bottom&&sum>=1;i++){
                matrix[i][right]=index;
                index++;
                sum--;
            }
            right--;
            for(int i=right;i>=left&&sum>=1;i--){
                matrix[bottom][i]=index;
                index++;
                sum--;
            }
            bottom--;
            for(int i=bottom;i>=top&&sum>=1;i--){
                matrix[i][left]=index;
                index++;
                sum--;
            }
            left++;
        }
        return matrix;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值