一、题目
374. 猜数字大小 https://leetcode-cn.com/problems/guess-number-higher-or-lower/
二、想法
1.猜数字,隐形中也是对有序整形数组进行大小比较,所以可以进行二分查找算法,加快查找速率
/**
* 猜数字,隐形中也是对有序整形数组进行大小比较,所以可以进行二分查找算法,加快查找速率
*/
fun guessNumber(n:Int):Int {
var left = 1
var right = n
while(left <= right) {
val mid = left + (right - left) / 2
val result = guess(mid)
if (result == 0) {
return mid
} else if (result == 1) {
left = mid + 1
} else {
right = mid - 1
}
}
return -1
}
三、复杂度分析
时间复杂度:O(logN), 每次循环都会丢弃一半的查找空间 空间复杂度:O(1), 使用一个整数型变量mid来记录中间值
四、优秀解法
/**
* 三分查找法
* 但是最坏情况下复杂度比二分查找算法高,不推荐使用
*/
fun guessNumber(n: Int): Int {
var low = 1
var high = n
while(low <= high) {
val mid1 = low + (high - low)/3
val mid2 = high - (high - low)/3
val res1 = guess(mid1)
val res2 = guess(mid2)
if (res1 == 0) {
return mid1
} else if (res2 == 0) {
return mid2
} else if (res1 < 0) {
high = mid1 -1
} else if (res2 > 0) {
low = mid2 + 1
} else {
low = mid1 + 1
high = mid2 -1
}
}
return -1
}
五、学到了什么
1. 本来是mid跟目标值进行比较,题目是将目标值封装到了一个guess()函数中,所以是一个简单的二分查找算法题目变换问题 |
2. 三分查找算法:就是分隔成3段,可以有2个隔断点进行比较,然后对2个隔断间比较大小,再确定是在3段中的那一段,但是最坏情况下时间复杂度比二分查找算法高,不推荐使用 |