Leetcode167

Leetcode167:两数之和 II - 输入有序数组

题目描述

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:

输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 27 之和等于目标数 9 。因此 index1 = 1, index2 = 2

解法一:基于双指针的方法

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int low = 0, high = numbers.size() - 1;
        while (low<high)
        {
            int sum = numbers[low] + numbers[high];
            if (sum == target)
                return { low + 1,high + 1 };
            else if (sum<target)
                low++;
            else
                high--;
        }

        return { -1,-1 };


    }
};

解法二:基于unordered_map的方法

class Solution2 {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        unordered_map<int, int> m;
        vector<int> b(2, 0);
        for (int i = 0; i<numbers.size(); i++)
            m[numbers[i]] = i;
        for (int i = 0; i<numbers.size(); i++)
        {
            if (m.count(target - numbers[i]) && (m[target - numbers[i]] != i))
            {
                b[0] = i + 1;
                b[1] = m[target - numbers[i]] + 1;
                break;
            }
        }
        return b;
    }
};

main()函数

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

int main()
{
    vector<int> nums;
    cout << "请输入有序数组的大小: " << endl;
    int Size;
    cin >> Size;
    cout << "请输入有序数组的元素: " << endl;
    int Currval;
    for (int i = 0; i < Size; i++)
    {
        cin >> Currval;
        nums.push_back(Currval);
    }
    cout << "请输入目标元素: " << endl;
    int target;
    cin >> target;
    Solution answer;
    vector<int> b(2, -1);
    b = answer.twoSum(nums, target);
    for (auto n : b)
        cout << n << " ";

    system("pause");
    return 0;
}

   转载规则


《Leetcode167》 赵小亮 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
剑指offer39 剑指offer39
剑指offer39:数组中出现次数超过一半的数字 题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因
2020-04-23
下一篇 
Leetcode219 Leetcode219
Leetcode219:存在重复元素 II 题目描述Leetcode219: 存在重复元素 II 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j, 使得 nums [i] = nums [j],并且 i 和
2020-04-20
  目录