Python|Leetcode《1995》|统计特殊四元组

简介: Python|Leetcode《1995》|统计特殊四元组

一、题目描述

题目:统计特殊四元组

难度:简单

描述:给你一个 下标从 0 开始 的整数数组 nums ,返回满足下述条件的 不同 四元组 (a, b, c, d) 的数目 :

  • nums[a] + nums[b] + nums[c] == nums[d]
  • a < b < c < d


示例1

输入:nums = [1,2,3,6]

输出:1

解释:满足要求的唯一一个四元组是 (0, 1, 2, 3) 因为 1 + 2 + 3 == 6 。


示例2

输入:nums = [1,1,1,3,5]

输出:4

解释:满足要求的 4 个四元组如下:

(0, 1, 2, 3): 1 + 1 + 1 == 3

(0, 1, 3, 4): 1 + 1 + 3 == 5

(0, 2, 3, 4): 1 + 1 + 3 == 5

(1, 2, 3, 4): 1 + 1 + 3 == 5


示例3

输入:nums = [3,3,6,4,5]

输出:0

解释:[3,3,6,4,5] 中不存在满足要求的四元组。


提示:

4 <= nums.length <= 50

1 <= nums[i] <= 100


二、题目解析

本题给出的难度为一道简单题,其简单的原因在于题目中提示给出的范围较小,我们使用暴力法(枚举)四个循环能够解决问题,但是这样的时间复杂度显然过高,因此尝试使用另一种解题思路——统计两数之和。


题目中给出的算式是一个四元组,因此我们可以尝试将其分为两部分,一部分为nums[a]+nums[b],另一部分为num[d]-num[c],此时的过程如下:


1.确定四个索引能够取到的范围(n为nums的长度):

a:(0,n-4)

b:(1,n-3)

c:(2,n-2)

d:(1,n-1)

2.得到所有的对于固定的b值考虑当前所有nums[a]+nums[b]的情况;

3.对于所有2的情况,考虑c和d出现的情形(固定索引c的值为b+1,从b+2开始到n-1遍历d的值);

4.通过步骤2、3的结合即可得到所有情况,计算满足条件的次数即可。

每次操作的范围如下(结合代码注释看更容易理解):

image.png

三、解题代码

解法(一)

暴力解法

class Solution:
    def countQuadruplets(self, nums: List[int]) -> int:
        n = len(nums)
        res = 0
        for a in range(n - 3):
            for b in range(a + 1, n - 2):
                for c in range(b + 1, n - 1):
                    for d in range(c + 1, n):
                        if nums[a] + nums[b] + nums[c] == nums[d]:
                            res += 1
        return count

解法(二)

统计两数之和(解析中的解法)

class Solution:
    def countQuadruplets(self, nums: List[int]) -> int:
        ct, res, n = Counter(), 0, len(nums)
        # 首先固定b的位置
        for b in range(1, n - 2):
            # 对于b的位置,每一个前面的位置都能够当作是a
            for a in range(b):
                # 计算a和b的加和,出现相同的和讲该位置的结果+1(Counter可以了解一下)
                ct[nums[a] + nums[b]] += 1
            # 每次固定c的位置为b+1,从b+2开始寻找d
            for d in range(b + 2, n):
                # 找到d-c的位置,有记录则加记录数,没有则加0
                res += ct[nums[d] - nums[b + 1]]
        return res
相关文章
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
124 2
|
2月前
|
数据可视化 数据挖掘 Python
Seaborn 库创建吸引人的统计图表
【10月更文挑战第11天】本文介绍了如何使用 Seaborn 库创建多种统计图表,包括散点图、箱线图、直方图、线性回归图、热力图等。通过具体示例和代码,展示了 Seaborn 在数据可视化中的强大功能和灵活性,帮助读者更好地理解和应用这一工具。
46 3
|
2月前
|
JSON 数据格式 Python
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
这篇文章介绍了一个Python脚本,用于统计TXT或JSON文件中特定单词的出现次数。它包含两个函数,分别处理文本和JSON文件,并通过命令行参数接收文件路径、目标单词和文件格式。文章还提供了代码逻辑的解释和示例用法。
52 0
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
|
2月前
|
数据可视化 Serverless Python
Python小事例—质地不均匀的硬币的概率统计
Python小事例—质地不均匀的硬币的概率统计
62 0
|
4月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
58 3
|
4月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
26 3
|
4月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
29 1
|
4月前
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
34 1
|
4月前
|
算法 Python
【Leetcode刷题Python】295. 数据流的中位数
本文介绍了一种使用Python实现的数据结构,用以支持数据流中添加整数并返回当前所有元素的中位数,通过排序列表来计算中位数。
32 1