日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

367. Valid Perfect Square

發布時間:2023/11/27 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

遇到的問題:

1. num = 5的輸入是總是time exceed,原因是mid值不改變,一直在特定值循環。解決方法:引入prevMid

2. 第10,11行的判斷,出現的錯誤是808201,為什么mid值會一直變大呢?原因是如果用mid * mid == num判斷的話,左邊很有可能溢出。所以改為,商是mid,同時余數為0的判斷。注意溢出值!!!

3. 其他解法:用質數的方法來判斷,每當遇到能整除的值可以除去,看最后是否=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 }

看別人算法之后精簡,很值得思考的是,為什么low = mid + 1, high = mid -1?

個人猜測,當要改變low/high的時候,mid已經是不正確的值,如果mid + 1/mid - 1是正確的值的話,我們只會在另一個方向做更正,而一旦觸及新的剛改變的low/high時,新的mid必定會返回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     }

?

轉載于:https://www.cnblogs.com/panini/p/6541544.html

總結

以上是生活随笔為你收集整理的367. Valid Perfect Square的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。