给定一个整数数组,找出其中两个数相加等于目标值

406 阅读1分钟

这是我参与 8 月更文挑战的第 5 天,活动详情查看: 8月更文挑战

要求:

image-20210805191334671

实验过程:

一、穷举法

通过两层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)。