LeetCode 1 Two Sum题解

来源:互联网 发布:海岛大亨5 for mac 编辑:程序博客网 时间:2024/06/02 05:00

题目地址:https://leetcode.com/problems/two-sum/

1. Two Sum

难度:简单

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.

给出一个int数组,如果两个数字的和等于一个特定的值,那么就返回它们在数组中的下标。你可以假定每次输入都只有一种结果。

Example:

Given nums = [2, 7, 11, 15], target = 9,Because nums[0] + nums[1] = 2 + 7 = 9,return [0, 1].

方法一:暴力方法O(n^2)

用两次循环的方式,算出所有组合的值并与Target Value比较

Java

public class Solution {    public int[] twoSum(int[] nums, int target) {        int[] index=new int[2];        for(int i=0;i<nums.length-1;i++)        {            for(int j=i+1;j<nums.length;j++)            {                if(nums[i]+nums[j]==target)                {                    index[0]=i;                    index[1]=j;                }                           }        }        return index;       }}


C++

不熟悉C++容器的同学可以在编写测试代码的时候可以参考C++容器库的文档:http://zh.cppreference.com/w/cpp/container

C++在用同样的算法时会出现超时

class Solution {public:    vector<int> twoSum(vector<int>& nums, int target) {        vector<int> vc;        for(int i=0;i<nums.size()-1;i++)        {            for(int j=i+1;j<nums.size();j++)            {                if(nums.at(i)+nums.at(j)==target)                {                    vc.push_back(i);                    vc.push_back(j);                }            }        }        return vc;    }};

可见,测试用例数据量比较大的时候,这种暴力的方法就行不通了。

方法二:C++ Map或Java HashMap(基于数据结构散列表,C++Map用红黑树实现,插入查找效率O(logn),Java的HashMap插入查找效率O(1))

循环一次,依次查找相应的Target Value-nuts[i]值是否存在

Java

public class Solution {    public int[] twoSum(int[] nums, int target) {        int[] index=new int[2];        HashMap<Integer,Integer> hashmap=new HashMap<Integer,Integer>();        for(int i=0;i<nums.length;i++)        {            if(hashmap.containsKey(target-nums[i]))            {                index[0]=i;                index[1]=hashmap.get(target-nums[i]);                break;            }else            {                hashmap.put(nums[i],i);            }        }        return index;    }}

C++

class Solution {public:    vector<int> twoSum(vector<int>& nums, int target) {        vector<int> vc;        map<int,int> mp;        for(int i=0;i<nums.size();i++)        {            if(mp.count(target-nums[i]))            {                vc.push_back(mp[target-nums[i]]);                vc.push_back(i);                break;            }else            {                mp[nums[i]]=i;            }        }        return vc;    }};



0 0
原创粉丝点击