#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//二分查找 遵循迭代器原则,end迭代器指向最后一个元素的下一个位置,beg迭代器指向需要查找范围的第一个元素
bool myBinary_search(const vector<int>::iterator beg, const vector<int>::iterator end, const int &val)
{
int l=0,r= end - beg;
while(r-l>=1)
{
int i=(l+r)/2;
if(*(beg+i)==val) return true;
else if(*(beg+i)<val) l=i+1;
else r=i;
}
return false;
}
int main()
{
vector<int> ivec; //保存牌点
int m; //抽牌点数之和等于的点数
for (int i = 0; i !=ivec.size(); ++i) {
for (int j = 0; j !=ivec.size(); ++j) {
for (int k = 0; i !=ivec.size(); ++i) {
for (int l = 0; l != ivec.size(); ++l) {
if(ivec.at(i)+ivec.at(j)+ivec.at(k)+ivec.at(l)==m)
{
cout<<"yes";
return 0;
}
}
}
}
}
cout<<"no";
return 0;
//以上程序是O(n^4)指数时间复杂度,我们使用一次二分搜索让其变成 O(n^3+2logn)
//二分搜索会产生logn,排序会产生logn的时间复杂度
sort(ivec.begin(),ivec.end());
for (int i = 0; i !=ivec.size(); ++i) {
for (int j = 0; j !=ivec.size(); ++j) {
for (int k = 0; i !=ivec.size(); ++i) {
if(binary_search(ivec.cbegin(),ivec.cend(),m-ivec.at(i)-ivec.at(j)-ivec.at(k)))
{
cout<<"yes";
return 0;
}
}
}
}
//我们可以列举n*n个空间的数,使时间复杂度从O(n^3)变成O(n^2+logn+logn^2),空间复杂度为O(n^2),以此类推
}
分治法:利用二分查找优化O(n^4)指数时间复杂度问题
猜你喜欢
转载自blog.csdn.net/chongzi_daima/article/details/104089421
今日推荐
周排行