leetcode01两数之和
一、题目
没事上leetcode上刷题。第一道两数之和,看似简单,实则没有想象中的简单。先看下题目:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数的下标。示例:
1给定 nums = [2, 7, 11, 15], target = 9
2因为 nums[0] + nums[1] = 2 + 7 = 9
3所以返回 [0, 1]
二、代码实现
1、找出对应值
1nums = [2, 7, 11, 15]
2target = 9
3l = []
4for x in nums:
5 for y in nums:
6 if (x + y) == target:
7 #print x,y
8 l.append(x)
9 l.append(y)
10print list(set(l))
根据示例要求,通过上面的代码测试,发现和需求不一致,题目是打印下标,这里是找出了对应的值,未打印出下标。
2、打印下标
1nums = [3,2,4]
2target = 6
3n = range(len(nums))
4l = []
5for x in n:
6 for y in n:
7 # [3,3] 6
8 #if nums[x] != nums[y]:
9 if x != y:
10 if nums[x] + nums[y] == target:
11 print x,y
12 l.append(x)
13 l.append(y)
14print list(set(l))
初始使用target=9 的数据测试时发现可以满足示例需求,修改为平台提交的函数格式后,在平台上提交后。发现其会换用输入值,发现在值为如下时不通过:
1nums = [3,2,4]
2target = 6
这时候如果使用上面的代码,三个标值全会打印出来。因为3+3=6 。这时候增加了if x != y:条件,但平台上又测试了输入为nums = [3,3] target=6情况时又不满足需求。
3、暴力推导
再次修改代码,这次暴力点,先把所有的组合给搞出来。再通过推导式求出下标就OK了。代码如下:
1from itertools import combinations
2nums = [2, 7, 11, 15]
3l = [c for c in combinations(nums, 2)]
4n = [ x for x in l if sum(x)==9]
5m = [ x for x in range(len(nums)) if nums[x]==n[0][0] or nums[x]==n[0][1] ]
6print m
这次的代码量非常少,看起来用的也非常高级,但在平台测试输入值为大的nums时,提示超出内存限制。因为使用了combinations方法,这个方法有点类似于笛卡尔积,消耗内存是一定的。
4、最终实现
这次换个思路,由加法换用减法。并通过字典方法,将满足条件的值和下标存入一个空字典中,并在满足条件后,取出vaule值,如下是最终提交给平台的代码:
1#!/usr/bin/env python
2# coding=utf8
3# ===============================================================================
4# Copyright (C) 2018 www.361way.com site All rights reserved.
5#
6# Filename :01sum.py
7# Author :yangbk
8# Create Time :2018-08-16 14:33
9# Description :
10# ===============================================================================
11class Solution(object):
12 def twoSum(self, nums, target):
13 """
14 :type nums: List[int]
15 :type target: int
16 :rtype: List[int]
17 """
18 d = {}
19 for i in range(len(nums)):
20 #y = target - nums[x]
21 x = nums[i]
22 if target-x in d:
23 return [d[target-x],i]
24 d[x] = i
最终推导思路和各步实现代码,我已上传到我的github上:
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/leetcode01-sum/5785.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.