1-Two Sum

来源:互联网 发布:学校网络运行管理制度 编辑:程序博客网 时间:2024/06/06 00:12
Given an array of integers, find two numbers such that they add up to a specific target number.




The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.




You may assume that each input would have exactly one solution.




Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2


tags:
Array, Hash Table




Solution 1(Time Limit Exceeded)
暴力法,直接while条件游标循环搜出两个和为target的数,输出序号即可


代码:

class Solution {
public:
    vector<int> twoSum(vector<int> &numbers, int target) {
        vector<int> elements;
        for (int i = 0; i < numbers.size(); i++) {
for(int j = i+1; j<numbers.size(); j++){
if((numbers[i] + numbers[j] == target) && (i != j)){
                elements.push_back(i);
                elements.push_back(j);
                break;
}
            }
        }
        return elements;
    }
};


Solution 2(Accepted)
哈希表法,把数组中各数按值把序号赋给哈希表,然后循环数组中的数,计算target-当前数值所得的数在哈希表里查出是否有,有则break并给出当前数和查出第二个数的序号,没有则继续


代码:

class Solution {
public:
    vector<int> twoSum(vector<int> &numbers, int target) {
        unordered_map<int, int> map;
        vector<int> elements;
        for (int i = 0; i < numbers.size(); i++) {
            map[numbers[i]] = i;
        }
        for (int i = 0; i < numbers.size(); i++) {
            int difference = target - numbers[i];
            if (map.find(difference) != map.end() && map[difference] > i) {
                elements.push_back(i + 1);
                elements.push_back(map[difference] + 1);
                break;
            }
        }
        return elements;
    }
};


Solution 3(Accepted)
排序夹逼法,先复制出一样的数组,排序,前序后序夹逼找出两个数,然后在原数组中查找序号


代码:

class Solution {
public:
    vector<int> twoSum(vector<int> &numbers, int target) {
        vector<int> elements;
vector<int> nums = numbers;
std::sort(nums.begin(),nums.end());
int i = 0;
int j = nums.size() - 1;
while(i<j){
if(nums[i] + nums[j] == target){
for (int k = 0; k < numbers.size(); k++){
if(nums[i] == numbers[k]){
elements.push_back(k + 1);
}
else if(nums[j] == numbers[k]){
elements.push_back(k + 1);
}
if(elements.size() == 2){
break;
}
}
break;
}
else if(nums[i] + nums[j] < target){
i++;
}
else if(nums[i] + nums[j] > target){
j--;
}
}
        return elements;
    }
};

0 0