鱼C论坛

 找回密码
 立即注册
查看: 1211|回复: 6

[已解决]二维vector相关问题

[复制链接]
发表于 2022-1-12 17:58:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在leetcode上刷题,最后自己在ide上试的时候发现写不来主函数....
/*以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi].
*请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。*/

/*
*author:Ambert
*date:2022/01/12
*/

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include<numeric>
#include <algorithm> 
using namespace std;

class Solution{
public:
        vector<vector<int>> merge(vector<vector<int>>& intervals){
                int n = intervals.size();
                if(n==0||n==1) return intervals;
                sort(intervals.begin(),intervals.end()); //使得数组内的数组有序 
                vector<vector<int>> merged;
                for(int i=0;i<n;++i){
                        int L=intervals[i][0],R=intervals[i][1]; //定义数组的最左指针和最右指针
                        if(!merged.size()||merged.back()[1]<L) //前一个的最右元素小于后一个数组最左元素则不变 
                                merged.push_back({L,R});
                        else
                                merged.back()[1]=max(merged.back()[1],R); //否则,取最大的一个更新最右元素 
                }
                return merged;
        }
};

int main(){
        vector<vector<int> > a = {{1,3},{2,6},{8,15},{10,18}};
        Solution solution;
        cout<<solution.merge(a)<<endl;
}

报错如下,请前辈指教
uTools_1641981421803.png
最佳答案
2022-1-14 11:58:19
本帖最后由 人造人 于 2022-1-14 11:59 编辑
/*以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi].
 *请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。*/

/*
 *author:Ambert
 *date:2022/01/12
 */

#include <algorithm>
#include <iostream>
#include <numeric>
#include <stdio.h>
#include <stdlib.h>
#include <vector>

using namespace std;

class Solution {
public:
    //vector<vector<int>> merge(vector<vector<int>> &intervals) {
    const vector<vector<int>> merge(vector<vector<int>> &intervals) {
        int n = intervals.size();
        if(n == 0 || n == 1)
            return intervals;
        //sort(intervals.begin(), intervals.end()); //使得数组内的数组有序
        sort(intervals.begin(), intervals.end(), [](const vector<int> &a, const vector<int> &b) {return a[0] < b[0];}); //使得数组内的数组有序
        vector<vector<int>> merged;
        for(int i = 0; i < n; ++i) {
            int L = intervals[i][0],
                R = intervals[i][1]; //定义数组的最左指针和最右指针
            if(!merged.size() ||
                merged.back()[1] < L) //前一个的最右元素小于后一个数组最左元素则不变
                merged.push_back({L, R});
            else
                merged.back()[1] =
                    max(merged.back()[1], R); //否则,取最大的一个更新最右元素
        }
        return merged;
    }
};

ostream &operator<<(ostream &os, const vector<vector<int>> &rhs) {
    for(const auto &i: rhs) {
        for(const auto &j: i) {
            os << j << " ";
        }
        os << endl;
    }
    return os;
}

int main() {
    vector<vector<int>> a = {{1, 3}, {2, 6}, {8, 15}, {10, 18}};
    Solution solution;
    cout << solution.merge(a) << endl;
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-13 11:46:32 | 显示全部楼层
本帖最后由 Stubborn 于 2022-1-13 12:07 编辑
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]

需要明确知道,我们在处理intervals ,会发生的情况,需要合并区间,或者合并不了区间,什么情况会发生,连续的任意两个区间【A, B】 和 【A`, B`】

第一覆盖的情况需要合并 【1, 6】【2, 3】:   A < A `   , B > B`
第二重叠的情况需要合并 【1, 6】【2, 8】:   A < A `   , B < B`
第三,不能合并【1, 6】【8, 10】:    A < A `   , B < B` , 但是  A` > B  ,导致区间发生了‘隔离’

综合上面的情况,可以分成2类
1类,A` > B ,不能合并
2类,A` < B ,可以合并,从B , B` 选择大的一个数字
# intervals前提是排序好得,根据区间的起始位置。
result = []
result.append(intervals[0])
FOR E IN intervals:
    # 不能合并,把当前元素添加到结果集
    if E[0] > result[-1][1] :  result.append(E)
    #  能合并,从B or B` 选择大的元素跟新到列表
    else:  result[-1][1] = max( result[-1][1],  E[1])
    



评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
人造人 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-14 11:58:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 人造人 于 2022-1-14 11:59 编辑
/*以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi].
 *请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。*/

/*
 *author:Ambert
 *date:2022/01/12
 */

#include <algorithm>
#include <iostream>
#include <numeric>
#include <stdio.h>
#include <stdlib.h>
#include <vector>

using namespace std;

class Solution {
public:
    //vector<vector<int>> merge(vector<vector<int>> &intervals) {
    const vector<vector<int>> merge(vector<vector<int>> &intervals) {
        int n = intervals.size();
        if(n == 0 || n == 1)
            return intervals;
        //sort(intervals.begin(), intervals.end()); //使得数组内的数组有序
        sort(intervals.begin(), intervals.end(), [](const vector<int> &a, const vector<int> &b) {return a[0] < b[0];}); //使得数组内的数组有序
        vector<vector<int>> merged;
        for(int i = 0; i < n; ++i) {
            int L = intervals[i][0],
                R = intervals[i][1]; //定义数组的最左指针和最右指针
            if(!merged.size() ||
                merged.back()[1] < L) //前一个的最右元素小于后一个数组最左元素则不变
                merged.push_back({L, R});
            else
                merged.back()[1] =
                    max(merged.back()[1], R); //否则,取最大的一个更新最右元素
        }
        return merged;
    }
};

ostream &operator<<(ostream &os, const vector<vector<int>> &rhs) {
    for(const auto &i: rhs) {
        for(const auto &j: i) {
            os << j << " ";
        }
        os << endl;
    }
    return os;
}

int main() {
    vector<vector<int>> a = {{1, 3}, {2, 6}, {8, 15}, {10, 18}};
    Solution solution;
    cout << solution.merge(a) << endl;
    return 0;
}

评分

参与人数 2荣誉 +10 鱼币 +10 贡献 +6 收起 理由
DOLLAR. + 5 + 5 + 3 谢谢
Stubborn + 5 + 5 + 3 C++我看着头疼

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-17 13:06:23 | 显示全部楼层
Stubborn 发表于 2022-1-13 11:46
需要明确知道,我们在处理intervals ,会发生的情况,需要合并区间,或者合并不了区间,什么情况会发生 ...

感谢,这两天没看帖子,我自己后来发现问题了:在主函数中不能直接cout数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-17 13:07:12 | 显示全部楼层
我把改好的代码贴出来,有需要的朋友可以看看
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm> 
using namespace std;

class Solution{
public:
        vector<vector<int>> mergeInterval(vector<vector<int>>& intervals){
                int n = intervals.size();
                if(n==0||n==1) return intervals;
                sort(intervals.begin(),intervals.end()); //是数组内的数组有序
                vector<vector<int>> merged;
                for(int i=0;i<n;++i){
                        int L=intervals[i][0],R=intervals[i][1]; //定义数组的最左指针位置及最右指针位置
                        if(!merged.size()||merged.back()[1]<L) //前一个的最右元素小于后一个数组的最左元素则不变
                                merged.push_back({L,R});
                        else
                                merged.back()[1]=max(merged.back()[1],R); //否则,取最大的一个元素更新最右指针
                }
                return merged;
        }
};

int main(){
        vector<vector<int>> a = {{1,3},{2,6},{8,15},{10,18}};
        Solution solution;
        vector<vector<int> > b = solution.mergeInterval(a);
        for (decltype(b.size()) i = 0; i < b.size(); ++i) {
            for (decltype(b[i].size()) j = 0; j < b[i].size(); ++j) {
                    cout << b[i][j] << " ";
                }
   //cout << endl;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-17 13:14:39 | 显示全部楼层
DOLLAR. 发表于 2022-1-17 13:07
我把改好的代码贴出来,有需要的朋友可以看看

我感觉还是重载operator<<
直接这样输出比较好 cout << solution.merge(a) << endl;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-17 13:18:40 | 显示全部楼层
DOLLAR. 发表于 2022-1-17 13:07
我把改好的代码贴出来,有需要的朋友可以看看

这个 intervals 还是不要引用比较好,merge 这个函数不应该修改main函数中的那个变量a
虽然这样效率不高
    //vector<vector<int>> merge(vector<vector<int>> &intervals) {
    //const vector<vector<int>> merge(vector<vector<int>> &intervals) {
    const vector<vector<int>> merge(vector<vector<int>> intervals) {
        int n = intervals.size();
        if(n == 0 || n == 1)
            return intervals;
        //sort(intervals.begin(), intervals.end()); //使得数组内的数组有序
        sort(intervals.begin(), intervals.end(), [](const vector<int> &a, const vector<int> &b) {return a[0] < b[0];}); //使得数组内的数组有序
        vector<vector<int>> merged;
        for(int i = 0; i < n; ++i) {
            int L = intervals[i][0],
                R = intervals[i][1]; //定义数组的最左指针和最右指针
            if(!merged.size() ||
                merged.back()[1] < L) //前一个的最右元素小于后一个数组最左元素则不变
                merged.push_back({L, R});
            else
                merged.back()[1] =
                    max(merged.back()[1], R); //否则,取最大的一个更新最右元素
        }
        return merged;
    }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 08:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表