编程之美2.12--快速寻找满足条件的两个数

/*快速寻找满足条件的两个数--编程之美2.12*/
#include <iostream>

using namespace std;

/*快速排序算法*/
void swap(int a[], int i, int j)
{
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;    
}

int partition(int a[], int low, int high)
{
    int key = a[low];

    while(low < high)
    {
        while(low < high && a[high] >= key) {high--;}
        swap(a,low,high);
        while(low < high && a[low] <= key) {low++;}
        swap(a,low,high);
    }

    return low;
}

void quickSort(int a[], int low, int high)
{
    if(low<high)
    {
        int key=partition(a,low,high);
        quickSort(a,low,key-1);
        quickSort(a,key+1,high);
    }
}

/*二分查找*/
bool binarySearch(int a[], int low, int high, int key)
{
    while(low<=high)
    {
        int mid = low+(high-low)/2; // 直接使用(high + low) / 2 可能导致溢出,记住这个点定义是放在循环体内!!!别再犯低级错误 
        if(a[mid] == key )
        {
            return true;
        }
        else if(a[mid] < key )
        {
            low=mid+1;
        }
        else
        {
            high=mid-1;
        }
    }

    return false;
}

/*思路一:
先排序; 
定义两个变量:left和right,分别指向数组的最左边和最右边的数;
若arr[left]+a[right]>sum right--;否则left++;
直到arr[left]+a[right]=sum为止
时间复杂度为:O(NlogN)*/
bool findSum1(int a[],int left,int right,int sum)
{
    quickSort(a,left,right); //先排序

    while(left<right)
    {
        if(a[left]+a[right]==sum)
        {
            return true;
            break;
        }   
        else if(a[left]+a[right]<sum) { left++;
        }
        else{ right--;
        }
    }
    return false;
}

/*思路二:
先排序;
再在遍历数组的时候采用二分查找去查找sum-array[i]的值;
从而时间复杂度控制在O(NlogN) 
*/ 
bool findSum2(int a[],int low,int high,int sum)
{
    quickSort(a,low,high);

    for(int i=0; i<=high; i++)
    {
        if(binarySearch(a,i+1,high,sum-a[i]) == 1)
        {
            return true;
            break;
        }
    }

    return false;
}

/*思路三:
使用hash结构,即使用hash结构来代替二分查找,用空间换取时间
代码此处省略*/

int main()
{
    int array[10] = {10,1,2,8,9,5,4,3,6,7};
    cout<<findSum1(array,0,9,1)<<endl;
    cout<<findSum2(array,0,9,1)<<endl;

    return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值