在排序数组中查找和为给定值的两个数字

  1. 给定一个从大到小排序好的数组1,3,4,6,7,8,9,编写算法找出和为11的数字。如果存在多个数字对满足条件,输出任意一对即可。
  2. 给出三种方法:
  3. 1、双重循环,对数组进行双重循环,挨个遍历每对数字。当和为11的时候跳出循环。打印结果。
  4. #include
    using namespace std;
    void findTwoNmberForSum(int intarr[],int length,int key)
    {
    for (int i = 0; i < length - 1; i++)
    {
    for (int j = i + 1; j < length; j++)
    {
    if (intarr[i] + intarr[j] == key)
    {
    cout << intarr[i] << " + " << intarr[j] << " = " << key << endl;
    return;
    }
    }
    }
    }
    int main()
    {
    int intarr[10] = { 1,2,4,7,11,15,17,20,23,25 };
    findTwoNmberForSum(intarr, 10, 11);
    system(“pause”);
    return 0;
    }
    很简单的一种实现。
    2、利用map实现。map的key值为11-intarr[i],然后查找后面是否存在这个key即可。给出代码函数:
    void findTwoNmberForSumMap(int intarr[], int length, int key)
    {
    map<int, int> mapint;
    for (int i = 0; i < length; i++)
    {
    auto iter = mapint.find(intarr[i]);//判断mapint是否存在key-intarr[i],存在就找到了,不存在就添加,一次循环就可以完成。
    if (iter != mapint.end())
    {
    cout << iter->first << " + " << iter->second << " = " << key << endl;
    return;
    }
    else
    {
    mapint[key - intarr[i]] = intarr[i];
    }
    }
    }
    3、由于是排序好的数字,那么可以充分利用这一点来计算,我们给定small=intarr[0],big=intarr[length-1]。然后求small+big是否等于11.小于11的时候,我们就把samll向后移动一次,大于11的时候我们就把big向前移动一位。直到等于11为止。
    void findTwoNmberForSumSort(int intarr[], int length, int key)
    {
    int small = 0;
    int big = length - 1;
    while (small >= 0 && big < length && small < big)//循环终止条件
    {
    if (intarr[small] + intarr[big] == key)
    {
    cout << intarr[small] << " + " << intarr[big]<< " = " << key << endl;
    return;
    }
    if (intarr[small] + intarr[big] > key)//为什么大于的时候big–,我是通过极限的想法理解的,假设数组中没有两数的和==11,且最小的为12,那么smal–,跳出条件不对。当最大的两数和小于11的时候,跳出条件是最大的两数和才行。先这么理解吧。
    {
    big–;
    }
    if (intarr[small] + intarr[big] < key)
    {
    small++;
    }
    }
    cout << “NNN” << endl;
    }
    我感觉第三种方法很难理解。先这么记着吧
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值