美文网首页
15. 三数之和

15. 三数之和

作者: 邦_ | 来源:发表于2022-07-21 09:40 被阅读0次

本来想着dfs+剪枝的= = 去重也做了啊 结果超时。。
好吧换方法


func threeSum(_ nums: [Int]) -> [[Int]] {

    
        let len = nums.count
        if len < 3 {
            return []
        }
        let sortNums = nums.sorted()
        var ans = [[Int]]()
        var sum = 0
        var tempArray = [Int]()
        dfs(0,0,sortNums,len,&tempArray,&sum,&ans)
        return ans
    
    }
    
    func dfs(_ index:Int,_ begin:Int,_ sortNums:[Int],_ len:Int,_ tempArray:inout [Int],_ sum:inout Int,_ ans:inout [[Int]]  ) {
        
        if index == 3 {
            if sum == 0 {
                ans.append(tempArray)
            }
            return
            
        }
        
        for i in begin..<len{
        
           if i > begin && sortNums[i] == sortNums[i - 1] {
                continue
            }
            
            sum += sortNums[i]
            tempArray.append(sortNums[i])
            dfs(index + 1,i + 1,sortNums,len,&tempArray,&sum,&ans)
            sum -= tempArray.removeLast()
            
        }
        
    }


三指针版本


func threeSum(_ nums: [Int]) -> [[Int]] {

    
        let len = nums.count
        if len < 3 {
            return []
        }
        let sortNums = nums.sorted()
        var ans = [[Int]]()
        let lastIndex = len - 2
        var r = 0 ,c = 0
        for i in 0..<lastIndex{
            
            c = i + 1
            r = len - 1
            let numI = sortNums[i]
            if i > 0 && sortNums[i - 1] == numI {
                continue
            }
            
            while c < r {
                let numC = sortNums[c]
                let numR = sortNums[r]
                let sum = numR + numC + numI
                //说明值偏大了
                if  sum > 0 {
                    r -= 1
                }else if sum < 0{
                    c += 1
                }else {
                    ans.append([numI,numC,numR])
                    //跳过相同的值
                    while c < r && numC == sortNums[c + 1]{
                        c += 1
                    }
                    while c < r && numR == sortNums[r - 1]{
                        r -= 1
                    }
                    c += 1
                    r -= 1
                }
            }
            
        }
  
        return ans
    
    }












相关文章

网友评论

      本文标题:15. 三数之和

      本文链接:https://www.haomeiwen.com/subject/svpeirtx.html