LeetCode: Valid Perfect Square
Question
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.
Solution
這裡可以利用 binary search (二分搜索法) 的技巧來解題。 其概念是取輸入值(num)的ㄧ半為動態的比對值(mid),然後左半部為 1,右半部的最大值為輸入值(num)。 如果 mid 的平方剛好等於輸入值的平方就回傳 true,代表 num 是完全平方數。
但如果 mid 的平方值大於 num,則代表 mid 的值可以降低一點(right = mid - 1)。 同樣地,如果 mid 的平方值小於 num,則代表 mid 的值可以提高一點(left = mid + 1)。當最後 while 迴圈跑完,沒有比對成功就代表此輸入值(num)不是完全平方數。
def is_perfect_square(num)
left = 1
right = num
while left <= right
mid = (left+right)/2
temp = mid * mid
if temp == num
return true
elsif temp > num
right = mid - 1
else
left = mid + 1
end
end
return false
end
Explanation #1
以 Example 1 來說
Input: nums = 16
第一圈
left = 1
right = 16
while 1 <= 16
mid = 8
temp = 84
if 64 == 18
# won't enter here
elsif (64) > 18
right = (8-1)
else (64) < 9
# won't enter here
end
end
第二圈
while 3 <= 5
mid = (1+8)/2
temp = 4 * 4
if 16 == 16
return true
elsif
# won't enter here
else
# won't enter here
end
end
Comments