1. 程式人生 > >Leetcode 367. 有效的完全平方數 C++

Leetcode 367. 有效的完全平方數 C++

題目:

給定一個正整數 num,編寫一個函式,如果 num 是一個完全平方數,則返回 True,否則返回 False。

說明:不要使用任何內建的庫函式,如  sqrt

示例 1:

輸入:16
輸出:True

示例 2:

輸入:14
輸出:False

思路:

本題採用二分法,在1~num這個區間上採用二分法。知道了這一點問題就很容易了,基本可以秒做。 

注意:

1、在leetcode上做題的時候,可以看到本題的分類為二分法,這是一個巨大的提示。如果事先不知道這一點,我們能否看到就想到二分法呢? 我們什麼時候該想到二分法呢?

二分法的一個很大的作用是查詢,如果題目是查詢問題,應該本能的想到二分法,如果序列再是有序的,那麼幾乎就是用二分法了。或者是有序的一些變化,都應該考慮二分法。

2、本題我秒做之後提交沒有通過,原因是我一開始將使用的資料定義為了int型,當輸入一個很大的數的時候,mid*mid超出了int

可以表示的範圍。所以將int換為long之後就可以了。這個問題我遇到了很多次,但是就是忍不住要錯。

事實上,這類問題是很多的,有些時候即便是採用了long型資料也還是無法表示,甚至long long 型都不行。關鍵要看題目中的運算,如果題目中出現mid*mid這樣的運算,那麼資料的數量級必然會有很大的提升,此處僅僅是一個二次方,如果是其他更高次的運算問題更大。遇到問題之後,要仔細分析。根據資料的量級變化,選擇合適的資料型別。甚至換用其他方法。

解答:

 bool isPerfectSquare(int num) {
        long left=1,right=num;
        while(left<=right)
        {
            long mid=(left+right)/2;
            if(mid*mid==num) return true;
            else if(mid*mid>num) right=mid-1;
            else left=mid+1;
        }
        return false;
    }