题目内容
题目来源:LeetCode
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].
题目思路
题目难度:easy
虽然这个题目不属于难题,但是它是k-sum系列问题的核心。因此详细地在此总结。
做本题有三种方法:
第一种是最容易想到的暴力搜索,用两个循环嵌套,不采用此方法。
第二种是哈希法。
第三种是双指针法。
哈希法
本质的思路是:对于每一个nums[i],寻找剩下的数组中是否存在target-nums[i]。若存在,直接返回其下标就好。否则继续寻找,直到全部查找完毕,返回空。在Python中,可以直接使用dict这个数据结构来存储元素和下标的对应关系。每次判断完后,将这个数加入到dict中。
哈希法的Python代码
class Solution(object): def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ d={} for i in range(len(nums)): if target-nums[i] in d: return (d[target-nums[i]],i) d[nums[i]]=i
双指针法
双指针法的思路是,先将数组nums进行排序,然后分别设立两个指针,一个指向第一个元素,另一个指向最后一个元素。每次判断指针指向的这两个数的和,若它们的和大于target,那么将左边的指针加一,如果小于target,那么将右边的指针减一。如果等于target,就输出。其实这是一种从两边夹逼的思想。这个题目要求返回的是下标而不是值,因此多了很多操作,如果仅仅是要求返回值,那么就会简洁多了。
双指针Python代码
class Solution: # @return a tuple, (index1, index2) def twoSum(self, num, target): index = [] numtosort = num[:]; numtosort.sort() i = 0; j = len(numtosort) - 1 while i < j: if numtosort[i] + numtosort[j] == target: for k in range(0,len(num)): if num[k] == numtosort[i]: index.append(k) break for k in range(len(num)-1,-1,-1): if num[k] == numtosort[j]: index.append(k) break index.sort() break elif numtosort[i] + numtosort[j] < target: i = i + 1 elif numtosort[i] + numtosort[j] > target: j = j - 1 return (index[0]+1,index[1]+1)
(双指针的代码自己没编,来源于: http://www.cnblogs.com/zuoyuan/p/3698966.html)