LeetCode374 猜数字大小

这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

题目描述:

374. 猜数字大小 - 力扣(LeetCode) (leetcode-cn.com)

猜数字游戏的规则如下:

  • 每轮游戏,我都会从 1n 随机选择一个数字。 请你猜选出的是哪个数字。
  • 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。

你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-110):

-1:我选出的数字比你猜的数字小 pick < num

1:我选出的数字比你猜的数字大 pick > num

0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num

返回我选出的数字。

示例一

1
2
ini复制代码输入: n = 10, pick = 6
输出: 6

示例二

1
2
ini复制代码输入: n = 1, pick = 1
输出: 1

示例三

1
2
ini复制代码输入: n = 2, pick = 1
输出: 1

示例四

1
2
ini复制代码输入: n = 2, pick = 2
输出: 2

提示:

  • 1 <= n <= 2^31 - 1
  • 1 <= pick <= n

思路分析

二分查找

这个应该是典型的二分查找了,我们的区间即为 [1..n],再根据 guess(x) = 1 代表右区间大了。

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Kotlin复制代码class Solution {
/**
* The API guess is defined in the parent class.
* @param num your guess
* @return -1 if num is lower than the guess number
* 1 if num is higher than the guess number
* otherwise return 0
* fun guess(num:Int):Int {}
*/

class Solution:GuessGame() {
override fun guessNumber(n:Int):Int {
// 中位数严格小于目标数,那么左区间一定不是解
var left = 0
var right = n
while (left < right) {
val mid = (left + right) ushr 1
if (1 == guess(mid)) {
left = mid + 1
} else {
right = mid
}
}
return left
}
}

总结

典型的二分查找,可以尝试套用不同的二分查找公式来写出不一样的解。

参考

猜数字大小 - 猜数字大小 - 力扣(LeetCode) (leetcode-cn.com)

374. Guess Number Higher or Lower 猜数字大小 - 猜数字大小 - 力扣(LeetCode) (leetcode-cn.com)

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%