给定一个包含n
个向量的向量,其中n
是未知的或可以改变,我如何找到所有子向量中出现的第一项?
例如,在这种情况下:
std::vector<std::vector<int>> vec = { { 5, 7, 11, 12, 17, 23, 27 },
{ 8, 10, 12, 15, 17, 23, 28 },
{ 1, 2, 5, 6, 12, 22, 23 },
{ 3, 7, 9, 12, 17, 23, 28 } };
答案将是12
(对于4个子向量中的每一个从左到右,12
是出现在所有子向量中的第一个数字)。
我知道,在这种情况下,因为只有4个子向量,我可以硬编码一个4层循环来实现这一点,但我需要一个解决方案,将与内部向量的数量未知或变化。
--编辑1 --
添加@harold的评论说明
子向量并不总是排序的,我只是在这个例子中这样做,所以它更容易看。
如果两个数字同样快出现,那么任何一个数字都可以接受。例如:
std::vector<std::vector<int>> vec = { { 0, 1 },
{ 1, 0 } };
那么0
或1
都是可以接受的。
--编辑2 --
添加@PaulMcKenzie的评论澄清
如果在所有子向量中不存在相同的项,则优选地返回某种错误代码,例如。-9999
。我能想到的唯一其他可能性是导致错误发生,然后调用者必须检查并知道如何处理。
--编辑3 --
@PaulMcKenzie添加进一步澄清以供评论
每个子向量内的数字可以不是唯一的。例如:
std::vector<std::vector<int>> vec = { { 1, 2, 3, 1 },
{ 2, 3, 4, 3 },
{ 1, 2, 1, 3 } };
所有3个子向量都具有重复。2
和3
是出现在所有子向量中的唯一值。考虑值2
和3
,最早出现的是第二子向量中的值2
索引0,因此2
将是答案。
3条答案
按热度按时间5q4ezhmt1#
您可以使用
std::unordered_map
沿着std::unordered_set
来记录每个整数的计数,并返回达到子向量数量的第一个整数。下面是一个例子:
输出:
b5lpy0ml2#
一个简单的方法是:
构造一组第一个数组。
构造一组第二个数组。
构造一个集合,它是前两个集合的交集。
继续将该集合与从列表的其余部分构造的集合相交。
按照您认为应该首先考虑的项的升序顺序迭代向量。
出现在最终相交集中的第一个遇到的项是结果。
这个算法的复杂度很容易计算,我认为它不容易改进。
eufgjt7s3#
以下是我相对简单的解决方案:
我认为@PaulMcKenzie上面的解决方案要快得多,所以我将其标记为答案。