首页 > 367. Valid Perfect Square

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

更多相关:

  • 问题描述: 给定一个排序数组nums(nums中有重复元素)与目标值target,如果 target在nums里出现,则返回target所在区间的左右端点下标,[左端点, 右端点],如果target在nums里未出现,则返回[-1, -1]。 例如: arr = [2,3,4,4,4],target = 4,最终结果为[2,4] a...

  • 问题描述: 给定一个排序数组nums(无重复元素)与目标值target,如果target在nums里 出现,则返回target所在下标,如果target在nums里未出现,则返回target应该 插入位置的数组下标,使得将target插入数组nums后,数组仍有序。 例如: 数组 arr = [2,3,4,6] target = 1...

  • 75. Find Peak Element 【medium】 There is an integer array which has the following features: The numbers in adjacent positions are different.A[0] < A[1] && A[A.length...

  •  有序表查找 /* 主函数 */public class OrderTableSearch {public static void main(String[] args) {int [] a= {0,1,16,24,35,47,59,62,73,88,99}; System.out.println(FibonacciSearc...

  • 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。 注意: num 的长度小于 10002 且 ≥ k。 num 不会包含任何前导零。 示例 1 : 输入: num = “1432219”, k = 3 输出: “1219” 解释: 移除掉三个数字 4, 3, 和 2形成一个新的最小的数...

  • 代码展示:   http://paste.ubuntu.com/23693598/ #include #include #include char * largeDiffer(char *a,char *b){ /*  使用说明 传入的a和b只能为整数 结果为a-b;返回...

  • Description We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long time. But recently, it is reported that he hides in Hang Zhou of Ch...

  • /*Name: NYOJ--811--变态最大值Author: shen_渊 Date: 17/04/17 15:49Description: 看到博客上这道题浏览量最高,原来的代码就看不下去了 o(╯□╰)o */#include #include #include u...

  • 生成唯一号:思路,根据yymmddhhmmss+自增长号+唯一服务器号( SystemNo)生成唯一码,总长度19,例如:1509281204550000101. public class UniqueNumber {     private static long num = 0;//流水号     private sta...

  • 割点:去掉某点x,该无向图分割成两部分(及以上) 割边:去掉某条边x,该无向图分割成两部分(及以上) 时间戳:在搜索树上的遍历序号dfn 追溯值:subtree子树和非搜索树上可达的最小点 割边和割点判定 1 void tarjan(int x, int in_edge) { 2 dfn[x] = low[x] = ++...