OJ: Two Sum

题意


题意就是给出一数字列表,找出两个数,使俩数和等于给定的一个整数,求出这俩数的下标。

比如:
Input: numbers={2, 7, 11, 15}, target=9·
Output: index1=1, index2=2

思路


解题的时候,用的是 HashTable 思路很简单,就是首先将数组中所有的数插入到哈希表内,然后再在哈希表内查找即可。PS:数据量比较大, O(n2) 的复杂度会TLE;后来看到有人直接使用字典存储,试了一次果然也可以AC–跪了啊。。代码量差太多了。


代码


首先是 HashTable 的代码

MAX = 200003
hashTable =[0 for i in range(MAX)]
mark =[0 for i in range(MAX)]


def ToHash(p):
    if p<0:
        return (p%MAX+MAX)%MAX
    return p%MAX

def insert(p):
    k = ToHash(p)
    while mark[k] and hashTable[k]!=p:
        k +=1
        if k>=MAX:
            k -= MAX
    hashTable[k]=p
    mark[k]+=1

def find(p):
    k = ToHash(p)

    while mark[k] and hashTable[k]!=p:
        k+=1
        if k>=MAX:
            k-= MAX
    return mark[k]

flag=0
nums =[0,4,3,0]
target=0
for i in nums:
    insert(i)


for i in nums:
    if find(target-i):
        if i*2==target:
            if mark[i]<2:
                continue
            else:
                flag =1
        break


        break
print mark[i]
print [nums.index(i)+1,nums.index(target-i)+1] if flag==0 else [nums.index(i)+1,len(nums)-nums[::-1].index(i)]

简洁的使用字典: 有点dp的感觉


m = {}
nums=[0,3,4,0]
target=0
for i,num in enumerate(nums):
    if target - num in m:
        print [m[target - num],i + 1]
    m[num] = i + 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值