【问题标题】:binary_search() function doesn't work in my function bodybinary_search() 函数在我的函数体中不起作用
【发布时间】:2020-09-26 00:31:49
【问题描述】:

问题是——

给定一个由 N 个不同元素组成的有序旋转数组 A,该数组在某个点旋转,并给定一个元素 K。任务是在数组 A 中找到给定元素 K 的索引。

输入: 输入的第一行包含一个整数 T,表示测试用例的总数。然后是 T 测试用例。每个测试用例由三行组成。每个测试用例的第一行包含一个整数 N,表示给定数组的大小。每个测试用例的第二行包含 N 个用空格分隔的整数,表示数组 A 的元素。每个测试用例的第三行包含一个整数 K,表示要在数组中搜索的元素。

输出: 对于每个测试用例,在新行中打印元素 K 的索引(基于 0 的索引),如果数组中不存在 K,则打印 -1。

用户任务: 完成 Search() 函数并返回元素 K 的索引(如果在数组中找到)。如果元素不存在,则返回 -1。

预期时间复杂度:O(log N)。

预期的辅助空间:O(1)。

约束:

1≤T≤100
1≤N≤107
0≤Ai≤108
1≤K≤108

示例:
输入:
3
9
5 6 7 8 9 10 1 2 3
10
3
3 1 2
1
4
3 5 1 2
6
输出:
5
1
-1

我对所需功能的解决方案:-

// vec : given vector of elements  
// K : given value whose index we need to find   

int Search(vector<int> vec, int K) 
{
    if(binary_search(vec.begin(),vec.end(), K))
    {
        return 1;
    }
    else return -1;
}

这不是问题的逻辑,但我的目标是首先要求我找出向量中是否存在元素。
但是,当给出上述测试用例时,我的代码的输出是:-
-1
-1
-1
这表明在任何情况下都找不到该元素,而在前两种情况下它实际上存在于向量中。我哪里错了??

【问题讨论】:

  • 向量必须排序
  • @Berto99 感谢您的指出。我错过了这个小事实。
  • 别着急,你只需要选择是要对数组进行排序,还是进行线性搜索
  • 我会编写一个修改后的二进制搜索函数来满足时间复杂度并保持索引不变,因为这就是我最后必须返回的。谢谢朋友 :) @Berto99

标签: c++ arrays algorithm vector binary-search


【解决方案1】:

std::binary_search 的先决条件之一是您可以看到here,即您要搜索的数组必须是排序的,而不是您可以编写自己的线性搜索:

template<class Iterator, class ToFind>
bool linear_search(Iterator start, Iterator end, const ToFind& element){
   while(start != end){
      if(*start == element)
          return true;
      std::next(start);
   }
   return false;
}

正如@Blastfurnace 指出的那样,您可以使用std::find 这样做(但可能更好)

【讨论】:

  • @Blastfurnace 是的,对不起,我的错
【解决方案2】:

二分查找意味着您已经对数组进行了排序。 您的所有输入数组都没有排序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    相关资源
    最近更新 更多