Leetcode 15. 三数之和

计算机软件开发 2024-9-24 15:37:02 169 0 来自 中国
标题要求

给你一个整数数组 nums ,判定是否存在三元组 [nums, nums[j], nums[k]] 满意 i != j、i != k 且 j != k ,同时还满意 nums + nums[j] + nums[k] == 0 。请你返回全部和为 0 且不重复的三元组。
留意:答案中不可以包罗重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
表明:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
差别的三元组是 [-1,0,1] 和 [-1,-1,2] 。
留意,输出的次序和三元组的次序并不紧张。
示例 2:
输入:nums = [0,1,1]
输出:[]
表明:唯一大概的三元组和不为 0 。
示例 3:
输入:nums = [0,0,0]
输出:[[0,0,0]]
表明:唯一大概的三元组和为 0 。
提示:

  • 3 <= nums.length <= 3000
  • -10^5 <= nums <= 10^5
解题思绪

这道题,如果用暴力的解法,须要O(n^3) 的时间复杂度。由于标题给出的数据规模为10^5,如果直接用暴力解法肯定会超时。
标题只要求输出和为0的三元组,但是不要求保持数组的次序,以是可以考虑先对数组举行排序。
之前有一道雷同的标题,要求排序数组中,和为target的两个数。可以用双指针的方法,具体如下:

  • 起首将数组从小到大肆行排序
  • 将左指针指向数组头,右指针指向数组尾,计算当前的和
  • 如果和大于target,则右指针往左移动,使得和变小一点
  • 如果和小于target,则左指针往右移动,使得和变大一点
这道题完全可以鉴戒上面的思绪,也利用双指针的方法,只不外和的目的值target不一样。具体思绪如下:

  • 起首选定一个值K
  • 找到剩下两个值,和为-K即可
方法时间复杂度空间复杂度双指针法O(n^2)O(1)Java代码
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2025-3-15 06:22, Processed in 0.179610 second(s), 33 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表