力扣刷题day013——三数之和

目录

1.题目描述

2.题目分析

3.代码实现

4.一丢丢吐槽


1.题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

2.题目分析

对于这种数组的题目,我们可以首先想到用指针去做。然后这题是三元组,就首先想用三个指针去弄它。然后我们看题目是要和为0的整数数组,那么肯定必须要有整数和负数共同存在,或者全是0这种情况。于是我们就想到对数组进行排序,这样我们就可以根据数所在的位置来判断数的大小,然后可以使用一个外层循环 i 来遍历数组。由于数组已经排序,所以当 nums[i] > 0 时,可以直接停止遍历,因为后面的数都比 nums[i] 大,不可能再组成和为0的三元组。

3.代码实现

class Solution:

    def threeSum(self, nums: List[int]) -> List[List[int]]:

        n = len(nums)  

        res = []  # 初始化结果列表  

        if not nums or n < 3:  # 如果数组为空或长度小于3,则直接返回空列表  

            return []  

        nums.sort()  # 对数组进行排序  

        for i in range(n):  

            # 如果当前数字大于0,则由于数组已排序,不可能再找到三个数的和为0  

            if nums[i] > 0:  

                return res  

            # 跳过重复的数字,以避免结果重复  

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

                continue  

            L = i + 1  # 左指针,初始化为当前数字后面的位置  

            R = n - 1  # 右指针,初始化为数组末尾  

            while L < R:  

                total = nums[i] + nums[L] + nums[R]  

                if total == 0:  

                    res.append([nums[i], nums[L], nums[R]])  

                    # 跳过重复的数字  

                    while L < R and nums[L] == nums[L + 1]:  

                        L += 1  

                    while L < R and nums[R] == nums[R - 1]:  

                        R -= 1  

                    L += 1  # 移动左指针  

                    R -= 1  # 移动右指针  

                elif total > 0:  

                    R -= 1  # 如果和大于0,移动右指针  

                else:  

                    L += 1  # 如果和小于0,移动左指针  

        return res

4.一丢丢吐槽

最近考试周,昨天少更新了一天,找机会补回来!

我有罪/(ㄒoㄒ)/~~,忏悔!

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问题。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问题的关键。需要仔细分析题目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值