前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构算法操作试题(C++/Python)——四数之和

数据结构算法操作试题(C++/Python)——四数之和

作者头像
莫斯
发布2020-09-09 21:02:09
4860
发布2020-09-09 21:02:09
举报
文章被收录于专栏:备份备份

数据结构算法操作试题(C++/Python):数据结构算法操作试题(C++/Python)——目录


1. 题目

leetcode 链接:https://leetcode-cn.com/problems/4sum/

在这里插入图片描述
在这里插入图片描述

2. 解答

解法1: 排序,双指针夹逼

python:656 ms,10.8 MB

代码语言:javascript
复制
class Solution(object):
    def fourSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        nums.sort()
        res = []
        for i in range(len(nums) - 3):
            for j in range(i + 1, len(nums) - 2):
                tmp_sum =  nums[i] + nums[j]
                start = j + 1
                end = len(nums) -1
                while start < end:
                    if nums[start] + nums[end] + tmp_sum < target:
                        start += 1
                    elif nums[start] + nums[end] + tmp_sum > target:
                        end -= 1
                    else:
                        tmp_list = [nums[i], nums[j], nums[start], nums[end]]
                        if tmp_list not in res: res.append(tmp_list)
                        start += 1
                        end -= 1
        return res

解法2: 排序 + Hash

python:136ms, 15.1MB

代码语言:javascript
复制
class Solution(object):
    def fourSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
    nums, result, lookup = sorted(nums), [], collections.defaultdict(list)
        for i in xrange(0, len(nums) - 1):
            for j in xrange(i + 1, len(nums)):
                is_duplicated = False
                for [x, y] in lookup[nums[i] + nums[j]]:
                    if nums[x] == nums[i]:
                        is_duplicated = True
                        break
                if not is_duplicated:
                    lookup[nums[i] + nums[j]].append([i, j])
        ans = {}
        for c in xrange(2, len(nums)):
            for d in xrange(c+1, len(nums)):
                if target - nums[c] - nums[d] in lookup:
                    for [a, b] in lookup[target - nums[c] - nums[d]]:
                        if b < c:
                            quad = [nums[a], nums[b], nums[c], nums[d]]
                            quad_hash = " ".join(str(quad))
                            if quad_hash not in ans:
                                ans[quad_hash] = True
                                result.append(quad)
        return result

其他方法看 leetcode 链接 评论区~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-03-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解答
    • 解法1: 排序,双指针夹逼
      • 解法2: 排序 + Hash
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档