LeetCode--Two Sum

题目

给定一个数组sums,以及一个目标target,假设数组中一定存在唯一一组数(两个)的和为target,输出这两个数的索引

解题思路:

1、该题目最容易想到的方法是对sums进行遍历,把所有可能的组数进行遍历(n2复杂度),在leetcode中超时错误。之后去掉之前遍历的重复计算,i从0到len(sums)遍历sums,j遍历索引从i到len(sums)的sums子序列(n2/2的复杂度),在leetcode中可以AC,但是对应的计算效率很低。

2、因为一定存在唯一一组数,可以对排序后的sums数组进行一次首尾遍历,对首尾相加,若超过target,则尾指针前移一个位置,若小于target,则首指针向后移动一个位置,则在首尾指针相接之前一定可以找到一对满足条件的索引。复杂度为O(nlogn),排序复杂度O(nlogn),检索复杂度O(n)。

3、利用python字典查询或C语言的map查询。即哈希算法,新建立一个数组,新数组的下表是原来数组的数值,新数组的值为原来数组的下标。对新数组的key进行遍历,遍历时看target-key是否存在于字典中,若存在则返回,输出这两个key的键值即可。复杂度O(n)。

解题代码:

O(n)

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        d = {}
        size = 0
        while size < len(nums):
            if not nums[size] in d:
                d[nums[size]] = size  
            if target - nums[size] in d: 
                if d[target-nums[size]] < size : 
                    ans = [d[target - nums[size]] , size]
                    return ans
            size = size + 1




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值