首页 > 编程语言 >算法题:牛牛的三元组问题

算法题:牛牛的三元组问题

时间:2023-10-05 22:32:28浏览次数:29  
标签:__ findTriplets nums 牛牛 三元组 break 算法


牛牛的三元组问题_牛客题霸_牛客网

描述

动物牛牛是一个勇敢的冒险家,它正在探索一个神秘的岛屿。岛上有许多宝藏,但是宝藏被隐藏在一系列数字中。牛牛找到了一个整数数组 nums,它相信这个数组中存在一些特殊的三元组,满足以下条件:

  • 三元组的和等于 0。
  • 三元组中的元素不能重复。
  • 牛牛想按照字典序返回所有满足条件的三元组。

请你帮助牛牛解决这个问题,设计一个函数 findTriplets,接收一个整数数组 nums 作为参数,并返回一个二维整数数组,表示满足条件的三元组,按照字典序返回所有的三元组。

示例1

输入:


[-1,0,1,2,-1,-4]


复制返回值:


[[-1,-1,2],[-1,0,1]]


复制

示例2

输入:


[2, -1, 1, -2, 0, -2]


复制返回值:


[[-2,0,2],[-1,0,1]]


复制

备注:

  • 3 <= nums.length <= 3000
  • 数组中的整数范围为 [-10^5, 10^5]

解题思路:先排序,然后直接3个for循环,但在具体操作过程中,需要去除重复三元组,所以加了两处判断:

if i > 0 and nums[i] == nums[i - 1]:

if j > i + 1 and nums[j] == nums[j - 1]:

算法完整代码:# 31ms, 6392KB

class Solution:
    def findTriplets(self, nums):
        # [-2, -2, -1, 0, 1, 2]
        nums = sorted(nums)
        n = len(nums)
        ans_set = []
        for i in range(n - 2):
            if i > 0 and nums[i] == nums[i - 1]:
                continue
            if nums[i] > 0:
                break
            j = i + 1
            while j < n - 1:
                if j > i + 1 and nums[j] == nums[j - 1]:
                    j += 1
                    continue
                if (nums[i] + nums[j]) > 0:
                    break
                for k in range(j + 1, n):
                    if nums[i] + nums[j] + nums[k] > 0:
                        break
                    elif nums[i] + nums[j] + nums[k] == 0:
                        ans_set.append([nums[i], nums[j], nums[k]])
                        break
                j += 1

        return ans_set


if __name__ == '__main__':
    sol = Solution()
    # print(sol.findTriplets([-1, 0, 1, 2, -1, -4]))
    # print(sol.findTriplets([2, -1, 1, -2, 0, -2]))
    print(sol.findTriplets([0, 0, 0, 0, 0, 0]))

标签:__,findTriplets,nums,牛牛,三元组,break,算法
From: https://blog.51cto.com/u_13946099/7717978

相关文章

  • 算法学习——“原地哈希法”
    这个方法名是一名网友给起的,很形象。简单理解就是,在一个数组中,将数值为a的元素放到索引为a的位置上去,这是一种降低空间复杂度的方法,在一些有条件限制的场景中非常适用。下面给两个力扣的例子进行详解。练习题目1:LCR120.寻找文件副本设备中存有 n 个文件,文件 id 记于数组......
  • C/C++学习 -- HMAC算法
    1.HMAC算法概述HMAC,全称为HMAC-MD5、HMAC-SHA1、HMAC-SHA256等,是一种在数据传输中验证完整性和认证来源的方法。它结合了哈希函数和密钥,通过在数据上应用哈希函数,生成一个带密钥的散列值,用于验证数据的完整性。HMAC算法广泛应用于网络协议、数字签名、认证和访问控制等领域。2.HM......
  • 【ACM算法】整数分块
    思考如何计算以下算式:\[\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor\qquad(n\le10^6)\]所有人都会觉得这个非常简单,一个for循环可以直接解决,时间复杂度\(O(n)\),但是如果将\(n\)的范围改大一点点,改成\(n\leq10^{12}\)呢?这时如果我们用朴素算法一定会T;但是我们可以手......
  • 10.5算法
    对称二叉树给你一个二叉树的根节点root,检查它是否轴对称。 示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false 提示:树中节点数目在范围[1,1000]内-100<=Node.val<=100 /** * Definition for a binary tree......
  • 【知识点】如何找到正确的算法?
    算法思路一、多组查询·考虑如何利用已知信息避免重复查询。·考虑各种预处理,例如前缀和。二、规模减小·考虑树、链等三、以小见大·考虑特殊情况,并考虑以此为基础继续转移四、模拟优化·考虑高维复杂度算法,并考虑尽可能优化五、题面信息·数据规模\[n≥10......
  • 【知识点】如何找到正确的算法?
    #算法思路**一、多组查询**·考虑如何利用已知信息避免重复查询。·考虑各种预处理,例如前缀和。------------**二、规模减小**·考虑树、链等------------**三、以小见大**·考虑特殊情况,并考虑以此为基础继续转移------------**四、模拟优化**·考虑高维复杂度......
  • 【基础算法】排序算法 —— 插入排序
    一、算法原理插入排序将数组分为已排序区间和未排序区间,初始已排序区间只有数组第1个元素,未排序区间从下标1开始到数组末尾。每次取未排序区间的第1个元素,将它插入已排序区间的合适位置,并保证已排序区间一直有序。重复这个过程,直到未排序区间为空,算法结束。给有序数组(已排序区......
  • 【基础算法】排序算法 —— 选择排序
    一、算法原理选择排序将数组分为已排序区间和未排序区间,每次选择未排序区间的最小元素,将它放到已排序区间末尾。一次选择会让一个元素移动到它应该在的位置,重复n次,就完成了n个数据的排序。 示例:使用选择排序对数组arr=[4,5,6,3,2,1]从小到大排序。第1次选择:第2次选择:......
  • 【基础算法】排序算法 —— 冒泡排序
    一、算法原理冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,如果不满足大小关系要求,就进行交换。一次冒泡会让至少一个元素移动到它应该在的位置,重复n次,就完成了n个数据的排序。 示例:使用冒泡排序对数组arr=[4,5,6,3,2,1]从小到大排序。第1次......
  • 稳定婚姻问题(Gale-Shapley算法)
    前言今天duck、香饽饽老板和彬彬一起出了个模拟赛,赛时T2想到了跟正解很接近的做法,但最后还是打挂了then喜提0pts,后面duck讲题的时候才知道是稳定婚姻板题。看完证明之后觉得很妙,遂开坑。只是简单整理,图一乐子吧算是。说是稳定婚姻问题,但其实我觉得更合适的叫法是属性稳定分......