在一個二維數(shù)組中烧颖,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序
/** Swift
* 問題:在一個二維數(shù)組中炕淮,每一行都按照從左到右遞增的順序排序跳夭,每一列都按照從上到下遞增的順序排序。
* 請完成一個函數(shù)币叹,輸入這樣的一個二維數(shù)組和一個整數(shù),判斷數(shù)組中是否含有該整數(shù)颈抚。
*
* 思路:通過觀察我們可以選取一個臨界值(第一行的最后一個值/或最后一行第一個)進行對比從而不斷縮小范圍:
* - 查找數(shù)字 > 臨界值 則剔除本行 row + 1,更新臨界值
* - 查找數(shù)字 < 臨界值 則剔除本列 column - 1贩汉,更新臨界值
* - 查找數(shù)字 = 臨界值 則找到
*
* @param arr 待查找的數(shù)組
* @param number 要查找的數(shù)
* @return 查找結(jié)果,true找到匹舞,false沒有找到
*/
// MARK: - Find number
func find(number: Int, in arr: [[Int]]) -> Bool {
let rows = arr.count // 數(shù)組行數(shù)
let columns = arr[0].count // 數(shù)組列數(shù)
// 從第一行最后一個開始對比查找
var row = 0
var column = columns - 1
while row < rows && column >= 0 {
let temp = arr[row][column]
if number > temp {
row += 1
} else if number < temp {
column -= 1
} else {
return true
}
}
return false
}
// MARK: - Test
let arr = [
[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[100, 200, 300]
]
find(number: 1, in: arr)
find(number: 3, in: arr)
find(number: 300, in: arr)
find(number: 0, in: arr)
find(number: 10, in: arr)
find(number: 1000, in: arr)
運行結(jié)果:
github 請查看這里