ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

两数之和(牛客网)

2021-06-19 12:33:22  阅读:153  来源: 互联网

标签:index int res 牛客 iFirst numbers 数组 两数


原题

给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的假设给出的数组中只存在唯一解
例如:
给出的数组为 {2, 7, 11, 15},目标值为9
输出 index1=1, index2=2

思路

总的思路是先把数组排序, 然后在首尾各放一个指针i, j遍历数组:

if i + j == target:
    return [i, j];
else if i + j < target:  # 和小于目标值, 把前面的指针往后移
    ++i;
else                     # 和大于目标值, 把后面的指针往前移
    --j;

由于这道题求的是下标, 所以不能直接对原数组排序. 要再弄一个数组用来记录下标, 对这个记录下标的数组排序. 需要重定义一下排序时的比较函数, 根据原数组的值来确定两个下标的大小关系.

代码

vector<int> twoSum(vector<int>& numbers, int target) {
    vector<int> index;
    index.resize(numbers.size());
    for (size_t i = 0; i < index.size(); ++i)
        index[i] = i;
    
    auto less = [&](int a, int b) -> bool {
        return numbers[a] < numbers[b];
    };
    
    std::sort(index.begin(), index.end(), less);
    
    int iFirst = 0;
    int iLast = index.size() - 1;
    while (iFirst < iLast) {
        int sum = numbers[index[iFirst]] + numbers[index[iLast]];
        if (sum == target)
            break;
        else if (sum > target)
            --iLast;
        else
            ++iFirst;
    }
    
    vector<int> res;
    res.push_back(index[iFirst] + 1);
    res.push_back(index[iLast] + 1);
    if (res[0] > res[1])
        std::swap(res[0], res[1]);
    return res;
}

标签:index,int,res,牛客,iFirst,numbers,数组,两数
来源: https://www.cnblogs.com/snail-0304/p/14902594.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有