• 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
        }
    }
    
  • 相关阅读:
    Java多态
    24系列EEPROM应用注意事项
    EEPROM读写问题
    EEPROM读写操作常见的陷阱
    MPLAB X IDE使用心得
    PIC18系列单片机I/O端口操作寄存器及应用
    IAR使用printf()函数 打印输出
    0欧电阻作用
    IAR MSP430设置合理堆栈大小(the stack pointer for stack is outside the stack range)
    MSP430教程14:MSP430单片机ADC12模块
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/12715157.html
Copyright © 2020-2023  润新知