题目描述:
我们正在玩一个猜数字游戏。 游戏规则如下:
我从 1 到 n 选择一个数字。 你需要猜我选择了哪个数字。
每次你猜错了,我会告诉你这个数字是大了还是小了。
你调用一个预先定义好的接口 guess(int num),它会返回 3 个可能的结果(-1,1 或 0):
-1 : 我的数字比较小
1 : 我的数字比较大
0 : 恭喜!你猜对了!
示例 :
输入: n = 10, pick = 6
输出: 6
参考链接:https://leetcode-cn.com/problems/guess-number-higher-or-lower
解题思路:
1、暴力破解
//暴力破解法
/* The guess API is defined in the parent class GuessGame.
@param num, your guess
@return -1 if my number is lower, 1 if my number is higher, otherwise return 0
int guess(int num); */
//java
public class Solution extends GuessGame
{
public int guessNumber(int n)
{
for (int i = 1; i < n; i++)
if (guess(i) == 0)
return i;
return n;
}
}
算法复杂度分析:
时间复杂度:O(n)
空间复杂度:O(1)
2、二分法查找
//Java
/* The guess API is defined in the parent class GuessGame.
@param num, your guess
@return -1 if my number is lower, 1 if my number is higher, otherwise return 0
int guess(int num); */
public class Solution extends GuessGame {
public int guessNumber(int n)
{
if (n == 0)
{
return -1;
}
int left = 1;
int right =n;
//排除上述特殊情况后,依据题目可以确定目标值一定在在左右边界之中
while (left < right)
{
int mid = left + (right - left) / 2;
if (guess(mid) ==1) //依据题目排除中位数(此判断中位数小于目标值,而题目要找的是大于或等于目标值的第一个元素) //它说我的数字比较大,也即是取的中位数比较小,小于目标值
{
// nums[mid] 的值可以舍弃
left = mid + 1;
}
else //中位数大于或等于目标值
{
// nums[mid] 不能舍弃
right = mid;
}
}
//循环结束只剩下最后一个值
return right;
}
}
算法复杂度:
时间复杂度:O(logn)
空间复杂度:O(1)
3、三分法查找
选择2个划分点,每次划分为3份,边界值为两个
/* The guess API is defined in the parent class GuessGame.
@param num, your guess
@return -1 if my number is lower, 1 if my number is higher, otherwise return 0
int guess(int num); */
public class Solution extends GuessGame
{
public int guessNumber(int n)
{
int low = 1;//确定边界
int high = n;
while (low <= high)
{
int mid1 = low + (high - low) / 3;
int mid2 = high - (high - low) / 3;
int res1 = guess(mid1);
int res2 = guess(mid2);
if (res1 == 0)
return mid1;
if (res2 == 0)
return mid2;
else if (res1 < 0)//中间值比目标大
high = mid1 - 1;
else if (res2 > 0)//中间值比目标小
low = mid2 + 1;
else //res1>0左边区域中间值比目标小 res2<0右边区域中间值比目标大
{
low = mid1 + 1;
high = mid2 - 1;
}
}
return -1;
}
}
算法复杂度分析:
时间复杂度:O(log3 N)
空间复杂度:O(1)