TWO NUM

Title

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:

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

anwser

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int *ret = NULL;
int row = 0;
int col = 0;
int add = 0;

ret = (int *)malloc(sizeof(int)*2);
ret[0] = 0;
ret[1] = 0;
*returnSize = 0;
for(;row < numsSize-1; row++)
{
for(col = row+1; col < numsSize; col++)
{
add = nums[row] + nums[col];
if(add == target)
{
ret[0] = row;
ret[1] = col;
*returnSize = 2;
break;
}
}
}

return ret;
}

显而易见,最low的解法,因为是刚开始做,尝试进行优化无果后去查看官方的解法,恍然大悟,原来可以用hashmap等容器进行辅助,将时间复杂度由O(n^2)降低到O(n),先来看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
}

上述代码是用java写的,主要是通过遍历一遍数组,得到一个map,然后从里面找到target与num[i]的差值,这里简单的应用了hashmap就完成了复杂的操作,也是我们需要灵活运用数据结构的例子。

这里虽然上面已经做到很快,但是在进行之前还是需要先轮训一遍数组,我们是不是可以省去这一步呢,这时候有了第三种方法,同样的,我们先来看代码:

1
2
3
4
5
6
7
8
9
10
11
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}

通过上述代码我们可以看到巧妙的地方,只是走了一遍轮训,在这个过程中找到hashmap中是否由差值,如果没有就存进去

总结

这道题很简单,但是让我看到了hashmap在某些算法场景下能带来的巨大改进,同时也看到了巧妙的运用代码可以更高效的完成我们的操作,以后写算法看来不能全都用c语言了,毕竟容器的实现并不是我们刷题的重点。

-------------本文结束,感谢您的阅读-------------