LeetCode 367. 有效的完全平方數 --數組--二分查找--簡單

類似博文(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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章