367. Valid Perfect Square
題目:
Given a positive integer?num, write a function which returns True if?num?is a perfect square else False.
Note:?Do not?use any built-in library function such as?sqrt.
Example 1:
Input: 16 Returns: True
?
Example 2:
Input: 14 Returns: False
鏈接:
https://leetcode.com/problems/valid-perfect-square/#/description
3/12/2017
遇到的問(wèn)題:
1. num = 5的輸入是總是time exceed,原因是mid值不改變,一直在特定值循環(huán)。解決方法:引入prevMid
2. 第10,11行的判斷,出現(xiàn)的錯(cuò)誤是808201,為什么mid值會(huì)一直變大呢?原因是如果用mid * mid == num判斷的話,左邊很有可能溢出。所以改為,商是mid,同時(shí)余數(shù)為0的判斷。注意溢出值!!!
3. 其他解法:用質(zhì)數(shù)的方法來(lái)判斷,每當(dāng)遇到能整除的值可以除去,看最后是否=1
1 public class Solution { 2 public boolean isPerfectSquare(int num) { 3 if (num <= 2) return true; 4 int low = 1, high = num; 5 int mid = low + (high - low) / 2; 6 int prevMid = 0; 7 8 while (low <= high && mid != prevMid) { 9 prevMid = mid; 10 if (num / mid == mid && num % mid == 0) return true; 11 else if (num / mid < mid) { 12 high = mid; 13 mid = low + (mid - low) / 2; 14 } else { 15 low = mid; 16 mid = mid + (high - mid) / 2; 17 } 18 } 19 return false; 20 } 21 }
看別人算法之后精簡(jiǎn),很值得思考的是,為什么low = mid + 1, high = mid -1?
個(gè)人猜測(cè),當(dāng)要改變low/high的時(shí)候,mid已經(jīng)是不正確的值,如果mid + 1/mid - 1是正確的值的話,我們只會(huì)在另一個(gè)方向做更正,而一旦觸及新的剛改變的low/high時(shí),新的mid必定會(huì)返回true
1 public class Solution { 2 public boolean isPerfectSquare(int num) { 3 if (num <= 2) return true; 4 int low = 1, high = num; 5 int mid; 6 7 while (low <= high) { 8 mid = low + (high - low) / 2; 9 if (num / mid == mid && num % mid == 0) return true; 10 else if (num / mid < mid) { 11 high = mid - 1; 12 } else { 13 low = mid + 1; 14 } 15 } 16 return false; 17 } 18 }
還有牛頓法,需要記住
1 public boolean isPerfectSquare(int num) { 2 long x = num; 3 while (x * x > num) { 4 x = (x + num / x) >> 1; 5 } 6 return x * x == num; 7 }
?
轉(zhuǎn)載于:https://www.cnblogs.com/panini/p/6541544.html
總結(jié)
以上是生活随笔為你收集整理的367. Valid Perfect Square的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 20155204 2016-2017-2
- 下一篇: 【BZOJ-3456】城市规划