Snail

导航

 

原题

给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数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;
}
posted on 2021-06-19 12:18  Snail-0304  阅读(127)  评论(0)    收藏  举报