【发布时间】:2017-01-11 14:31:51
【问题描述】:
我正在编写一个操作来查找向量的最低缺失元素,V = 1..N + 1。这必须以 O(N) 时间复杂度执行。
解决方案一:
std::vector<int> A {3,4,1,4,6,7};
int main()
{
int max_el = *std::max_element(A.begin(), A.end()); //Find max element
std::vector<int> V(max_el);
std::iota(V.begin(), V.end(), 1) //Populate V with all int's up to max element
for(unsigned into i {0}; i < A.size(); i++)
{
int index = A[i] - 1;
if(A[i] == V[index]) //Search V in O(1)
{
V[index] = max_el; //Set each to max_el, leaving the missing int
}
}
return *std::min_element(V.begin(), V.end()); //Find missing int as its the lowest (hasn't been set to max_el)
}
//Output: 2
这完全没问题。
但是,我现在正试图让它与包含负整数的向量一起使用。
解决方案二:
我的逻辑是采用相同的方法,但是根据向量的大小和向量中负整数的数量对索引进行“加权”:
std::vector<int> A {-1, -4, -2, 0, 3, 2, 1}
int main()
{
int max_el = *std::max_element(A.begin(), A.end());
int min_el = *std::min_element(A.begin(), A.end());
int min_el_abs = abs(min_el); //Convert min element to absolute
int total = min_el_abs + max_el;
std::vector<int> V(total + 1);
std::iota(V.begin(), V.end(), min_el);
int index;
//Find amount of negative int's
int first_pos;
for(unsigned int i {0}; i < A.size(); i++)
{
if(A[i] >= 0) {first_pos = i; break;}
}
for(unsigned int i {0}; i < A.size(); i++)
{
if(A[i] <= 0) //If negative
{
index = (A.size() - first_pos) - abs(A[i]);
} else
{
index = (A[i] + 1) + first_pos;
}
if(A[i] == V[index])
{
V[index] = 0;
}
}
return *std::min_element(V.begin(), V.end());
}
//Output: -3
解决方案 2 无法比较两个向量(A 和 V)的值,因为使用上述 positive int 方法计算 index 不起作用。
1) 如何让我的解决方案 2 使用负整数的无序向量?
2) 如何编辑我的解决方案 2 以使用正向量和负整数向量?
【问题讨论】:
-
为什么不起作用?它做了什么不该做或不该做的事情?
-
为负整数创建另一个向量并使用
i*(-1)而不是i作为索引 -
如果您在向量中放置一个较大的值(如果 N 是向量的大小,而不是最大值),那么您的解决方案 1 甚至不是 O(N)。如果对值有限制,请将它们放在问题中。将该解决方案扩展到负值就像找到最小值并从所有值中减去它,然后将其添加回最终答案一样简单。
-
分配
V向量并用std::iota填充都是O(max_el)。