Question

Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

You can return the answer in any order.

Example 1

Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Output: Because nums[0] + nums[1] == 9, we return [0, 1].

Example 2

Input: nums = [3,2,4], target = 6
Output: [1,2] 

Example 3

Input: nums = [3,3], target = 6
Output: [0,1]

Constraints

  • 2 \(\leq\) nums.length \(\leq 10^5\)
  • \(-10^9 \leq\) nums[i] \(\leq 10^9\)
  • \(-10^9 \leq\) target \(\leq 10^9\)
  • Only one valid answer exists.

My Interesting Code

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        for i in nums:
            temp = nums[:nums.index(i):] + nums[nums.index(i)+1::]
            for j in temp:
                if i + j == target:
                    result_1 = nums.index(i)
                    nums.remove(i)
                    result_2 = nums.index(j) + 1
                    return list((result_1, result_2))

My Perspective (Chinese Only)

之所以是interesting的代码,是因为个人擅长使用暴力拆解。所以在LeetCode的所有习题中,在保证通过的情况下,个人会优先考虑暴力拆解。暴力拆解的优势在于代码易于理解,但是其时间复杂度和空间复杂度较高。

首先,我们先依次遍历列表nums。以第一个Example为例,当我们取出数字2后,为了寻找符合target的元素,我们只需遍历除了数字2以外的元素即可。那么如何获取除了数字2以外的元素?Python自带的切片(split)可以很好的解决这个问题。所以,下面先来学习一下切片。

一个完整的切片表达式包含两个“:”,用于分隔三个参数(start_index、end_index、step)。当只有一个“:”时,默认第三个参数step=1;当一个“:”也没有时,start_index=end_index,表示切取start_index指定的那个元素。

step:正负数均可,其绝对值大小决定了切取数据时的“步长”,而正负号决定了“切取方向”,正表示“从左往右”取值,负表示“从右往左”取值。当step省略时,默认为1,即从左往右以步长1取值。

start_index:表示起始索引(包含该索引对应值);该参数省略时,表示从对象“端点”开始取值,至于是从“起点”还是从“终点”开始,则由step参数的正负决定,step为正从“起点”开始,为负从“终点”开始。

end_index:表示终止索引(不包含该索引对应值);该参数省略时,表示一直取到数据“端点”,至于是到“起点”还是到“终点”,同样由step参数的正负决定,step为正时直到“终点”,为负时直到“起点”。

nums = [1, 2, 3, 4]
>>nums[0: 2:] = [1, 2]
>>nums[1: 3: -1] = []
>>nums[: 2: -1] = [4]
>>nums[::] = [1, 2, 3, 4]
>>nums[::-1] = [4, 3, 2, 1]

学习好切片后,我们接着以第一个Example为例说明。当取出数字2后,利用切片,将nums中除了数字2以外的元素全部取出,组成新的列表temp。将temp中的每一个元素与数字2相加,如果结果等于target,便将两个元素的索引返回。注意,这里的元素索引应为nums中的元素索引值。特别地,在返回list时,小括号需用两层进行嵌套,否则会造成结果错误。

本题所采用的暴力拆解是一种易于理解,基于穷举并完全遍历的思想,会造成一定的时间和空间浪费,但由于Python的切片是基于for循环的一种优化,所以代码效率相较于纯for循环来说,要好很多。