leetcode x 的平方根

2021-10-01 12:33:00 字數 1570 閱讀 7030

實現int sqrt(int x)函式。

計算並返回 x 的平方根,其中 x 是非負整數。

由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。

示例 1:

輸入: 4

輸出: 2

示例 2:

輸入: 8

輸出: 2

說明: 8 的平方根是 2.82842…,

由於返回型別是整數,小數部分將被捨去。

這道題大體有幾類解決方式

這道題我們即使不用專業的演算法,只使用簡單的二分查詢演算法就能解決。x的平方根q滿足:0<= q <=x。從而將問題轉化為在這x+1個數中,選擇乙個滿足條件的數,而且這些數已經排好了序。這些特點說明二分查詢適合解決該問題。

下面是解法的實現:

int mysqrt(int x)  else if (squre < x)  else 

}return right;

}

從演算法整體框架上,跟之前二分查詢完全相同。但仍有一些細微不同,這個解法與其相比有兩點不一樣:

條件不同

前乙個例子比較mid處的值跟待查詢的值是否相等,而這個問題是比較mid的平方是否等於待求根的值。然後根據比較的結果要麼返回,要麼將解空間縮小一半。

後處理邏輯不同

前乙個例子while迴圈完全執行後,元素肯定沒有找到,直接返回不存在;但該例子解是一定存在的,但在while迴圈後,仍然有可能沒有找到解,需要對left > right做進一步的處理,這時候right值就是最終的解。

除此之外,演算法的核心完全相同。

最後需要注意一點:int型別的值相乘的結果使用int儲存會導致溢位,所以要使用64位的整型,這點很容易忽略。

mysort :: integer -> integer

mysort x = loop 0 x

where loop left right | left == right = right

| left > right = right

| mid ^ 2 == x = mid

| mid ^ 2 > x = loop left (mid-1)

| mid ^ 2 < x = loop (mid+1) right

where mid = left + (right-left) `div` 2

haskell的**索性使用了integer型別,結果肯定不會溢位了。

LeetCode x的平方根

在網上學習了其他人的方法以後,寫了出來,學到了新的方法,在此記錄一下 1,返回整型的時候,可以使用二分法 2 返回double時,可以使用牛頓迭代法,a 求取乙個整數的平方根時,其平方根一定是不大於 n 2 1 所以在 0,n 2 1 這個範圍內求取,如下 int mysqrt int x if m...

LeetCode x的平方根

實現int sqrt int x 函式。計算並返回 x 的平方根,其中 x 是非負整數。由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。示例 1 輸入 4輸出 2示例 2 輸入 8輸出 2說明 8 的平方根是 2.82842.由於返回型別是整數,小數部分將被捨去。解題方法 明白開平方根基...

leetcode x的平方根 Python

實現 int sqrt int x 函式。計算並返回 x 的平方根,其中 x 是非負整數。由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。示例 1 輸入 4 輸出 2 示例 2 輸入 8 輸出 2 說明 8 的平方根是 2.82842.使用二分查詢法,對中間數進行判斷,如果mid 2 x...