刷题笔记(知识点:排序,双指针)

不多废话,直接上代码;

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& in) 
    {
        if(!in.size()) return  {};
        sort(in.begin(),in.end());
        vector<vector<int>> ans;
        for(int i=0;i<in.size();i++)
        {
            int l = in[i][0], r = in[i][1];
            if(!ans.size()||ans[ans.size()-1][1]<l) ans.push_back({l,r});
            else ans[ans.size()-1][1]=max(ans[ans.size()-1][1],r);
        }

        return ans;

    }
};

这个解答方法是官方提供的,大致原理是:

        先将数组按照左边的数字排个序;然后将第一组数放进ans数组里面,然后往后遍历in数组,如果下一组数的左边大于ans最后面这组数的右边,那么就不会有交集,直接把这组数加到ans的后面;反过来,就证明有交集,那么就把ans里面做后那组数的右边等于这两组数中右边较大的那个数。

接下来是评论区的某位大佬解答:

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& in) 
    {
        int n=in.size();
        vector<vector<int>> ans;
        vector<int> l,r;
        for(int i=0;i<n;i++)
        {
            l.push_back(in[i][0]);
            r.push_back(in[i][1]);
        }

        sort(l.begin(),l.end());
        sort(r.begin(),r.end());

        for(int i=0,j=0;i<n;i++)
        {
            if(i==n-1||l[i+1]>r[i])
            {
                ans.push_back({l[j],r[i]});
                j=i+1;
            }
        }

        return ans;

    }
};

这个解答原理大致是:

        先把所有的左边数放到l数组里面,把所有的右边数放到r数组里面,然后排序;接下来定义两个指针,i指针不断的往后面遍历,直到找到相邻的左边大于右边的位置i(因为l[i]<r[i]恒成立,所以要找相邻的),那么r[i]就相当于是上一个阶段中右边最大的那个数,j指向的就是最小的左边那个数。然后更细j指向下一个阶段中最小的左边那个数。

官方解答:https://leetcode-cn.com/problems/merge-intervals/solution/he-bing-qu-jian-by-leetcode-solution/

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值