LeetCode - Easy - 367. Valid Perfect Square

Topic

  • Binary Search
  • Math

Description

https://leetcode.com/problems/valid-perfect-square/

Given a positive integer num, write a function which returns True if num is a perfect square else False.

Follow up: Do not use any built-in library function such as sqrt.

Example 1:

Input: num = 16
Output: true

Example 2:

Input: num = 14
Output: false

Constraints:

  • 1 <= num <= 2³¹ - 1

Analysis

方法一:将符合要求的数缓存好,再二分查找。

方法二:巧用奇数数列求和公式。

1 = 1 1 = 1 1=1

4 = 1 + 3 4 = 1 + 3 4=1+3

9 = 1 + 3 + 5 9 = 1 + 3 + 5 9=1+3+5

扫描二维码关注公众号,回复: 12654393 查看本文章

16 = 1 + 3 + 5 + 7 16 = 1 + 3 + 5 + 7 16=1+3+5+7

25 = 1 + 3 + 5 + 7 + 9 25 = 1 + 3 + 5 + 7 + 9 25=1+3+5+7+9

36 = 1 + 3 + 5 + 7 + 9 + 11 36 = 1 + 3 + 5 + 7 + 9 + 11 36=1+3+5+7+9+11

. . . . . . ...

1 + 3 + . . . + ( 2 n − 1 ) = ( 2 n − 1 + 1 ) ⋅ n 2 = n 2 1+3+. . .+(2n-1)=\frac{(2n-1 + 1)\cdot n}{2}=n^2 1+3+...+(2n1)=2(2n1+1)n=n2

方法三:二分查找法

方法四:牛顿迭代法

Submission

package com.lun.easy;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ValidPerfectSquare {
    
    

	private static List<Integer> squareList;

	static {
    
    
		squareList = new ArrayList<>();

		int i = 1, product;
		while (true) {
    
    
			if ((product = i * i) < 0)
				break;

			squareList.add(product);
			i++;
		}
	}

	// 方法一:将符合要求的数缓存好,再二分查找
	public boolean isPerfectSquare(int num) {
    
    
		return Collections.binarySearch(squareList, num) >= 0;
	}

	// 方法二:奇数数列求和
	public boolean isPerfectSquare2(int num) {
    
    
		int i = 1;
		while (num > 0) {
    
    
			num -= i;
			i += 2;
		}
		return num == 0;
	}

	// 方法三:二分查找法
	public boolean isPerfectSquare3(int num) {
    
    
		int low = 1, high = num;
		while (low <= high) {
    
    
			long mid = (low + high) >>> 1;
			if (mid * mid == num) {
    
    
				return true;
			} else if (mid * mid < num) {
    
    
				low = (int) mid + 1;
			} else {
    
    
				high = (int) mid - 1;
			}
		}
		return false;
	}

	// 方法四:牛顿迭代法
	public boolean isPerfectSquare4(int num) {
    
    
		long x = num;
		while (x * x > num) {
    
    
			x = (x + num / x) >> 1;
		}
		return x * x == num;
	}

}

Test

import static org.junit.Assert.*;
import org.junit.Test;

public class ValidPerfectSquareTest {
    
    

	@Test
	public void test() {
    
    
		ValidPerfectSquare obj = new ValidPerfectSquare();

		assertTrue(obj.isPerfectSquare(1));
		assertTrue(obj.isPerfectSquare(4));
		assertTrue(obj.isPerfectSquare(9));
		assertTrue(obj.isPerfectSquare(16));
		assertTrue(obj.isPerfectSquare(25));
		assertTrue(obj.isPerfectSquare(36));
		assertTrue(obj.isPerfectSquare(49));
		assertFalse(obj.isPerfectSquare(50));
	}

	@Test
	public void test2() {
    
    
		ValidPerfectSquare obj = new ValidPerfectSquare();

		assertTrue(obj.isPerfectSquare2(1));
		assertTrue(obj.isPerfectSquare2(4));
		assertTrue(obj.isPerfectSquare2(9));
		assertTrue(obj.isPerfectSquare2(16));
		assertTrue(obj.isPerfectSquare2(25));
		assertTrue(obj.isPerfectSquare2(36));
		assertTrue(obj.isPerfectSquare2(49));
		assertFalse(obj.isPerfectSquare2(50));
	}

	@Test
	public void test3() {
    
    
		ValidPerfectSquare obj = new ValidPerfectSquare();

		assertTrue(obj.isPerfectSquare3(1));
		assertTrue(obj.isPerfectSquare3(4));
		assertTrue(obj.isPerfectSquare3(9));
		assertTrue(obj.isPerfectSquare3(16));
		assertTrue(obj.isPerfectSquare3(25));
		assertTrue(obj.isPerfectSquare3(36));
		assertTrue(obj.isPerfectSquare3(49));
		assertFalse(obj.isPerfectSquare3(50));
		assertFalse(obj.isPerfectSquare3(Integer.MAX_VALUE));
	}

	@Test
	public void test4() {
    
    
		ValidPerfectSquare obj = new ValidPerfectSquare();

		assertTrue(obj.isPerfectSquare4(1));
		assertTrue(obj.isPerfectSquare4(4));
		assertTrue(obj.isPerfectSquare4(9));
		assertTrue(obj.isPerfectSquare4(16));
		assertTrue(obj.isPerfectSquare4(25));
		assertTrue(obj.isPerfectSquare4(36));
		assertTrue(obj.isPerfectSquare4(49));
		assertFalse(obj.isPerfectSquare4(50));
	}

}

猜你喜欢

转载自blog.csdn.net/u011863024/article/details/113101625
今日推荐