两数相加 two-sum

本篇主要介绍一道基础算法题,两数相加,目的我们首先有一个值,还有一个array中,找出是否其中有两个数相加起来等于这个值,这里有三种解法,先从complexity最高的一种开始介绍

// 1. 暴力解 O(n^2)
func bruteForceSolution(array: [Int], sum: Int) -> Bool {
    for i in 0..<array.count {
        for j in 0..<array.count where j != i {
            if array[i] + array[j] == sum {
                print("\(array[i]), \(array[j])")
                return true
            } else {
                print("false: \(array[i]), \(array[j])")
            }
        }
    }
    return false
}

这个解法值得注意的是在第二个for loop,我们需要去掉在 j 不等于 i 的情况,这样就可以避免同一个元素加两次的情况
下面是第二种

// 2. 用二分法检索(binary search)解 O(n log n)
func binarySearchSolution(array: [Int], sum: Int) -> Bool {
    for i in 0..<array.count {
        let compliment = sum - array[i]
        var tempArray = array
        tempArray.remove(at: i)
        let result = binarySearch(array: tempArray, numberToLookFor: compliment)
        if result == true {
            print(array[i], compliment)
            return true
        }
    }
    return false
}

func binarySearch(array: [Int], numberToLookFor: Int) -> Bool {
    if array.count == 0 { return false }
    let midIndex = array.count / 2
    let minIndex = 0
    let maxIndex = array.count - 1
    let midValue = array[midIndex]
    if numberToLookFor < array[minIndex] || numberToLookFor > array[maxIndex] {
        return false
    }
    if numberToLookFor < midValue {
        let slice = Array(array[minIndex...midIndex - 1])
        return binarySearch(array: slice, numberToLookFor: numberToLookFor)
    }
    if numberToLookFor > midValue {
        let slice = Array(array[midIndex + 1...maxIndex])
        return binarySearch(array: slice, numberToLookFor: numberToLookFor)
    }
    if midValue == numberToLookFor {
        return true
    }
    
    return false
}

binarySearchSolution(array: array, sum: 5)

第二种是用二分法来解,在第一个function中,这里我写了一个for loop,我们需要找到在求和的值减去其中某个元素得到的补数,这个补数就是我们需要从二分法里找到的值,二分法的逻辑可以看我之前的写的博客
https://blog.csdn.net/SwiftIOS_watsUp/article/details/100111806
下面是第三种方法,也是最效率的办法,指针解法

// 3. 指针解法 O(n)
func pointerSolution(array: [Int], sum: Int) -> Bool {
    var lowIndex  = 0
    var highIndex = array.count - 1
    
    while lowIndex < highIndex {
        let tempSum = array[lowIndex] + array[highIndex]
        if sum == tempSum {
            print(array[lowIndex], array[highIndex])
            return true
        } else if tempSum > sum {
            highIndex -= 1
        } else if tempSum < sum {
            lowIndex += 1
        }
    }
    return false
}

pointerSolution(array: array, sum: 9)

指针解法的逻辑就是我们可以想设定两个指针,在这个while loop中,如果两数相加得到的值大于我们想要的值,高位的指针便向下移一个元素,如果小于我们想要的值,地位的指针便向上移一个元素,当两个指针指向同一个元素的时候,这个array中就没有我们想要找的值,就return false,如果相加等于我们的值,return true

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值