類似博文(99%)
LeetCode 69. Sqrt(x)--(數組)--二分法查找 --簡單
題目描述:
給定一個正整數 num,編寫一個函數,如果 num 是一個完全平方數,則返回 True,否則返回 False。
說明:不要使用任何內置的庫函數,如 sqrt。
示例 1:
輸入:16
輸出:True
示例 2:
輸入:14
輸出:False
參考鏈接:https://leetcode-cn.com/problems/valid-perfect-square
解題思路:
1、二分法查找
//java
class Solution {
public boolean isPerfectSquare(int num)
{
long left = 0;
long right =num;
//排除上述特殊情況後,依據題目可以確定目標值一定在在左右邊界之中
while (left < right)
{
long mid = left + (right - left) / 2;
if (mid*mid <num) //依據題目排除中位數(此判斷中位數小於目標值,而題目要找的是大於或等於目標值的第一個元素) //
{
// nums[mid] 的值可以捨棄
left = mid + 1;
}
else //中位數大於或等於目標值
{
// nums[mid] 不能捨棄
right = mid;
}
}
//循環結束只剩下最後一個值
if(right*right==num)
return true;
else
return false;
}
}
算法複雜度:
時間複雜度:O(logn)
空間複雜度:O(1)
2、牛頓迭代求解方程的根
//Java 牛頓迭代法
class Solution {
public boolean isPerfectSquare(int num)
{
if (num < 2) return true;
long x = num / 2;
while (x * x > num) //找到第一個小於num的值
{
x = (x + num / x) / 2;//迭代公式
}
return (x * x == num);
}
}
算法複雜度分析:
時間複雜度:O(logN)
空間複雜度:O(1)