在向量中查找大于 0(或通常为 k)的最小元素的最佳方法是什么?
What is the best way to look for the smallest element greater than 0 (or maybe in general k) in a vector?
我正在做一个问题,其中一部分要求我反复找到向量中的最小元素,直到它们都是 0。 我用来做的代码是这样的:
loop
int minE = INT_MAX;
for(int z = 0; z < arr.size(); z++) {
if(arr[z] > 0) {
if(arr[z] < minE) minE = arr[z];
}
}
if(minE == INT_MAX) minE = 0; // I had a case to handle them being 0, so I turn them to 0 if all elements are <= 0
// other things (subtract minE from all positive elements and count elements with that turn to 0)
endloop
现在我知道很可能没有办法比线性时间更快,但我只是想知道 STL 中的某些功能是否可以用来实现这种事情,比如min() from limits
或lower_bound
或min_element
或其他东西?
编辑:刚刚意识到问题基本上是计数排序,或者只是计数排序,或者可能对它进行一些轻微的修改,问题更多的是关于库函数而不是关于问题,所以不要太介意这篇文章!
这是一个要用reduce操作解决的问题,顺便说一下,它也可以整齐地并行化。
通常,您可以将std::reduce
与std::min
相结合。在您的情况下,您需要一个在检查零值后调用std::min
的函子/lambda。
在 C++20 中,您还可以使用view::filter
从考虑范围中删除零值。
如果你反复搜索同一个向量,直到它们都0
,我建议从零值过滤向量(取 O(N((,然后对其余部分进行排序(取 O(NlogN(,然后从低端在常量时间内pop()
元素——这对于大型数组来说会快得多。
您可以在第一步中筛选小于或大于K
的值,不一定0
。
如果可以修改向量中元素的顺序,但不想修改单个值,则可以使用 STL 堆算法。
首先在 O(n( 时间内将非零元素划分到前面,将零元素分区到后面。 然后对非零值执行make_heap
操作,这将需要O(numOfNonZeroElements)
,然后在此范围内重复执行pop_heap
(需要O(log(numOfNonZeroElements))
时间(,这会将前面的元素放在非零范围的后面,然后将非零范围减少 1。整体复杂性O(n) + O(numOfNonZeroElements*log(numOfNonZeroElements))
。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
ostream& operator<< (ostream& out, const vector<int>& V)
{
for (int e : V)
out << e << ' ';
return out;
}
int main()
{
int n;
cin >> n;
vector<int> A(n);
for (int& e : A)
cin >> e;
partition(A.begin(), A.end(), [](int e) { return e > 0; });
cout << A << endl;
vector<int>::iterator begin, end;
begin = A.begin();
for (end = A.begin(); end < A.end() && *end > 0; end = next(end));
make_heap(begin, end, greater<int>());
while (begin < end && A.front() > 0)
{
cout << A.front() << endl; // perform operation on A.front() here
pop_heap(begin, end, greater<int>());
cout << A << endl;
end = prev(end);
}
}
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?
- 在向量中查找大于 0(或通常为 k)的最小元素的最佳方法是什么?
- C++将所有元素从矢量复制到地图/unordered_map的最佳方法
- 打印所有儿童树元素的最佳算法?
- 对列表列表中的元素进行分组的最佳方式
- 查找字符串是否包含字符串向量的任何一个元素的最佳方法
- 将结构的所有元素归零的最佳方法
- 遍历 STL 映射(集/多集)的最佳方法,同时元素可能会在循环期间被删除并重新插入?
- 使用其范围版本从容器中删除元素的最佳方法
- 用于随机访问和元素循环的最佳数据结构(C++)
- 查找矩阵中只有'0'元素的第一行的最佳方法?
- 为具有可变元素(C++)的优先级队列确定最佳ADT
- 创建 1 个元素集的最佳最简单最快方法是什么?(C++)
- 找到组合对之间共享元素的最佳方式
- 在运行时按索引访问 std::tuple 元素的最佳方法
- 找出所有给定数组中公共元素的最佳算法
- 从向量中获取n个最佳元素
- 在转换一个向量的元素时,连接两个向量的最佳方式是什么
- 用于有序元素的最佳容器