zoukankan      html  css  js  c++  java
  • 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
        }
    }
    
  • 相关阅读:
    pytorch-VGG网络
    pytorch-Alexnet 网络
    pytorch-LeNet网络
    硬链接与软链接有什么不同(ln)
    联想《拯救者》U盘UEFI启动装win7[完美激活](4)
    笔记本键盘、触控板锁定技巧(3)
    BridgePattern(23种设计模式之一)
    AdapterPattern(23种设计模式之一)
    Arduino Wire.h(IIC)库函数详解
    进制表示法
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/12715157.html
Copyright © 2011-2022 走看看