Python 刷题日记:LeetCode: 1&15&16-Two Sum and 3Sum

这篇博文整理了关于做2Sum和3Sum的做题心得,这类题目都是给定一个整数数组和一个目标值,然后从数组中找出加和等于目标值的下标或值。

LeetCode 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].
解题思路

1、最简单的思路就是两次遍历数组寻找与target相等的值,这样的做法时间复杂度为O(n^2),如果是三个数相加复杂度就变成了O(n^3),这样显然无法通过LeetCode的时间复杂度限制。
2、利用python中字典的特点,把每次遍历的值都存在字典中,下次要用的时候直接调用。这样的做法可以将复杂度降为O(n)。

def twoSum(nums,target):
    dic={}   ##key存储nums里的数  value 存储下标
    len_nums=len(nums)

    for i in range(len_nums):

        if target-nums[i] in dic:
            return [dic[target-nums[i]],i]

        else:
            dic[nums[i]]=i

LeetCode 15:

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note: The solution set must not contain duplicate triplets.

For example, given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]
解题思路

1、最简单的就是遍历,时间复杂度为O(n^3)。
2、设置两个j、k指针,负责前后移动。其实就是对每一个i,都寻找一遍使的nums[i]+nums[j]+nums[k]=0的值,这样的复杂度为O(n^2)。

def threeSum2(nums):
    res = []
    nums.sort()
    for i in xrange(len(nums)-2):
        if i > 0 and nums[i] == nums[i-1]:  #为了避免重复
            continue
        l, r = i+1, len(nums)-1    #设置两个指针,负责前后移动
        while l < r:
            s = nums[i] + nums[l] + nums[r]
            if s < 0:
                l +=1 
            elif s > 0:
                r -= 1
            else:
                res.append((nums[i], nums[l], nums[r]))
                while l < r and nums[l] == nums[l+1]:
                    l += 1
                while l < r and nums[r] == nums[r-1]:
                    r -= 1
                l += 1; r -= 1
    return res

LeetCode 16:

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

For example, given array S = {-1 2 1 -4}, and target = 1.

The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
解题思路:

思路其实和上面一题一样,只是上面一题的基础上去除了“去重的部分”因为该题只需返回sum值。同时,设置了一个判断条件使得最接近target的值输出。

def threeSumClosest(num, target):
    num.sort()
    res = num[0] + num[1] + num[2]
    for i in xrange(len(num) - 2):
        j, k = i+1, len(num) - 1
        while j < k:
            s = num[i] + num[j] + num[k]
            if s == target:
                return sum

            if abs(s - target) < abs(res - target):
                res = s

            if s < target:
                j += 1
            elif s > target:
                k -= 1

    return res      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值