lintcode 两数之和

lintcode 两数之和

描述

给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。

你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。

样例

给出 numbers = [2, 7, 11, 15], target = 9, 返回 [0, 1].

思路

首先,最容易想到的就是对于第i个 从j = i + 1开始往后遍历到结束,把i和j放到vector中,返回。实现方式比较简单,就不写了。
但是这种复杂度比较高。我想了一种使用两个指针的方法,但是写的时候发现也没那么容易。
首先是要进行排序,找到两个数之后还要再在原来的数组中寻找这两个数。这个方法的复杂度取决于排序,我们使用的是STL自带的sort排序,还是比较快的。

class Solution {
public:
    /**
     * @param numbers: An array of Integer
     * @param target: target = numbers[index1] + numbers[index2]
     * @return: [index1, index2] (index1 < index2)
     */
    vector<int> twoSum(vector<int> &numbers, int target) {
        // write your code here
        vector<int> res,
                    temp = numbers;
        sort(numbers.begin(), numbers.end());
        int i = 0,
            j = numbers.size() - 1;
        while (i < j) {
            if (numbers[i] + numbers[j] > target)
                j--;
            else if (numbers[i] + numbers[j] < target)
                i++;
            else if (numbers[i] + numbers[j] == target)
                break;
        }
        
        for (int k = 0; k < temp.size(); k++) {
            if (temp[k] == numbers[i])
                res.push_back(k);
            else if (temp[k] == numbers[j]) {
                res.push_back(k);
            }
            if (res.size() == 2) {
                if (res[0] > res[1])
                    swap(res[0],res[1]);
                return res;
            }
        }
    }
};

猜你喜欢

转载自blog.csdn.net/qq_40147449/article/details/83898716