題目描述:
我們正在玩一個猜數字遊戲。 遊戲規則如下:
我從 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)