我有一个按严格降序排列的数组和一个元素val
;我想找到数组中最大元素的索引,该索引小于val (如果val已经存在,则相等),我想在logn
时间内这样做。并且反转数组并执行upper_bound()不是一种选择。
EG。如果array为{10,5,3,1}且val为6,则该函数应返回1.
我对迭代器很新,并试着在upper_bound()中添加一个比较函数,以使其工作但失败了。我应该怎么做呢。
注意:我在发布之前检查了类似的问题并找到了一个,但不幸的是它与Java有关,所以。
答案 0 :(得分:3)
只需使用upper_bound
和正确的比较功能:
upper_bound
通常需要增加订单),因此您需要使用>
而不是<
。upper_bound
通常会将其排除在外),因此您需要使用>=
而不仅仅是>
。。
int data[] = {10,5,3,1};
auto item = std::upper_bound(std::begin(data), std::end(data), 6,
[](int a, int b) { return a >= b; });
现在你只需要将生成的迭代器转换为索引(在检查它之后有效):
if (item != std::end(data)) {
auto index = std::distance(std::begin(data), item);
std::cout << index << std::endl;
}
else
std::cout << "not found" << std::endl;
答案 1 :(得分:0)
使用带有比较功能的upper_bound()
arg。
答案 2 :(得分:0)
对于迭代方式,我可能会做的是从数组的末尾开始我的搜索val
值。即:
int indexFinder(int array[], int arraySize, int val){
for(int i = (val >= arraySize ? 0 : (arraySize - val)); i < arraySize; ++i){
if(array[i] <= val) return i;
}
}
此循环的一个关键是,一旦遇到任何小于或等于的值,它就会返回索引,将其限制为它找到的第一个案例。
它还会检查val
是否大于最大数组索引。