zoukankan      html  css  js  c++  java
  • leetcode x数之和

    leetcode 1.两数之和

    # 暴力法(时间复杂度:O(n^2), 空间复杂度:O(1))
    class Solution(object):
        def twoSum(self, nums, target):
            n = len(nums)
            for i in range(n-1):
                for j in range(i+1, n):
                    if nums[i]+nums[j]==target:
                        return [i, j]
            return []
    # 求解
    s = Solution()
    s.twoSum([2,7,11,15], 9)
    # return
    [0, 1]
    
    # 哈希表(时间复杂度:O(n), 空间复杂度:O(n))
    class Solution(object):
        def twoSum(self, nums, target):
            hashmap = {}
            for idx, num in enumerate(nums):
                if target-num in hashmap:
                    return [hashmap[target-num], idx]
                else:
                    hashmap[num] = idx
            return []
    # 求解
    s = Solution()
    s.twoSum([2,7,11,15], 9)
    # return
    [0, 1]
    

    leetcode 167.两数之和 II - 输入有序数组

    class Solution(object):
        def twoSum(self, nums, target):
            if not nums: return []
            left, right = 0, len(nums)-1
            while left<right:
                total = nums[left] + nums[right]
                if total<target:
                    left += 1
                elif total>target:
                    right -= 1
                else:
                    return [left+1, right+1]
    # 求解
    s = Solution()
    s.twoSum([2, 7, 11, 15], 9)
    # return
    [1, 2]
    

    leetcode 15.三数之和

    # 双指针法
    class Solution(object):
        def threeSum(self, nums):
            if not nums: return []
            res = []
            nums.sort()
            n = len(nums)
            for i in range(n):
                if nums[i]>0: break
                if i>0 and nums[i]==nums[i-1]: continue
                j = i+1
                k = n-1
                while j<k:
                    if nums[j]+nums[k]+nums[i]==0:
                        res.append([nums[i], nums[j], nums[k]])
                        while j<k and nums[j]==nums[j+1]: j+=1
                        while j<k and nums[k]==nums[k-1]: k-=1
                        j+=1
                        k-=1
                    elif nums[j]+nums[k]+nums[i]<0:
                        j+=1
                    else:
                        k-=1
            return res
    # 求解
    s = Solution()
    s.threeSum([-1,0,1,2,-1,-4])
    # return
    [[-1,-1,2],[-1,0,1]]
    

    leetcode 16.最接近的三数之和

    # 双指针法
    class Solution(object):
        def threeSumClosest(self, nums, target):
            if not nums: return []
            nums.sort()
            n = len(nums)
            res = sum(nums[:3])
            for i in range(n):
                j = i+1
                k = n-1
                while j<k:
                    s = nums[i]+nums[j]+nums[k]
                    if abs(res-target)>abs(s-target):
                        res = s
                    elif s>target:
                        k-=1
                    else:
                        j+=1
            return res
    # 求解
    s = Solution()
    s.threeSumClosest([-1,2,1,-4], 1)
    # return
    2
    

    leetcode 18.四数之和

    # 双指针法
    class Solution(object):
        def fourSum(self, nums, target):
            if not nums: return []
            if nums==[0,0,0,0] and target==0: return [nums]
            nums.sort()
            n = len(nums)
            res = []
            for i in range(n-3):
                if i>0 and nums[i]==nums[i-1]: continue
                if nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target: break
                if nums[i]+nums[n-3]+nums[n-2]+nums[n-1]<target: continue
                for j in range(i+1, n-2):
                    if j>i+1 and nums[j]==nums[j-1]: continue  # 此处必须是j>i+1而非j>i(j>i可能会跳过i与j相同时的情况,nums=[-1,0,1,2,-1,-4] target=-1时会跳过[-1,-1,0,1]这个解)
                    if nums[i]+nums[j]+nums[j+1]+nums[j+2]>target: break
                    if nums[i]+nums[j]+nums[n-2]+nums[n-1]<target: continue
                    left, right = j+1, n-1
                    while left<right:
                        if nums[i]+nums[j]+nums[left]+nums[right]==target:
                            res.append([nums[i], nums[j], nums[left], nums[right]])
                            while left<right and nums[left]==nums[left+1]: left+=1
                            while left<right and nums[right]==nums[right-1]: right-=1
                            left+=1
                            right-=1
                        elif nums[i]+nums[j]+nums[left]+nums[right]<target:
                            left+=1
                        else:
                            right-=1
            return res
    
    # 求解
    s = Solution()
    s.fourSum([1,0,-1,0,-2,2], 0)
    # return
    [[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
    
  • 相关阅读:
    Python----定义
    [转载]Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
    彻底明白IP地址——计算相关地址
    [转载] 教你如何迅速秒杀掉:99%的海量数据处理面试题
    [转载]从B 树、B+ 树、B* 树谈到R 树
    [转载]Java抽象类和接口的学习
    [转载]字符串匹配的Boyer-Moore算法
    [转载]字符串匹配的KMP算法
    [转载]孤儿进程与僵尸进程[总结]
    [转载]Huffman编码压缩算法
  • 原文地址:https://www.cnblogs.com/yutingting/p/12731971.html
Copyright © 2011-2022 走看看