分治法(实战篇之二分查找)
Posted nibaba131237
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分治法(实战篇之二分查找)相关的知识,希望对你有一定的参考价值。
啥也不说,先上题!!!
二分查找
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
快夸我!!!嘻嘻
以上是关于分治法(实战篇之二分查找)的主要内容,如果未能解决你的问题,请参考以下文章