1. Two Sum 使用unsorted_map或者vector的sort函数

来源:互联网 发布:冯大辉 范凯 知乎 编辑:程序博客网 时间:2024/06/06 13:30

Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:
Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

解法1:首先将nums备份得到temp,然后对nums排序,使用start和end两个指针进行遍历,找到满足和为target的两个数,再在temp中找到两个数对应的下标。代码见twoSum

解法2:使用无序的地图存储数据,然后查找。代码见twoSum2

#include "stdafx.h"#include<iostream>#include<string>#include<vector>#include<algorithm>   //调用vector的sort函数#include<unordered_map>using namespace std;
class Solution{public:    vector<int>twoSum(vector<int>& nums,int target)  //排序,使用两个指针寻找    {        vector<int> result;        if(nums.size()==0) return result;        vector<int> temp=nums;       //备份        sort(nums.begin(),nums.end());   //升序排序        int start=0,end=nums.size()-1;        while(start<end)        {            if(nums[start]+nums[end]==target)   //找到两个数            {                for(int i=0;i<temp.size();i++)  //寻找对应的下标                {                    if(temp[i]==nums[start]) result.push_back(i);                    if(temp[i]==nums[end]) result.push_back(i);                     if(result.size()==2) return result;                }            }            if(nums[start]+nums[end]<target) start++;  //没有找到,则指针移位            if(nums[start]+nums[end]>target) end--;        }        return result;    }    vector<int> twoSum2(vector<int>& nums,int target)    {        vector<int> result;        if(nums.size()==0) return result;        unordered_map<int,int> m;        for(int i=0;i<nums.size();i++)        {            if(m.find(target-nums[i])!=m.end())            {                result.push_back(m[target-nums[i]]);                result.push_back(i);                return result;            }            else m[nums[i]]=i;    //map中存储各数据的下标        }    }};int _tmain(int argc, _TCHAR* argv[]){    Solution solu;    int num[]={2,7,11,15,14,16,18,13};    int target=0;    vector<int> nums;    for(int i=0;i<sizeof(num)/sizeof(int);i++)    {        nums.push_back(num[i]);    }    vector<int> result=solu.twoSum2(nums,target);    if(!result.empty())    {        vector<int>::iterator it=result.begin();        while(it!=result.end())        {            cout<<*it<<endl;            it++;        }    }    getchar();    getchar();    return 0;}