鱼C论坛

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

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

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

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

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

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

  3. /*
  4. *author:Ambert
  5. *date:2022/01/12
  6. */

  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <iostream>
  10. #include <vector>
  11. #include<numeric>
  12. #include <algorithm>
  13. using namespace std;

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

  31. int main(){
  32.         vector<vector<int> > a = {{1,3},{2,6},{8,15},{10,18}};
  33.         Solution solution;
  34.         cout<<solution.merge(a)<<endl;
  35. }
复制代码


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

  3. /*
  4. *author:Ambert
  5. *date:2022/01/12
  6. */

  7. #include <algorithm>
  8. #include <iostream>
  9. #include <numeric>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <vector>

  13. using namespace std;

  14. class Solution {
  15. public:
  16.     //vector<vector<int>> merge(vector<vector<int>> &intervals) {
  17.     const vector<vector<int>> merge(vector<vector<int>> &intervals) {
  18.         int n = intervals.size();
  19.         if(n == 0 || n == 1)
  20.             return intervals;
  21.         //sort(intervals.begin(), intervals.end()); //使得数组内的数组有序
  22.         sort(intervals.begin(), intervals.end(), [](const vector<int> &a, const vector<int> &b) {return a[0] < b[0];}); //使得数组内的数组有序
  23.         vector<vector<int>> merged;
  24.         for(int i = 0; i < n; ++i) {
  25.             int L = intervals[i][0],
  26.                 R = intervals[i][1]; //定义数组的最左指针和最右指针
  27.             if(!merged.size() ||
  28.                 merged.back()[1] < L) //前一个的最右元素小于后一个数组最左元素则不变
  29.                 merged.push_back({L, R});
  30.             else
  31.                 merged.back()[1] =
  32.                     max(merged.back()[1], R); //否则,取最大的一个更新最右元素
  33.         }
  34.         return merged;
  35.     }
  36. };

  37. ostream &operator<<(ostream &os, const vector<vector<int>> &rhs) {
  38.     for(const auto &i: rhs) {
  39.         for(const auto &j: i) {
  40.             os << j << " ";
  41.         }
  42.         os << endl;
  43.     }
  44.     return os;
  45. }

  46. int main() {
  47.     vector<vector<int>> a = {{1, 3}, {2, 6}, {8, 15}, {10, 18}};
  48.     Solution solution;
  49.     cout << solution.merge(a) << endl;
  50.     return 0;
  51. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-1-13 11:46:32 | 显示全部楼层
本帖最后由 Stubborn 于 2022-1-13 12:07 编辑

  1. 输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
  2. 输出:[[1,6],[8,10],[15,18]]
  3. 解释:区间 [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` 选择大的一个数字


  1. # intervals前提是排序好得,根据区间的起始位置。
  2. result = []
  3. result.append(intervals[0])
  4. FOR E IN intervals:
  5.     # 不能合并,把当前元素添加到结果集
  6.     if E[0] > result[-1][1] :  result.append(E)
  7.     #  能合并,从B or B` 选择大的元素跟新到列表
  8.     else:  result[-1][1] = max( result[-1][1],  E[1])
  9.    
复制代码




评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  3. /*
  4. *author:Ambert
  5. *date:2022/01/12
  6. */

  7. #include <algorithm>
  8. #include <iostream>
  9. #include <numeric>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <vector>

  13. using namespace std;

  14. class Solution {
  15. public:
  16.     //vector<vector<int>> merge(vector<vector<int>> &intervals) {
  17.     const vector<vector<int>> merge(vector<vector<int>> &intervals) {
  18.         int n = intervals.size();
  19.         if(n == 0 || n == 1)
  20.             return intervals;
  21.         //sort(intervals.begin(), intervals.end()); //使得数组内的数组有序
  22.         sort(intervals.begin(), intervals.end(), [](const vector<int> &a, const vector<int> &b) {return a[0] < b[0];}); //使得数组内的数组有序
  23.         vector<vector<int>> merged;
  24.         for(int i = 0; i < n; ++i) {
  25.             int L = intervals[i][0],
  26.                 R = intervals[i][1]; //定义数组的最左指针和最右指针
  27.             if(!merged.size() ||
  28.                 merged.back()[1] < L) //前一个的最右元素小于后一个数组最左元素则不变
  29.                 merged.push_back({L, R});
  30.             else
  31.                 merged.back()[1] =
  32.                     max(merged.back()[1], R); //否则,取最大的一个更新最右元素
  33.         }
  34.         return merged;
  35.     }
  36. };

  37. ostream &operator<<(ostream &os, const vector<vector<int>> &rhs) {
  38.     for(const auto &i: rhs) {
  39.         for(const auto &j: i) {
  40.             os << j << " ";
  41.         }
  42.         os << endl;
  43.     }
  44.     return os;
  45. }

  46. int main() {
  47.     vector<vector<int>> a = {{1, 3}, {2, 6}, {8, 15}, {10, 18}};
  48.     Solution solution;
  49.     cout << solution.merge(a) << endl;
  50.     return 0;
  51. }
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢,这两天没看帖子,我自己后来发现问题了:在主函数中不能直接cout数组
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  1. #include <iostream>
  2. #include <vector>
  3. #include <numeric>
  4. #include <algorithm>
  5. using namespace std;

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

  23. int main(){
  24.         vector<vector<int>> a = {{1,3},{2,6},{8,15},{10,18}};
  25.         Solution solution;
  26.         vector<vector<int> > b = solution.mergeInterval(a);
  27.         for (decltype(b.size()) i = 0; i < b.size(); ++i) {
  28.             for (decltype(b[i].size()) j = 0; j < b[i].size(); ++j) {
  29.                     cout << b[i][j] << " ";
  30.                 }
  31.    //cout << endl;
  32.         }
  33. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我感觉还是重载operator<<
直接这样输出比较好 cout << solution.merge(a) << endl;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个 intervals 还是不要引用比较好,merge 这个函数不应该修改main函数中的那个变量a
虽然这样效率不高

  1.     //vector<vector<int>> merge(vector<vector<int>> &intervals) {
  2.     //const vector<vector<int>> merge(vector<vector<int>> &intervals) {
  3.     const vector<vector<int>> merge(vector<vector<int>> intervals) {
  4.         int n = intervals.size();
  5.         if(n == 0 || n == 1)
  6.             return intervals;
  7.         //sort(intervals.begin(), intervals.end()); //使得数组内的数组有序
  8.         sort(intervals.begin(), intervals.end(), [](const vector<int> &a, const vector<int> &b) {return a[0] < b[0];}); //使得数组内的数组有序
  9.         vector<vector<int>> merged;
  10.         for(int i = 0; i < n; ++i) {
  11.             int L = intervals[i][0],
  12.                 R = intervals[i][1]; //定义数组的最左指针和最右指针
  13.             if(!merged.size() ||
  14.                 merged.back()[1] < L) //前一个的最右元素小于后一个数组最左元素则不变
  15.                 merged.push_back({L, R});
  16.             else
  17.                 merged.back()[1] =
  18.                     max(merged.back()[1], R); //否则,取最大的一个更新最右元素
  19.         }
  20.         return merged;
  21.     }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 02:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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