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
    }
}

猜你喜欢

转载自www.cnblogs.com/ganshuoos/p/12715157.html