本篇主要介绍一道基础算法题,两数相加,目的我们首先有一个值,还有一个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