【数学】【排序】用最少的点,访问数组中的所有区间

题目:EPI  13.12

我的代码与书上的代码略有不同,是从题目13.11中得到的启发。方法是先把数组A排序,然后用一个变量cur记录当前已经遍历的区间的交集,cur初始化为A[0],从A[1]开始遍历数组,若当前遍历到的元素A[i] 与 cur有交集,则更新cur;若没有交集,则从cur中选一个点填入返回值res,然后cur=A[i]。

typedef int TimeType;

class Interval
{
public:
	TimeType left,right;
	Interval(const TimeType &a,const TimeType &b):left(a),right(b){}
	const bool operator<(const Interval &a)const
	{
		if(left!=a.left)
			return left<a.left;
		else
			return right<a.right;
	}
};

vector<TimeType> covering(vector<Interval>  A)
{
	vector<TimeType> res;
	if(A.empty())
		return res;
	sort(A.begin(),A.end());
	Interval cur=A[0];//记录当前区间的交集
	for(int i=1;i<A.size();i++)
	{
		//肯定有cur<=A[i]
		if(A[i].left<=cur.right)//有交集
		{
			//缩小cur范围
			int r=min(cur.right,A[i].right);
			cur.left=A[i].left;
			cur.right=r;
		}
		else
		{
			res.push_back(cur.right);
			cur=A[i];
		}
	}
	res.push_back(cur.right);
	return res;
}
时间: 2024-10-31 12:24:49

【数学】【排序】用最少的点,访问数组中的所有区间的相关文章

smarty访问数组中的数据,如果是关联数组直接用点.

$tpl=new Smarty();//新建一个smarty对象,我使用的是Smarty-3.1.6版本 1.设置smarty模板路径$tpl->setTemplateDir():默认情况下是templates 2.设置smarty模板编译路径$tpl->setCompileDir();默认情况下是templates_c 3.设置smarty模板引擎的左右 分隔符, $tpl->left_delimiter="<{";        $tpl->right

perl访问数组中参数

数组一个是存储标量值的无序列表变量. 数组变量以 @ 开头.访问数组元素使用 $ + 变量名称 + [索引值] 格式来读取,实例如下: #!/usr/bin/perl @names = ("google", "runoob", "taobao"); print "\$names[0] = $names[0]\n"; #$names[0] = google 用变量接收数组及访问: my $list = get_list();/*

C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置

#include <stdio.h> int main(void) { /* 选择排序算法 原理:从数组中 找出最小的元素然后交换位置: */ int a[10] = {9,5,10,7,2,3,1,6,8,4}; int i=0,j=0; int n = sizeof(a)/4; //外循环n-1轮 for(i=0;i<n-1;i++){ int pos = i;//始终指向最小的位置 for(j=i+1;j<n;j++){ if(a[j]<a[pos]){ pos = j

排序 2:选择排序 - 不断选出剩余数组中最小的元素

选择排序过程:首先,选出数组中最小的元素,将它与数组中第一个元素交换,然后找出次小的元素,并将它与数组中第二个元素交换...直至整个数组排序完成.即通过不断选出剩余数组中最小的元素实现. 选择排序时间复杂度:O(N^2) 实现程序: void Selection_sort(Item a[], int l, int r) { for(int i = l; i < r; i++) //最后一个无需交换 { int min = i; for(int j = i + 1; j <= r; j++) {

对数组中的对象进行升序以及降序的排序方法(其中对象类型是系统类型).

[cpp] view plaincopyprint? <span style="font-size:32px;">NSArray *arr = [[NSArray alloc] initWithObjects:@"aa",@"bb",@"cc",@"dd",@"ee",@"ff", nil]; //1.对数组进行升序排序 //sortedArrayUsin

数组中的趣味题一

无论是参加面试还是笔试,数组都是常考的内容,并且考察数组的知识往往结合着比较有意思的算法.在这里参照网上的资料和平时看过的相关书籍总结一下,作为自己的面试复习材料吧.我知道这个总结肯定有遗漏或者是不对的地方,希望大家看到可以优化和改正的的地方,帮帮忙给点新思路吧.谢谢大家~~ 1.求数组中的最大值(最小值) 问题描述:给定一个整数数组arr,找出其中的最大值(最小值). 解决思路:传统的方法就是遍历一次数组即可得到最大值(最小值),时间复杂度是O(N):现在说另外一个思路利用二分,即将数组分成元

剑指Offer编程题(Java实现)——二维数组中的查找

题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解题思路 根据排序特点,该二维数组中的一个数,小于它的数一定在其左边,大于它的数一定在其下边. 因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来缩小查找区间,当前元素的查找区间为左下角的所有元素. 时间复杂度 O(M + N),空间复杂度 O(1).其中 M 为行数,N

归并排序:数组中的逆序对。

4 class Solution { 5 public: 6 int InversePairs(vector<int> data) { 7 if(data.size()<=1) return 0;//如果少于等于1个元素,直接返回0 8 int* copy=new int[data.size()]; 9 //初始化该数组,该数组作为存放临时排序的结果,最后要将排序的结果复制到原数组中 10 for(unsigned int i=0;i<data.size();i++) 11 cop

LeetCode:最少移动次数使得数组元素相等||【462】

LeetCode:最少移动次数使得数组元素相等||[462] 题目描述 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最多为10000. 例如: 输入: [1,2,3] 输出: 2 说明: 只有两个动作是必要的(记得每一步仅可使其中一个元素加1或减1): [1,2,3] => [2,2,3] => [2,2,2] 题目分析 一个直观的理解是这样的,如果我们只有两个数字的话,那么我们使得他们变成相等元素的最少步数是多