这是我参与 8 月更文挑战的第 5 天,活动详情查看: 8月更文挑战
要求:
实验过程:
一、穷举法
通过两层for循环,相加判断,此时时间复杂度为o(n2)。
#include<iostream>
using namespace std;
const int n=5;
//穷举法
bool find(int a[],int n,int S){
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){//注意这里j=i+1,而不是j=i
if((a[i]+a[j])==S)
return true;
}
}
return false;
}
int main(){
int a[n];
cout<<"请输入长度为"<<n<<"的数组中各个元素:"<<endl;
for(int i=0;i<n;i++){
cin>>a[i];
}
int S;
cout<<"目标值为:"<<endl;
cin>>S;
if(find(a,n,S)==true){
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
system("PAUSE");
return 0;
}
二、先将数组排序
基本思想:
先将数组用快排按从小到大排序,然后定义两个指针 i 和 j , i从数组左边开始向右,j从数组右边向左。这样:
(1) 如果data[i]+data[j]<target,则++i;
(2) 如果data[i]+data[j]>target,则--j;
(3) 如果data[i]+data[j]=target,则找到,return ture;
(4)如果i>=j,则 return false。
#include<iostream>
using namespace std;
const int n=5;
//快排
int Partition(int p[],int left,int right){
int pivot=p[left];
while(left<right){
while(left<right&&p[right]>=pivot) right--;
p[left]=p[right];
while(left<right&&p[left]<=pivot) left++;
p[right]=p[left];
}
p[left]=pivot;
return left;
}
void QuickSort(int p[],int left,int right){
if(left<right){
int q=Partition(p,left,right);
QuickSort(p,left,q-1);
QuickSort(p,q+1,right);
}
}
bool find(int data[],int left,int right,int target)
{
int i=left,j=right;
while(i<j){
if(data[i]+data[j]==target&&i<j)
return true;
else if(data[i]+data[j]<target&&i<j)
++i;
else if(data[i]+data[j]>target&&i<j)
--j;
}
return false;
}
int main(){
int a[n];
cout<<"请输入长度为"<<n<<"的数组中各个元素:"<<endl;
for(int i=0;i<n;i++){
cin>>a[i];
}
int S;
cout<<"目标值为:"<<endl;
cin>>S;
QuickSort(a,0,n-1);
if(find(a,0,n-1,S)==true)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
system("PAUSE");
return 0;
}
此时排序的时间复杂度为o(nlogn),两个指针的遍历时间复杂度为o(n),故总时间复杂度为o(nlogn)。