69. x 的平方根(簡單)

69. x 的平方根

  • 1. 題目描述
  • 2.詳細題解
  • 3.代碼實現
    • 3.1 Python
      • 方法一:逐個遍歷
      • 方法二:二分查找
    • 3.2 Java

1. 題目描述

題目中轉:69. x 的平方根

在這里插入圖片描述

2.詳細題解

? ? 不能使用系統內置的函數,尋找某個數(假定為x)的算術平方根,并返回算術平方根的整數部分,最直觀的方法是從0依次開始嘗試所有小于等于x的數(假定為y),當y*y的積小于等于x時,繼續遍歷下一個數,直至y*y的積首次大于x時,此時y-1即為x的算術平方根的整數部分,如Python方法一逐個遍歷實現。
??上述方法遍歷的過程中,每次僅能排除判斷一個數字是否滿足,有沒有辦法一次性判斷或者排除多個數字呢?這就是二分查找算法,簡單的說,即待查數據需有序,每次判斷時折中取中間值進行對比,以判斷目標值可能存在的那一半,從而快速定位目標值,每次判斷可以排除一半的空間大小。具體算法如下:

  • Step1:前置條件:個已排序的數組 arr 和待查找的元素 target。;
  • Step2:初始化:兩個指針 left 和 right,分別指向數組的起始和結束位置;
  • Step3:計算中間元素的索引: mid = (left + right) / 2;
  • Step4:比較中間元素 arr[mid] 與 target;
  • ?? 如果 arr[mid] == target,則找到目標值,返回 mid,程序結束;
  • ?? 如果 arr[mid] < target,則目標值可能在 mid 的右側,更新 left = mid + 1;
  • ?? 如果 arr[mid] > target,則目標值可能在 mid 的左側,更新 right = mid - 1;
  • Step5:當 left <= right 時,循環執行Step3_Step4.

??對于此題,是計算算術平方根的整數部分,因此等價于尋找首次平方之和大于x的數,該數減1即為x的算術平方根(假定x的算術平方根為y.z,其中y為整數部分,z為小數部分,y*y的結果是小于x,而(y+1)*(y+1)是大于x的)。因此,針對此題,二分查找算法在返回值方面有一點點不同,應當返回最后的右指針指向的值,為什么呢?因為right為最后一次mid值大于x時減1的值,其它的mid值均小于x,故最后一次大于x的mid值減1即為目標整數,即right。實現詳見Python方法二和Java實現。

3.代碼實現

3.1 Python

方法一:逐個遍歷

class Solution:def mySqrt(self, x: int) -> int:left = 0while left * left <= x:left += 1return left-1

在這里插入圖片描述

方法二:二分查找

class Solution:def mySqrt(self, x: int) -> int:left, right = 0, x//2while left <= right:mid = (left + right) // 2mul = mid * midif mul == x:return midelif mul < x:left = mid + 1else:right = mid - 1return right

在這里插入圖片描述
??此時未通過x=1的測試用例,此時預期結果為1但返回0,仔細觀察代碼,right初始值為2整數x,對于1,結果為0,因此初始化出現了問題,優化如下:

class Solution:def mySqrt(self, x: int) -> int:left, right = 0, x//2+1while left <= right:mid = (left + right) // 2mul = mid * midif mul == x:return midelif mul < x:left = mid + 1else:right = mid - 1return right

在這里插入圖片描述

3.2 Java

class Solution {public int mySqrt(int x) {int left = 0, right = x / 2 + 1;while (left <= right){int mid = (left + right) / 2;int mul = mid * mid;if (mul == x){return mid;}else if (mul < x){left = mid +1;}else{right = mid - 1;}}return right;}
}

在這里插入圖片描述
??對于測試案例x=2147395599運行錯誤,直接返回了right初始值的結果,說明一直觸發的是中間值平方小于x,這明顯是錯誤的,考慮到Java是嚴格聲明和定義數據類型的,因此錯誤在于內存溢出,超出Java的int類型的取值范圍,故中間值使用long整型,優化如下:

class Solution {public int mySqrt(int x) {int left = 0, right = (int)(x / 2 + 1);while (left <= right){int mid = (int) (left + right) / 2;long mul = (long)mid * mid;if (mul == x){return mid;}else if (mul < x){left = mid + 1;}else{right = mid - 1;}}return right;}
}

在這里插入圖片描述

??執行用時不必過于糾結,對比可以發現,對于python和java完全相同的編寫,java的時間一般是優于python的;至于編寫的代碼的執行用時擊敗多少對手,執行用時和網絡環境、當前提交代碼人數等均有關系,可以嘗試完全相同的代碼多次執行用時也不是完全相同,只要確保自己代碼的算法時間復雜度滿足相應要求即可,也可以通過點擊分布圖查看其它coder的code。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38966.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38966.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38966.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡請求的高效處理:C++ libmicrohttpd庫詳解

一、libmicrohttpd簡介 libmicrohttpd是一個小型的C語言庫&#xff0c;用于創建HTTP服務器和客戶端。它提供了HTTP 1.1協議的完整實現&#xff0c;包括持久連接、管道化請求、虛擬主機等特性。libmicrohttpd的特點是&#xff1a; 輕量級&#xff1a;易于集成到C或C項目中。跨…

微信好友不小心拉黑了?這樣操作,友誼的小船不會翻

在數字化時代&#xff0c;微信已成為我們社交生活的核心&#xff0c;它不僅連接著親朋好友&#xff0c;更承載著我們的情感與回憶。 然而&#xff0c;情緒波動時&#xff0c;我們可能會一時沖動&#xff0c;將某些好友誤送入黑名單。但別擔心&#xff0c;今天&#xff0c;就讓…

IMU在手語識別中的應用

近期&#xff0c;一款由美國和中國科研團隊聯合研發的新型的穿戴設備——SignRing&#xff0c;以其獨特的IMU&#xff08;慣性測量單元&#xff09;技術&#xff0c;為聾啞人士的手語識別帶來了革命性的突破。SignRing不僅極大地擴展了手語識別的詞匯量&#xff0c;更提高了識別…

二維數組-----螺旋性矩陣輸出

題目有點難&#xff0c;ok其實是很難。。。 觀察樣例輸出&#xff0c;不難發現&#xff0c;螺旋數組中元素的遞增軌跡為&#xff1a;右右右、下下下、左左左、上上上 簡明為&#xff1a;右、下、左、上。可以設開始遞增的元素1的位置為&#xff08;x&#xff0c;y)&#xff0c…

由跨域引發一些思考

由跨域引發一些思考 前言什么是跨域&#xff1f;為什么會產生跨域&#xff1f;跨域場景示例&#xff1a;跨域常見的解決方法&#xff1a;JSONP&#xff08;JSON with Padding&#xff09;CORS&#xff08;Cross-Origin Resource Sharing&#xff09;document.domain iframeloc…

AutoHotKey自動熱鍵(二)中文版幫助手冊下載和自定義一般鍵盤快捷鍵

所有的操作其實在開發者手冊中已經交待完了,所以我們要使用中文的手冊來進行使用 autohotkey1.1.15中文手冊下載 好了,為什么有了中文手冊,這里還要進行一些具體的介紹呢,就是為了讓大家少踩坑,能夠快速形成生產力 這里先講一下自定義快捷鍵WIN鍵和ALT鍵和CTRL鍵和SHIFT鍵的組…

智慧的網絡爬蟲之CSS概述

智慧的網絡爬蟲之CSS概述 ? CSS 是“Cascading Style Sheet”的縮寫&#xff0c;中文意思為“層疊樣式表”&#xff0c;用于描述網頁的表現形式。如網頁元素的位置、大小、顏色等。css的主要作用是定義網頁的樣式。 CSS樣式 1. 行內樣式 行內樣式&#xff1a;直接定義在 HT…

深入理解Git:fetch與pull的區別與運用

在Git的版本控制世界中&#xff0c;fetch和pull是兩個至關重要的命令&#xff0c;它們都與從遠程倉庫獲取數據有關。然而&#xff0c;這兩個命令在功能和用法上卻存在著顯著的差異。本文將詳細解析fetch和pull的區別&#xff0c;以及它們在實際開發中的應用&#xff0c;幫助讀者…

Qt 5.14.2+Android環境搭建

1. 安裝QT5.14.2的過程中&#xff0c;選中套件&#xff08;kit&#xff09; qt for android。 如果已經安裝了qt creator但沒有安裝該套件&#xff0c;可以找到在qt安裝目錄下的MaintenanceTool.exe&#xff0c;運行該程序添加套件。 2. 安裝jdk8&#xff0c;android sdk&…

五分鐘了解MQ消息集成

一、MQ消息集成的定義 MQ消息集成是通過消息中間件&#xff08;Message Queue&#xff09;實現的一種數據集成方式。它通過將數據發送到中間件中&#xff0c;再從中間件中接收數據&#xff0c;實現不同系統之間的數據交換。在MQ消息集成中&#xff0c;發送者和接收者之間不需要…

vue3.2及以上 父調子的方法defineExpose定義供父調用的方法及屬性

1、定義子類LoginForm&#xff1a; function handleLogin(account, token) {console.log(account,token)}defineExpose({handleLogin,}); 2、父類調用子類組件 const loginFormRef ref(); <LoginForm ref"loginFormRef" />loginFormRef.value.handleLogin(…

代碼隨想錄第38天|動態規劃

1049. 最后一塊石頭的重量 II 參考 備注: 當物體容量也等同于價值時, 01背包問題的含義則是利用好最大的背包容量sum/2, 使得結果盡可能的接近或者小于 sum/2 等價: 盡可能的平分成相同的兩堆, 其差則為結果, 比如 (abc)-d, (ac)-(bd) , 最終的結果是一堆減去另外一堆的和, 問…

Deep-LIBRA:一種用于可靠量化乳腺密度的人工智能方法,并在乳腺癌風險評估中進行了獨立驗證| 文獻速遞-深度學習自動化疾病檢查

Title 題目 Deep-LIBRA: An artificial-intelligence method for robust quantification of breast density with independent validation in breast cancer risk assessment Deep-LIBRA&#xff1a;一種用于可靠量化乳腺密度的人工智能方法&#xff0c;并在乳腺癌風險評估中…

【LeetCode】每日一題:相交鏈表

給你兩個單鏈表的頭節點 headA 和 headB &#xff0c;請你找出并返回兩個單鏈表相交的起始節點。如果兩個鏈表不存在相交節點&#xff0c;返回 null 。 圖示兩個鏈表在節點 c1 開始相交&#xff1a; 題目數據 保證 整個鏈式結構中不存在環。 注意&#xff0c;函數返回結果后&am…

7/1 uart

uart4.c #include "uart4.h"//UART4_RX > PB2 //UART4_TX > PG11char rebuf[51] {0}; //rcc/gpio/uart4初始化 void hal_uart4_init() {/********RCC章節初始化*******///1.使能GPIOB組控制器 MP_AHB4ENSETR[1] 1RCC->MP_AHB4ENSETR | (0x1 << 1)…

【C++11:右值引用,列表初始化】

統一列表初始化&#xff1a; 構造函數的函數名與函數體之間增加一個列表&#xff0c;用于對成員初始化 在實例化對象時&#xff0c;支持單/多參數的隱式轉化&#xff0c;同時也可以省略符號&#xff0c;讓代碼更簡潔 右值的引用 左值&#xff1a; 左值與右值的重要區別就是能…

全國產化飛騰模塊BIOS下修復系統啟動文件

1、背景介紹 全國產飛騰模塊采用麒麟信安操作系統&#xff0c;當系統下面的grub.cfg文件被用戶誤操作導致無法啟動時&#xff0c;可以在BIOS下通過U盤中備份的grub.cfg替換硬盤上原來的grub.cfg文件&#xff0c;從而實現啟動。 2、操作步驟 首先進入BIOS命令行模式&#xff…

Meta低頭,庫克認錯,XR回歸第一性原理

圖片&#xff5c;Photo by Maxim Hopman on Unsplash ©自象限原創 作者丨羅輯 2024年&#xff0c;XR的故事應該怎么講&#xff1f; 如果從數據上看&#xff0c;這應該是個沉重的話題。 根據 IDC 報告&#xff0c;2023 年全球 VR 市場出貨量下滑了 10.7%。2024 年第一…

【必看】賣慘營銷

經常賣慘的人到底是什么心理&#xff1f; Berry Ni同學說&#xff1a; 吸引別人的注意力。想要得到關注。 讓你降低對他的期待。 讓你能夠在他做好一件小事的情況下就表揚他。 控制你對他的想法認知。 ? 浪矢心理同學說&#xff1a; 1&#xff0c;求關注。他覺得買慘有好處&…

【Excel、RStudio計算T檢測的具體操作步驟】

目錄 一、基礎知識1.1 顯著性檢驗1.2 等方差T檢驗、異方差T檢驗1.3 單尾p、雙尾p1.3.1 檢驗目的不同1.3.2 用法不同1.3.3 如何選擇 二、Excel2.1 統計分析工具2.1.1 添加統計分析工具2.1.2 數據分析 2.2 公式 -> 插入函數 -> T.TEST 三、RStudio 一、基礎知識 參考: 1.…