zoukankan      html  css  js  c++  java
  • 区间调度之区间`合并`

    问题:给出若干区间,区间之间可能有交集。输出合并之后的区间。

    例题

    1.Merge Intervals

    https://leetcode-cn.com/problems/merge-intervals/

    思路

    按照区间的左端点,右端点从小道大排序。遍历每一个区间,若当前区间curr.start <= last.end,证明区间有可能有交集,需要更新上一个区间last.end的值。若curr.start > last.end 证明两个区间不可能有交集。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    struct Record {
        int left, right;
    };
    bool cmp(Record a, Record b) {
        if (a.left != b.left) {
            return a.left < b.left;
        }
        else {
            return a.right < b.right;
        }
    }
    class Solution {
    public:
        vector<vector<int>> merge(vector<vector<int>>& intervals) {
            int n = intervals.size();
            if (n == 0) {
                return *(new vector<vector<int>>);
            }
            Record* rec = new Record[n];
            for (int i = 0; i < n; i++) {
                rec[i].left = intervals[i][0];
                rec[i].right = intervals[i][1];
            }
            sort(rec, rec + n, cmp);
            Record* ans = new Record[n];
            int k = 0;
            ans[k].left = rec[k].left;
            ans[k].right = rec[k].right;
            for (int curr = 1; curr < n; curr++) {
                if (ans[k].right >= rec[curr].left&&rec[curr].right >ans[k].right) {
                    ans[k].right = rec[curr].right;
                }
                else if (ans[k].right < rec[curr].left) {
                    ans[++k].left = rec[curr].left;
                    ans[k].right = rec[curr].right;
                }
            }
            vector < vector<int>>* ans_vc = new vector < vector<int>>;
            for (int i = 0; i <= k; i++) {
                vector<int>* temp = new vector<int>;
                temp->push_back(ans[i].left);
                temp->push_back(ans[i].right);
                ans_vc->push_back(*temp);
            }
            return *ans_vc;
        }
    };
    

    2.剩下的树

    https://www.nowcoder.com/practice/f5787c69f5cf41499ba4706bc93700a2?tpId=40&tqId=21356&tPage=2&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking

    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    struct node
    {
    	int left, right;
    };
    bool cmp(node a, node b) {
    	if (a.left != b.left) {
    		return a.left < b.left;
    	}
    	else {
    		return a.right < b.right;
    	}
    }
    int main()
    {
    	//freopen("in.text", "r", stdin);
    	int n,m;
    	while (cin>>n>>m)
    	{
    		node* rec = new node[m];
    		for (int i = 0; i < m; i++)
    		{
    			cin >> rec[i].left >> rec[i].right;
    		}
    		sort(rec, rec + m, cmp);
    		vector<node> vc;
    		node temp;
    		temp.left = rec[0].left;
    		temp.right = rec[0].right;
    		vc.push_back(temp);
    		for (int curr = 1; curr < m; curr++)
    		{
    			int last = vc.size() - 1;
    			if (vc[last].right >= rec[curr].left && vc[last].right < rec[curr].right) {
    				vc[last].right = rec[curr].right;
    			}
    			else if(rec[curr].left>vc[last].right){
    				temp.left = rec[curr].left;
    				temp.right = rec[curr].right;
    				vc.push_back(temp);
    			}
    		}
    
    		
    		int ans = (n + 1);
    		for (int i = 0; i < vc.size(); i++)
    		{
    			//cout << "[" << vc[i].left << "," << vc[i].right << "]" << endl;
    			ans -= (vc[i].right - vc[i].left + 1);
    		}
    		cout << ans << endl;
    	}
    	//fclose(stdin);
    }
    
    
  • 相关阅读:
    【译】常用网络端口号列表
    使用Simian进行重复代码检测
    使用GCOV进行代码覆盖率统计
    AFL Fuzz安装及完成一次简单的模糊测试
    数据可视化概述
    完成下方的 which_date() 函数,并返回某一起始时间后特定一段时间的日期
    linux用户不在sudoers文件中
    linux /lib64/libc.so.6: version `GLIBC_2.17′ not found
    web api 2.0 上传文件超过4M时,出现404错误
    Centos7 编译安装 Nginx Mariadb Asp.net Core2 (实测 笔记 Centos 7.7 + Openssl 1.1.1d + Mariadb 10.3.7 + Nginx 1.16.1 + Asp.net. Core 2 )
  • 原文地址:https://www.cnblogs.com/custoyth/p/12720281.html
Copyright © 2011-2022 走看看