两数和-输入已排序的数组-LintCode

来源:互联网 发布:转行程序员 编辑:程序博客网 时间:2024/06/06 09:19

给定一个已经按升序排列的数组,找到两个数使他们加起来的和等于特定数。
函数应该返回这两个数的下标,index1必须小于index2。注意返回的值不是 0-based。

注意事项:
你可以假设每个输入刚好只有一个答案

样例:
给定数组为 [2,7,11,15] ,target = 9
返回 [1,2]

#ifndef C608_H#define C608_H#include<iostream>#include<vector>#include<map>#include<algorithm>using namespace std;class Solution {public:    /*    * @param nums: an array of Integer    * @param target: target = nums[index1] + nums[index2]    * @return: [index1 + 1, index2 + 1] (index1 < index2)    */    vector<int> twoSum(vector<int> &nums, int target) {        // write your code here        vector<int> res(2, 0);        map<int, int> m;        int len = nums.size();        for (auto c : nums)            m[c]++;         int pos1 = 0;        //找到i,满足m中存在target-nums[i]        for (int i = 0; i < len; ++i)        {            m[nums[i]]--;            int num = target - nums[i];            if (m.find(num) != m.end() && m[num]>0)            {                pos1 = i;                break;            }            m[nums[i]]++;        }        int pos2 = 0;        //逆序查找等于target-nums[pos]的位置        for (int j = len - 1; j >= 0; --j)        {            if (nums[j] == target - nums[pos1])            {                pos2 = j;                break;            }        }        res[0] = pos1 + 1;        res[1] = pos2 + 1;        return res;    }};#endif
原创粉丝点击