LeetCode #1 2018-07-27
2018-07-27 本文已影响0人
40巨盗
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, 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].
https://leetcode.com/problems/two-sum/description/
这道题目提供了后面k>2的题目的基本思路。主要有两种思路,第一种是利用哈希表对元素的出现进行记录,然后进来新元素时看看能不能与已有元素配成target,如果哈希表的访问是常量操作,这种算法时间复杂度是O(n),空间复杂度也是O(n)。
代码如下:
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
if not nums or len(nums) < 2:
return None
result = []
hash_table = {}
for i, num in enumerate(nums):
if (target - num) in hash_table:
result.append(hash_table.get(target - num))
result.append(i)
return result
hash_table[num] = i
return result
第二种思路则是先对数组进行排序,然后利用夹逼的方法找出满足条件的pair,原理是因为数组是有序的,那么假设当前结果比target大,那么左端序号右移只会使两个数的和更大,反之亦然。所以每次只会有一个选择,从而实现线性就可以求出结果。算法时间复杂度是O(nlogn+n)=O(nlogn),空间复杂度取决于排序算法。
夹逼方法中的感悟:
- 原理是因为数组是有序的,那么假设当前结果比target大,那么左端序号右移只会使两个数的和更大,反之亦然。所以每次只会有一个选择,从而实现线性就可以求出结果。这种每次只会有一个选择,可以根据结果确定移动哪一边的题目,可以用夹逼的方法来做。
- 在这里,输出结果改成了满足相加等于target的两个数,而不是他们的index。因为要排序,如果要输出index,需要对原来的数的index进行记录,方法是构造一个数据结构,包含数字的值和index,然后排序。
- 数组有序是这种解法的核心要求,所以切记查找前要对数组进行排序。