剑指 Offer II 007. 数组中和为 0 的三个数

2022-04-08  本文已影响0人  邦_

排序后,固定一个数 ,就变成了查找两数之和等于固定的数的反数
注意找到之后 要把左指针往右移动 右指针往左移动 要不会陷入死循环
但是会发现有重复的。。 如果相等的时候 双指针移动之后的元素是一样的
对于左指针的话 就是当前的和往后挪动一位的相等
对于右指针的话 就是当前的和往前挪动一位的相等
但是。。 还是会有重复的。。 因为前一个和后一个数字一样 有可能找出来的结果也是一样
所以 当前一个和后一个数字值相同的时候 跳过

注意这块是 -1 和前边的比, 不能和后边的比 这样会造成没有统计和计算的被直接跳过


while left < right && tempNums[left] == tempNums[left - 1]{
                        left += 1

                    }
                    while left < right && tempNums[right] == tempNums[right + 1]{
                        right -= 1
                    }




func threeSum(_ nums: [Int]) -> [[Int]] {
        
        if nums.isEmpty || nums.count < 3{
            return []
        }
        let tempNums = nums.sorted()
        var array :[[Int]] = Array()
        for i in 0..<tempNums.count - 1 {
            if  i > 0 && tempNums[i] == tempNums[i - 1] {
                continue
            }
            
            var left  = i + 1
            var right  = tempNums.count - 1
            while left < right {
                
                if tempNums[left] + tempNums[right] == -tempNums[i] {
                    array.append([tempNums[i],tempNums[left],tempNums[right]])
                    left += 1
                    right -= 1

                   while left < right && tempNums[left] == tempNums[left - 1]{
                        left += 1

                    }
                    while left < right && tempNums[right] == tempNums[right + 1]{
                        right -= 1
                    }
                    

                }
                else if tempNums[left] + tempNums[right] > -tempNums[i] {
                    
                   right -= 1

                }
                else {
                    
                    left += 1
                    
                }
                
            }
       
            
        }
       
        return array


        
    }






上一篇下一篇

猜你喜欢

热点阅读