367 二分查找深入理解
关注查找的区间问题
This commit is contained in:
parent
c2dc47ed53
commit
01864dd56d
108
src/main/java/cn/whaifree/leetCode/easy/LeetCode367.java
Normal file
108
src/main/java/cn/whaifree/leetCode/easy/LeetCode367.java
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
package cn.whaifree.leetCode.easy;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.text.Format;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
|
||||||
|
* 完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
|
||||||
|
* 不能使用任何内置的库函数,如 sqrt 。
|
||||||
|
*
|
||||||
|
* 示例 1:
|
||||||
|
*
|
||||||
|
* 输入:num = 16
|
||||||
|
* 输出:true
|
||||||
|
* 解释:返回 true ,因为 4 * 4 = 16 且 4 是一个整数。
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 示例 2:
|
||||||
|
*
|
||||||
|
* 输入:num = 14
|
||||||
|
* 输出:false
|
||||||
|
* 解释:返回 false ,因为 3.742 * 3.742 = 14 但 3.742 不是一个整数。
|
||||||
|
*
|
||||||
|
* 提示:
|
||||||
|
* 1 <= num <= 231 - 1
|
||||||
|
*/
|
||||||
|
public class LeetCode367 {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 时间复杂度:O(logn)
|
||||||
|
* 空间复杂度:O(1)
|
||||||
|
* @param num
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isPerfectSquare(int num) {
|
||||||
|
int left = 0;
|
||||||
|
int right = num;
|
||||||
|
while (left <= right) {
|
||||||
|
int middle = (left + right) / 2;
|
||||||
|
if (middle * middle == num) {
|
||||||
|
return true;
|
||||||
|
} else if ((long) middle * middle > num) {
|
||||||
|
right = middle - 1;
|
||||||
|
// rigjt--;
|
||||||
|
} else {
|
||||||
|
// 如果middle * middle < num ,那么 寻找的区间就应该是 xx,middle) 或者说middle*middle 这个数太大了
|
||||||
|
// left++;
|
||||||
|
left = middle + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 代码中使用的 pow\texttt{pow}pow 函数的时空复杂度与 CPU 支持的指令集相关,这里不深入分析。
|
||||||
|
* @param num
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isPerfectSquare1(int num) {
|
||||||
|
double sqrt = Math.sqrt(num);
|
||||||
|
// 判断有没有小数
|
||||||
|
if (sqrt == (int) sqrt) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 时间复杂度:On
|
||||||
|
* 空间复杂 O1
|
||||||
|
* @param num
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isPerfectSquare2(int num) {
|
||||||
|
// 暴力
|
||||||
|
for (int i = 1; i <= num; i++) {
|
||||||
|
if ((long)i * i == num) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void main() {
|
||||||
|
LeetCode367 solution = new LeetCode367();
|
||||||
|
|
||||||
|
// Test case 1: num is a perfect square
|
||||||
|
int num1 = 16;
|
||||||
|
assertTrue(solution.isPerfectSquare1(num1));
|
||||||
|
|
||||||
|
// Test case 2: num is not a perfect square
|
||||||
|
int num2 = 15;
|
||||||
|
assertFalse(solution.isPerfectSquare1(num2));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user