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)空间复杂度取决于排序算法

夹逼方法中的感悟:

  1. 原理是因为数组是有序的,那么假设当前结果比target大,那么左端序号右移只会使两个数的和更大,反之亦然。所以每次只会有一个选择,从而实现线性就可以求出结果。这种每次只会有一个选择,可以根据结果确定移动哪一边的题目,可以用夹逼的方法来做。
  2. 在这里,输出结果改成了满足相加等于target的两个数,而不是他们的index。因为要排序,如果要输出index,需要对原来的数的index进行记录,方法是构造一个数据结构,包含数字的值和index,然后排序。
  3. 数组有序是这种解法的核心要求,所以切记查找前要对数组进行排序。
上一篇下一篇

猜你喜欢

热点阅读