leetcode刷题笔记十五 三数之和 Scala版本

leetcode刷题笔记十五 三数之和 Scala版本

源地址:15. 三数之和

问题描述:

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

The solution set must not contain duplicate triplets.

Example:

Given array nums = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

简要思路分析:

最简单的方法还是暴力法,三层循环,复杂度为O(n^3).

相比之下,较好的方式是使用hash表,通过选取两个数,然后根据hash寻找第三个数。

常用的方式是双指针法,由于三数之和为0,则三数之一必含有一个负数或者0,因此我们只需要对负数和0的列表进行遍历,在其中使用如十一题的双指针法,三数之和大于0,则正数指针向前一步,反之,负数指针向后一步,在O(n^2)内完成。

代码补充:

object Solution {
    def threeSum(nums: Array[Int]): List[List[Int]] = {
        val sortNum = nums.sorted
        //var tempArr = List[Int]()
        var resultArr = List[List[Int]]()

        for (iCur <- 0 until sortNum.length if (sortNum(iCur) <= 0) if(iCur == 0 || sortNum(iCur) != sortNum(iCur-1))){
            //val target = 0 - sortNum(iCur)
            var left = iCur + 1
            var right = sortNum.length - 1

            while (left < right){
              sortNum(left) + sortNum(right) + sortNum(iCur) match {
                  case sumArr if sumArr < 0 => left += 1
                  case sumArr if sumArr > 0 => right -= 1
                  case 0 => {
                      resultArr = resultArr :+ List(sortNum(iCur), sortNum(left), sortNum(right))
                      do (left += 1)  while(left < right && sortNum(left) == sortNum(left-1))
                      do (right -= 1) while(left < right && sortNum(right) == sortNum(right+1))                   
                      }
              }  
            }
        }
        return resultArr
    }
}
func threeSum(nums []int) [][]int {
    n := len(nums)
    sort.Ints(nums)
    ans := make([][]int, 0)

    for i := 0; i < n; i++ {
        if i > 0 && nums[i] == nums[i-1] {
            continue
        }
        for j, k := i+1, n-1; j < k; j++ {
            if j > i+1 && nums[j] == nums[j-1] {
                continue
            }
            for (j < k-1 && nums[i] + nums[j] + nums[k-1] >= 0) {
                k--
            }
            if nums[i] + nums[j] + nums[k] == 0 {
                ans = append(ans, []int{nums[i], nums[j], nums[k]})
            }
        }
    }
    return ans
}
posted @ 2020-04-16 19:37  ganshuoos  阅读(160)  评论(0编辑  收藏  举报