如何找到小于或等于X的最大值和大于或等于X的最小值?

时间:2016-06-01 10:14:10

标签: c++ algorithm binary-search divide-and-conquer

我正在尝试使用C ++中lower_bound库中的upper_boundalgorithm函数来查找以下内容:

  • 小于或等于 的最大值为数字X.
  • 最大值大于或等于 为数字X.

我写了以下代码:

#include <iostream>
#include <algorithm>

int main() {

    using namespace std;

    int numElems;
    cin >> numElems;

    int ar[numElems];
    for (int i = 0; i < numElems; ++i)
        cin >> ar[i];
    stable_sort(ar,ar+numElems);

    cout << "Input number X to find the largest number samller than or equal to X\n";
    int X;
    cin >> X;

    int *iter = lower_bound(ar,ar+numElems,X);
    if (iter == ar+numElems)
        cout << "Sorry, no such number exists\n";
    else if (*iter != X && iter != ar)
        cout << *(iter-1) << endl;
    else 
        cout << *iter << endl;

    cout << "Input number X to find the smallest number greater than or equal to X\n";
    cin >> X;

    int *iter2 = lower_bound(ar,ar+numElems,X);
    if (iter2 == ar+numElems)
        cout << "Sorry, no such number exists\n";
    else
        cout << *iter2 << endl;

    return 0;   
}

但对于一些随机测试案例,它给了我错误的答案。

我的程序中是否有人能找到错误的代码?

3 个答案:

答案 0 :(得分:1)

让我告诉你你在哪里犯了一些错误:

iter == ar

正如你所看到的,第一个测试用例是罪魁祸首,你错误地假设如果最后一个元素是最后一个元素之后的一个,那么它就没有找到该元素。但事实并非如此,因为最后一个元素总是是最小元素! 您应该删除条件。

接下来,对于第三个输入,您永远不会检查是否X,但您应该,因为iter找到第一个元素时,如果它不是import string import nltk from nltk.tokenize import RegexpTokenizer from nltk.corpus import stopwords import nltk.tag, nltk.data tagger = nltk.TrigramTagger(train_sents, backoff=nltk.data.load(nltk.tag._POS_TAGGER)) def tagSentence(sentence): # Method to tag sentence according to the tagger that is trained. sentence = sentence.lower() tokens = nltk.word_tokenize(sentence) filtered_words = [w for w in tokens if not w in stopwords.words('english')] " ".join(filtered_words) return tagger.tag(filtered_words) ,那么没有这样的数字(它不可能是之前的那个,因为curl -v -k --key "filekey.key" --cert "filecert.cer" --capath "path to site root" "complete link" 已经是第一个了!

答案 1 :(得分:1)

对于&#34;小于或等于&#34;&#34;你的逻辑有点倒退。案件。

lower_bound的结果需要考虑三种情况:它返回最后一个元素之后的位置,第一个元素的位置或其间的某个位置

如果iter == ar+numElems,您要查找的值是数组的最后一个元素(因为所有元素都小于X)。

如果iter == ar(第一个位置),则有两种情况; *iter == X*iter != X
如果*iter == XX是您的结果,因为数组中没有较小的值 如果*iter != X,则最小的数组元素大于X并且您没有结果。

否则(即iter != ar)结果为ar[-1]

答案 2 :(得分:1)

  

小于或等于数字X的最大值。

对我来说,排序数组最简单的方法是:

auto ret = upper_bound(arr.rbegin(), arr.rend(), X,
                       [](int a, int b){return a>=b;});