Leetcode
  • Leetcode Questions
  • Runtime Screenshots
  • DataStructure
    • Leetcode 394. Decode String
    • Leetcode 225. Implement Stack Using Queues
    • Leetcode 336. Palindrome Pairs
    • Leetcode 316. Remove Duplicate Letters
    • Leetcode 206. Reverse Linked List
    • Leetcode 347. Top K Frequent Elements
    • Leetcode 227. Basic Calculator II
    • Leetcode 224. Basic Calculator
  • Linear
    • Leetcode 23. Merge k Sorted Lists
    • Leetcode 48. Rotate Image
    • Leetcode 6. ZigZag Conversion
    • Leetcode 438. Find All Anagrams in a String
    • Leetcode 189. Rotate Array
    • LeetCode 56. Merge Intervals
    • Leetcode 4. Median of Two Sorted Array
    • Leetcode 3. Longest Substring Without Repeating Characters
    • Leetcode 8. String to Integer (atoi)
    • Leetcode 5. Longest Palindromic Substring
    • Leetcode 11. Container With Most Water
  • Tree
    • Leetcode 103. Binary Tree Zigzag Level Order Traversal
    • Leetcode 508. Most Frequent Subtree Sum
    • Leetcode 226. Invert Binary Tree
    • Leetcode 222. Count Complete Tree Nodes
    • Leetcode 250. Count Univalue Subtrees
    • Leetcode 285. Inorder Successor in BST
    • Leetcode 230. Kth Smallest Element in a BST
    • Leetcode 543. Diameter of Binary Tree
    • Leetcode 199. Binary Tree Right Side View
  • Math
    • Leetcode 50. Power(x, n)
    • Leetcode 166. Fraction to Recurring Decimal
    • Leetcode 7. Reverse Integer
    • Leetcode 360. Sort Transformed Array
    • Leetcode 367. Valid Perfect Square
    • Leetcode 12. Integer to Roman
  • DynamicProgramming
    • Leetcode 10. Regular Expression Matching
    • Leetcode 253. Meeting Rooms II
    • Leetcode 303. Range Sum Query
    • Leetcode 22. Generate Parentheses
  • Graph
    • Leetcode 142. Linked List Cycle II
    • Leetcode 261. Graph Valid Tree
    • Leetcode 339. Nested List Weight Sum
    • Leetcode 207. Course Schedule
  • OODesign
    • Leetcode 295. Find Media From Data Stream
Powered by GitBook
On this page
  • 题目
  • 思路
  • 解答
  • Complexity Analysis
  • 拓展
  • 总结
  • Reference

Was this helpful?

  1. Math

Leetcode 367. Valid Perfect Square

PreviousLeetcode 360. Sort Transformed ArrayNextLeetcode 12. Integer to Roman

Last updated 5 years ago

Was this helpful?

题目

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
Output: true

Example 2:

Input: 14
Output: False

思路

这道题目最直观的解法为在[0, num]诶个尝试所有树以找到num的根,但是这个O(n)的解法显然太过缓慢。 为了优化这个思路,我们可以应用二分搜索法,将时间复杂度降到O(log(n))。下面的解答应用的就是这种方法。

不过,我们应用数学上更巧妙的方法解答这道题,详见。

解答

class Solution {
    public boolean isPerfectSquare(int num) {
        int low = 1, high = num;
        while (low <= high) {
            long mid = (low + high) / 2;
            if (mid * mid == num) {
                return true;
            } else if (mid * mid < num) {
                low = (int) mid + 1;
            } else {
                high = (int) mid - 1;
            }
        }
        return false;
    }
}

值得注意的是,我们有使用mid * mid的运算。细心的同学会发现,这里存在integer overflow的可能 性,并且它会导致无限循环。因此,我们使用了long

Complexity Analysis

  • Time Complexity: O(log(n)). 我们用二分法在[0,num]范围内寻找了num相应的根。

  • Space Complexity: O(1). 我们没有使用额外的空间。

拓展

public boolean isPerfectSquare(int num) {
    long x = num;
    while (x * x > num) {
        x = (x + num / x) >> 1;
    }
    return x * x == num;
}

总结

数学题型一般有两类方法,一类为直观易得的编程思想解(比如二分法等),另一类为数学思想解,对我们有较高 的数学要求,熟悉相应的数学方法。前者需要大量计算机科学、算法的基础;后者需要扎实的数学积累。

Reference

天才选手牛顿发现可以使用泰勒级数的前面几项,来对实数、虚数范围内方程求近似解,并用来寻找整数根。 详细数学证明见. 解法如下:

拓展
这里
Newton's Method
fhqplzj's Solutions