二进制搜索TestCase不返回值

时间:2017-09-18 16:23:17

标签: c++ algorithm search

所以我试图解决以下问题

输入格式为

<磷>氮

x x x x x ...

q

y y y y y y ...

N =数组大小

x,x,x ...是数组的元素

q =没有查询

y,y,y ..是使用二进制搜索在数组中搜索的查询

这是我的代码

#include <iostream>
#include<algorithm>
using namespace std;

int main()
{
   int N,q;
   cin>>N;
   int a[N];
   for(int i=1;i<=N;i++)
   {
      cin>>a[i];
   }

   cin>>q;

   int b[q];
   for(int i=0;i<q;i++)
   {
      cin>>b[i];
   }

   int len=sizeof(a)/sizeof(a[1]);
   sort(a,a+len);

   int beg=1,end=N;

   for(int j=0;j<q;j++)
   {
      beg=1;end=N;
      while(beg<=end)
      {   
         int mid=(beg+end)/2;
         if(b[j]==a[mid])
         {
            cout<<mid<<endl;
            break;
         }

         else if(b[j]<a[mid])
         {
            end=mid-1;
         }

         else 
            beg=mid+1;
      }
   }

   return 0;
}

我的代码提供以下输出错误

1 2 3 4 五 6 7 8 9 10 11 12 13 14 15 16 17 18

输入

100 100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 20 1 2 3 4 五 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

正确的输出是

1 2 3 4 五 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

3 个答案:

答案 0 :(得分:1)

  1. 数组是从0开始的。

  2. 在C ++中,数组不是可变长度的。

  3. 您的更新错误:

    else if(b[j]<a[mid])
     {
        end=mid-1;
     }
    

    结束是非包容性的。

  4. 您还需要继续(beg<end)而不是beg<=mid - 否则mid将完全相同。

  5. 这是修复上述所有内容的C ++版本,它使用迭代器而不是索引。迭代器消除歧义(base-0 vs base-1),并通过契约明确表示范围为[begin, end)

    <强> Live ON Coliru

    #include <algorithm>
    #include <iostream>
    #include <iterator>
    #include <vector>
    
    using namespace std;
    
    int main() {
        int N;
        cin >> N;
    
        std::vector<int> a(N);
        std::copy_n(std::istream_iterator<int>(std::cin), N, a.begin());
    
        int q;
        cin >> q;
    
        std::vector<int> b(q);
        std::copy_n(std::istream_iterator<int>(std::cin), q, b.begin());
    
        sort(a.begin(), a.end());
    
        for (auto query : b) {
            auto beg = a.begin();
            auto end = a.end();
    
            while (beg < end) {
                auto mid = beg + (end-beg) / 2;
                if (query == *mid) {
                    cout << *mid << endl;
                    break;
                } else if (query < *mid) {
                    end = mid;
                } else beg = mid + 1;
            }
        }
    }
    

    打印

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    

答案 1 :(得分:0)

问题1

由于在以下循环中使用越界索引访问a,您的程序会有未定义的行为。

for(int i=1;i<=N;i++)
{
   cin>>a[i];
}

需要将该循环更改为使用基于0的索引。

for(int i = 0; i < N; i++)
{
   cin >> a[i];
}

问题2

出于类似的原因,beg的初始值必须为0,而不是1。

问题3

您正在与a[mid]的值进行比较,但输出的是mid。输出也必须是a[mid]

问题4

     else if(b[j]<a[mid])
     {
        end=mid-1;
     }

需要

     else if(b[j]<a[mid])
     {
        end=mid;
     }

通过上述更改,程序在我的环境中按预期工作。这是更新的程序:

#include <iostream>
#include<algorithm>
using namespace std;

int main()
{
   int N,q;
   cin>>N;
   int a[N];
   for(int i=0;i<N;i++)
   {
      cin>>a[i];
   }

   cin>>q;

   int b[q];
   for(int i=0;i<q;i++)
   {
      cin>>b[i];
   }

   int len=sizeof(a)/sizeof(a[1]);
   sort(a,a+len);

   int beg=0,end=N;

   for(int j=0;j<q;j++)
   {
      beg=0;end=N;
      while(beg<end)
      {   
         int mid=(beg+end)/2;
         if(b[j]==a[mid])
         {
            cout << a[mid] << endl;
            break;
         }

         else if(b[j]<a[mid])
         {
            end=mid;
         }

         else 
            beg=mid+1;
      }
   }

   return 0;
}

https://ideone.com/wgF2IS处查看它。

答案 2 :(得分:0)

数组以0索引开始。因此,确保N个元素的循环必须以零索引开始。

for(int i = 0; i < N; i++)
{
  cin >> a[i];
}

同样,出于同样的原因,分配求'0'值并结束'N-1'值。