美文网首页
三数之和

三数之和

作者: EngineerPan | 来源:发表于2021-08-31 20:58 被阅读0次

题目:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

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

  • 例1:
输入:nums = [-1, 0, 1, 2, -1, -4]
输出:[[-1, -1, 2], [-1, 0, 1]]
  • 例2:
输入:nums = []
输出:[]
  • 例3:
输入:nums = [0]
输出:[]

答案

  • 暴力破解法
func threeNumSum(_ nums: [Int]) -> [[Int]] {
  /// 使用有序数组 + 集合的唯一性处理去重问题
  let soredArray = nums.sorted()
  var result = Set<[Int]>()
  for i in 0 ..< (soredArray.count - 2) {
    let sum = -soredArray[i]
    for j in (i + 1) ..< (soredArray.count - 1) {
      for k in (j + 1) ..< soredArray.count {
        if (soredArray[j] + soredArray[k]) == sum {
            result.insert([soredArray[i], soredArray[j], soredArray[k]])
          }
        }
      }
    }
  return Array(result)
}

  • 双指针法
func threeNumSum(_ nums: [Int]) -> [[Int]] {
  /// 处理异常情况
  guard !nums.isEmpty && (nums.count > 2) else { return [] }
  /// 1. 首先对数据进行排序
  let sortedArray = nums.sorted()
  /// 2. 初始化左右指针
  var result = [[Int]](),
        left = 0,
        right = sortedArray.count - 1
  for i in 0 ..< sortedArray.count - 2 {
    if (i > 0) && (sortedArray[i] == sortedArray[i - 1]) {
      continue
    }
    left = i + 1
    let sum = -sortedArray[i]
    while left < right {
      let res = sortedArray[left] + sortedArray[right]
      if sum == res {
        result.append([sortedArray[i], sortedArray[left], sortedArray[right]])
        /// 去重
        /// 左指针向右边移动
        while (left < right) {
          // 不管前后相不相等,left 都要往前走
          left += 1
          if (nums[left - 1] != nums[left]) {
              break
              }
          }
          /// 右指针向左边移动
          while (left < right) {
              // 不管前后相不相等,right 都要往后走
              right -= 1
              if (nums[right + 1] != nums[right]) {
                  break
                 }
              }
          } else if sum < res {
              right -= 1
          } else {
              left += 1
          }
        }
    }
  return result
}

相关文章

  • algrithrom

    求和问题,双指针解决 done 两数之和 三数之和 最接近三数之和 四数之和 链表反转问题 done 链表反转 链...

  • LeetCode 第18题:四数之和

    1、前言 2、思路 采用三数之和的思路,原本三数之和可以分解为:数组中的一个数 + 此数右边的数求两数之和,那么四...

  • 两数之和&三数之和&四数之和&K数之和

    今天看了一道谷歌K数之和的算法题,忽然想起来之前在力扣上做过2、3、4数之和的题,觉得很有必要来整理一下。其实2、...

  • 两数之和,三数之和

    转载:https://www.cnblogs.com/DarrenChan/p/8871495.html 1. 两...

  • 双指针总结

    左右指针 主要解决数组中的问题:如二分查找 盛最多水的容器 三数之和 四数之和 最接近三数之和 快慢指针 主要解决...

  • 【LeetCode通关全记录】15. 三数之和

    【LeetCode通关全记录】15. 三数之和 题目地址:15. 三数之和[https://leetcode-cn...

  • leetcode top100

    1.求两数之和(数组无序) 2.求电话号码的字母组合 3.三数之和 4.两数之和(链表)

  • 纯C手撕leetcode-基本数据结构-hash table

    Hash table纯C实现两数之和和Hashtable 三数之和https://leetcode-cn.com/...

  • 三数之和

    三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a +...

  • 三数之和

    三数之和这里我是将用最暴力的三重循环来检验x + y = -z,然后排序过后输出,但是这样时间复杂度为O(n^3)...

网友评论

      本文标题:三数之和

      本文链接:https://www.haomeiwen.com/subject/alxbkltx.html