• 三数之和


    给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a + b + c = 0?找出满足所有满足条件的且不重复的三元组。

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

    例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
    
    满足要求的三元组集合为:
    [
      [-1, 0, 1],
      [-1, -1, 2]
    ]

    解法一

    思路如下:

    1. 首先排序,减少多余操作,从小到大进行排序
    2. 进行重复过滤
    3. 将三数之和为0可以转化为a + b = -c ,转化为两个数之和与-c相比较
    4. 通过下标i,下标low = i + 1、下标high = nums.count - 1来判断相等target = 0 - nums[i]
    5. nums[low] + nums[high] = target,则加入结果集同时i右移,high左移继续遍历,若< target,则右移,若> target则左移
    var nums = [-1, 0, 1, 2, -1, -4]
    func threeSum(_ nums: [Int]) -> [[Int]] {
        guard nums.count > 2 else {return [] }//数组长度小于等于2,则返回空
        let numsSort = nums.sorted()//数组排序
        var resultArr = [[Int]]()
        for i in 0..<numsSort.count {
            if i > 0 && numsSort[i] == numsSort[i - 1] {continue}//重复过滤
            let target = 0 - numsSort[i] //将a + b + c = 0,转化为 a + b = -c
            var low: Int = i + 1
            var high: Int = numsSort.count - 1
            while low < high {
                let sum = numsSort[low] + numsSort[high]
                if sum == target {
                    let result = [numsSort[i], numsSort[low],numsSort[high]]
                    resultArr.append(result)
                    while low < high && numsSort[low]  == numsSort[low + 1] {
                        low = low + 1
                    }
                    while low < high  && numsSort[high] == numsSort[high - 1]{
                        high = high - 1
                    }
                    low = low + 1
                    high = high - 1
                } else if sum < target {
                    low = low + 1
                } else {
                    high = high - 1
                }
            }
        }
        return resultArr
    }
    
    var results: [[Int]] = threeSum(nums)

    解法二

    思路如下:

    1. 首先对数组进行排序,排序后固定一个数nums[i],则使用左右指针指向nums[i]后面的两端,数字分别为

    numsSorted[low]和numsSorted[high],计算三个数的是否为target = 0,如果满足则添加进结果集

      2.  如果numsSorted[i]大于0,如果已经排好序之后,则三数之和必然无法等于0,结束循环

      3.  如果 numsSorted[i] == numsSorted[i1],则说明该数字重复,会导致结果重复,所以应该跳过

      4.  当sum == 0 ,numsSorted[low] == numsSorted[low + 1]则会导致结果重复,应该跳过

      5.  当sum == 0 ,numsSorted[high] == numsSorted[high + 1]则会导致结果重复,应该跳过

    var nums = [-1, 0, 1, 2, -1, -4]
    func threeSum(_ nums: [Int]) -> [[Int]] {
        guard nums.count > 2 else {return []}
        var resultArr = [[Int]]()
        var numsSorted: [Int] = nums.sorted()
        for i in 0..<numsSorted.count {
            if numsSorted[i] > 0 {break}
            if i > 0 && numsSorted[i] == numsSorted[i - 1] {continue}
            var low = i + 1
            var high = numsSorted.count - 1
            while low < high {
                let target = numsSorted[i] + numsSorted[low] + numsSorted[high]
                if target == 0 {
                    let result: [Int] = [numsSorted[i], numsSorted[low], numsSorted[high]]
                    resultArr.append(result)
                    while (low < high && numsSorted[low] == numsSorted[low + 1]) {
    //                    low ++//在swift3中low++被移除了
                        low += 1
                    }
                    while low < high && numsSorted[high] == numsSorted[high - 1] {
                        high -= 1
                    }
                    low += 1
                    high -= 1
                } else if target < 0 {
                    low += 1
                } else {
                    high -= 1
                }
            }
        }
        return resultArr
    }
    
    var results: [[Int]] = threeSum(nums)
    print(results)

    上面的两份代码可以直接运行查看结果,都是如下

    如果想进大公司,还是希望大家能手动敲写一下,对自己还是很有用的!!!

  • 相关阅读:
    linux 重定向输出到文件、nohup、&
    linux 挂载 iso 镜像文件、CentOS设置本地yum源
    模拟信号、数字信号

    Spring集成数据访问框架、集成NoSql数据库
    spring profile机制测试
    Dockerfile、push到阿里云
    镜像、容器、部署tomcat、修改容器为新镜像、容器卷
    SpringMVC源码
    JNDI
  • 原文地址:https://www.cnblogs.com/guohai-stronger/p/11735699.html
Copyright © 2020-2023  润新知