Leetcode 367. 有效的完全平方數 C++
阿新 • • 發佈:2018-12-16
題目:
給定一個正整數 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; }