[leetcode] 4つの数値の合計、ダブルポインタとHassiテーブル

3つの数値の合計を行った後、4つの数値の合計を行うのは簡単です。ここでは主にダブルポインタを使用して2つの数値の合計を実行します。他の2つの数値は列挙法を使用し、複雑さはO(n ^ 3)。コードは次のように表示されます。

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        if len(nums) < 4:
            return []

        def helper(num,target):#三数之和
            result = []
            if len(num) < 3: #如果没有3个数
                return #爬
            for i in range(len(num)-2): #第二次枚举
                if i > 0 and num[i] == num[i-1]:#优化,防止枚举重复
                    continue
                left = i + 1 #双指针开始动了
                right = len(num) -1
                while left < right:
                    sum_3 = num[i] + num[left] + num[right]
                    if sum_3 == target:
                        result.append([num[i],num[left],num[right]])#将此时的数字放入三数之和的结果
                        left += 1
                        right -= 1
                    elif sum_3 > target:
                        right -= 1
                    elif sum_3 < target:
                        left += 1
            return result

        nums.sort()
        print(nums)
        res = []
        for i in range(len(nums)-3):#第一次枚举
            if i > 0 and nums[i] == nums[i-1]:#防止枚举重复
                continue
            new_target = target - nums[i]#剩下三个数此时的和是new_target
            #回到三数之和
            session = nums[i+1:]
            temp = helper(session,new_target)
            print([i,temp])
            if temp != []: #有结果返回
                for j in temp:
                    o = j+[nums[i]] #将此时返回的结果与nums[i]相加
                    if o not in res:#防止重复呢
                        res.append(j+[nums[i]])
        return res

もちろん、ダブルポインタは非常に単純です。他の人のコードを読んだ後、ハッシュテーブルの複雑さがO(n ^ 2)に達する可能性があることがわかりました。
その理由は、2つの数値を列挙し、他の2つの数値の合計をハッシュする複雑さはO(n ^ 2)であるため、全体的な複雑さは
O(n ^ 2)ですが、スペースが犠牲になります。

代码如下:
class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        ans = []
        nums.sort()
        len_nums = len(nums)

        # hash后两个数的和,并保存索引
        table = {
    
    }
        for j in range(len_nums-1, 2, -1):
            if j < len_nums-1 and nums[j] == nums[j+1]:
                continue
            if 4 * nums[j] < target:
                break
            if nums[j] + 3*nums[0] > target:
                continue
            for i in range(j-1, 1, -1):
                if i < j-1 and nums[i] == nums[i+1]:
                    continue
                if nums[j] + 3*nums[i] < target:
                    break
                if nums[j] + nums[i] + 2*nums[0] > target:
                    continue
                table.setdefault(nums[i] + nums[j], []).append((i, j))

        # 枚举前两个数
        for i in range(len_nums-3):
            if i > 0 and nums[i] == nums[i-1]:
                continue
            if nums[i] * 4 > target:
                break
            if nums[i] + 3 * nums[-1] < target:
                continue
            for j in range(i + 1, len_nums-2):
                if j > i + 1 and nums[j] == nums[j-1]:
                    continue
                if nums[i] + 3*nums[j] > target:
                    break
                if nums[i] + nums[j] + 2*nums[-1] < target:
                    continue
                for index, jndex in table.get(target - nums[i] - nums[j], []):
                    if j < index:
                        ans.append([nums[i], nums[j], nums[index], nums[jndex]])

        return ans

作者:loyx
链接:https://leetcode-cn.com/problems/4sum/solution/ha-xi-biao-de-on2he-on3fang-fa-by-loyx/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

心を広げる別の日です

おすすめ

転載: blog.csdn.net/Sgmple/article/details/111303880