Two Sum

原题来自https://leetcode.com/problemset/algorithms/

蛮有趣的一个网站,里面收录的基本是国内外企业面试的算法题。

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

题意转述:

在一个给定的数组中找到2个数,使得2个数的和与目标数相等,返回是2个数的数组下标,且index1<index2。

题目分析:

原题条件简单,目的也简单,简单代码解决,利用双循环遍历所有组合,得到结果既可。

int* twoSum(int* nums, int numsSize, int target) {
    int i,j,*index=(int *)malloc(2*sizeof(int));
    for(i=0;i<numsSize;i++)
    {
        index[0]=i+1;
        for(j=i+1;j<numsSize;j++)
        {
            if(nums[i]+nums[j]==target)
            {
                index[1]=j+1;
                return index;
            }
        }
    }
    return index;
}

结果

 Time Limit Exceeded

分析下上面的代码,时间复杂度:O(n²),在leetcode中有些算法要求有运算时间限制的,说明这个时间复杂度不符合要求。 leetcode给的测试数据是0-32044的全部偶数集。 显然时间复杂度O(n²)是不符合要求的,只能改成O(n)的才行,在现在的几种基础数据结构中除了顺序表外其他的都是链式关联起来的,要查找具体的某一个值都是要经过遍历才可以,显然不符合要求,而数据不是排好序的,且不是连续的(整数连续),所以顺序表也不符合。 为了实现时间复杂度为O(n)的算法,此处采取利用空间换时间的做法,采用hash表进行存储。hash表工作原理:
http://blog.csdn.net/nju_yaho/article/details/7402208

为了查找方便,下面算法使用java编写,利用hashmap对象。 ACcode如下:

<pre name="code" class="java">public class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] a = new int[2];
	Map<Integer, Integer> map = new HashMap<Integer, Integer>();
	a[0]=0;a[1]=0;
	for (int i = 0; i < nums.length; i++) {
		if(map.get(nums[i])==null){
			map.put(target-nums[i], i);
		}else{
			a[0]=map.get(nums[i])+1;
			a[1]=i+1;
			break;
		}
	}
	return a;
    }
}

利用map的存储格式,将目标的匹配值作为key,位置index作为value进行存储在map中,当迭代到新的数据时,即可在hashmap中查找有没有存储以该值为key的对象,有则找到符合的2个数,没有则将target-nums[i]作为key继续存储进hashmap中,然后继续迭代,知道找出那2个数。

结果

16 / 16 test cases passed. Status: 

Accepted

Runtime:  6 ms
点赞