啥也不说,先上题!!!
二分查找
Description
给你n个整数和一个整数k。问:n个数中是否存在整数k,如果存在,输出“Yes”,否则输出“No”。
Input
输入包含多组测试用例,对于每组测试用例:
输入一个数字n (1 <= n <= 10^7)
接下来输入n个不同的数字Ai( |Ai| <= 10^7)。
接下来输入整数k ( |k| <= 10^7)。代表要找的数字k
Output
n个数中是否存在整数k,如果存在输出“Yes”,否则输出“No”。每组数据占一行。
Sample Input 1
5 -100 1 2 3 4 -100 5 1 2 3 5 6 4
Sample Output 1
Yes No 看起来很简单,对吧?让我们来小试牛刀一下!!!first blood我比着思想篇写了二分法的代码,运行着似乎没啥问题,结果wa了
bool Binary_search(int A[], int lo, int hi, int k){ if(lo > hi){ return false; } else{ int mi = (lo + hi) >> 1; if(A[mi] == k){ return true; } else if(A[mi] > k){ Binary_search(A, lo, mi - 1, k); } else{ Binary_search(A, mi + 1, hi, k); } } }//分析复杂度:首先该函数在主函数中调用了 logn 次, //该函数又在主函数的for循环里(0~n-1) //所以复杂度为nlogn
second blood
超时??我明明把递归改成while循环了,神马情况??
#include <bits/stdc++.h> using namespace std; int A[10000005]; //bool Binary_search(int A[], int lo, int hi, int k){ // if(lo > hi){ // return false; // } // else{ // int mi = (lo + hi) >> 1; // if(A[mi] == k){ // return true; // } // else if(A[mi] > k){ // Binary_search(A, lo, mi - 1, k); // } // else{ // Binary_search(A, mi + 1, hi, k); // } // // } // //} bool Binary_search(int lo, int hi, int k){ while(lo <= hi){ int mi = (lo + hi) >> 1; if(A[mi] == k){ return true; } else if(A[mi] > k){ hi = mi - 1; } else{ lo = mi + 1; } } return false; } int main(){ int n; while(cin >> n){ for(int i = 0; i < n; i++){ cin >> A[i]; } int k; cin >> k; sort(A, A + n); if(Binary_search(0, n - 1, k)){ cout << "Yes" << endl; } else{ cout << "No" << endl; } } return 0; }
经过一番思索.......
是不是卡时间,毕竟输入输出流比格式输入输出更耗时
此时我们需要 开 !外 !挂!// std::ios::sync_with_stdio(false);
#include <bits/stdc++.h> using namespace std; int A[10000005]; //bool Binary_search(int A[], int lo, int hi, int k){ // if(lo > hi){ // return false; // } // else{ // int mi = (lo + hi) >> 1; // if(A[mi] == k){ // return true; // } // else if(A[mi] > k){ // Binary_search(A, lo, mi - 1, k); // } // else{ // Binary_search(A, mi + 1, hi, k); // } // // } // //} bool Binary_search(int lo, int hi, int k){ while(lo <= hi){ int mi = (lo + hi) >> 1; if(A[mi] == k){ return true; } else if(A[mi] > k){ hi = mi - 1; } else{ lo = mi + 1; } } return false; } int main(){ std::ios::sync_with_stdio(false);//代表把 std(standard) ios(iostream)和 stdio(standard input output)同时发生(sync)的按钮关掉 int n; while(cin >> n){ for(int i = 0; i < n; i++){ cin >> A[i]; } int k; cin >> k; sort(A, A + n); if(Binary_search(0, n - 1, k)){ cout << "Yes" << endl; } else{ cout << "No" << endl; } } return 0; }
accept
快夸我!!!嘻嘻
原文地址:https://www.cnblogs.com/nibaba131237/p/12327455.html
时间: 2024-11-05 22:48:26