本篇文章為大家帶來了關於java的相關知識,二分法是一個非常有效率的演算法,它常常用於電腦的查找過程。以下將透過範例為大家詳細講二分法的基本想法和實現,希望對大家有幫助。
推薦學習:《java影片教學》
在有序數組中,找某個數是否存在
想法:
- 由於是有序數組,可以先得到中點位置,中點可以把數組分成左右半邊。
- 如果中點位置的值等於目標值,直接傳回中點位置。
- 如果中點位置的值小於目標值,則去數組中點左側以相同的方式尋找。
- 如果中點位置的值大於目標值,則取數組中點右側以相同的方式尋找。
- 如果最後沒有找到,則回傳:-1。
程式碼
class Solution { public int search(int[] arr, int t) { if (arr == null || arr.length < 1) { return -1; } int l = 0; int r = arr.length - 1; while (l <= r) { int m = l + ((r - l) >> 1); if (arr[m] == t) { return m; } else if (arr[m] > t) { r = m - 1; } else { l = m + 1; } } return -1; } }
時間複雜度 O(logN)
。
在一個有序數組中,找大於等於某個數最左邊的位置
#範例1:
##輸入: nums = [1,3,5,6], target = 5輸出: 2說明:如果要在num這個陣列中插入5 這個元素,應該是插入在元素3 和元素5 之間的位置,即2 號位置。
##說明:如果要在
num這個陣列中插入2 這個元素,應該是插入在元素1 和元素3 之間的位置,也就是1 號位置。 範例3:
輸入: nums = [1,3,5,6], target = 7
輸出: 4
說明:如果要在
num這個陣列中插入7 這個元素,應該是插入在陣列結尾,也就是4 號位置。 透過上述範例可以知道,這題本質上就是求
我們只需要在上例基礎上進行簡單改動即可,上例中,我們找到滿足條件的位置就直接
return#了<pre class='brush:php;toolbar:false;'>if (arr[m] == t) {
return m;
}</pre>
在這個問題中,因為要找到最左邊的位置,所以,在
同時,在遇到
arr[m] > t條件下,也需要記錄下此時的m
位置,因為這也可能是滿足條件的位置。 程式碼:
class Solution { public static int searchInsert(int[] arr, int t) { int ans = arr.length; int l = 0; int r = arr.length - 1; while (l <= r) { int m = l + ((r - l)>>1); if (arr[m] >= t) { ans = m; r = m - 1; } else { l = m + 1; } } return ans; } }
整個演算法的時間複雜度是
O(logN)。 在排序數組中找出元素的第一個和最後一個位置
#思路
本題也是用二分來解,當透過二分找到某個元素的時候,不急著返回,而是繼續往左(右)找,看能否找到更左(右)位置匹配的值。
程式碼如下:
class Solution { public static int[] searchRange(int[] arr, int t) { if (arr == null || arr.length < 1) { return new int[]{-1, -1}; } return new int[]{left(arr,t),right(arr,t)}; } public static int left(int[] arr, int t) { if (arr == null || arr.length < 1) { return -1; } int ans = -1; int l = 0; int r = arr.length - 1; while (l <= r) { int m = l + ((r - l) >> 1); if (arr[m] == t) { ans = m; r = m - 1; } else if (arr[m] < t) { l = m +1; } else { // arr[m] > t r = m - 1; } } return ans; } public static int right(int[] arr, int t) { if (arr == null || arr.length < 1) { return -1; } int ans = -1; int l = 0; int r = arr.length - 1; while (l <= r) { int m = l + ((r - l) >> 1); if (arr[m] == t) { ans = m; l = m + 1; } else if (arr[m] < t) { l = m +1; } else { // arr[m] > t r = m - 1; } } return ans; } }
時間複雜度
O(logN)。 局部最大問題
想法
假設陣列長度為
N,先判斷0
號位置的數和N-1
位置的數是不是峰值位置。
號位置只需要和1
號位置比較,如果0
號位置大,0
號位置就是峰值位置,可以直接返回。
號位置只需要和N-2
號位置比較,如果N-1
號碼位置大, N-1
號位置就是峰值位置,可以直接回傳。 如果
號位置和N-1
在上輪比較中都是最小值,那麼陣列的樣子必然是如下情況:
由上圖可知,
區間內是成長趨勢, [N-2...N-1]
區間內是下降趨勢。 那麼峰值位置必在
之間出現。 此時可以透過
來找峰值位置,先來到中點位置,假設為mid,如果中點位置的值比左右兩邊的值都大:<pre class='brush:php;toolbar:false;'>arr[mid] > arr[mid+1] && arr[mid] > arr[mid-1]</pre>
則
位置即峰值位置,直接回傳。 否則,有以下兩種情況:
情況一:mid 位置的值比 mid - 1 位置的值小
趋势如下图:
则在[1...(mid-1)]
区间内继续二分。
情况二:mid 位置的值比 mid + 1 位置的值小
趋势是:
则在[(mid+1)...(N-2)]
区间内继续上述二分。
完整代码
public class LeetCode_0162_FindPeakElement { public static int findPeakElement(int[] nums) { if (nums.length == 1) { return 0; } int l = 0; int r = nums.length - 1; if (nums[l] > nums[l + 1]) { return l; } if (nums[r] > nums[r - 1]) { return r; } l = l + 1; r = r - 1; while (l <= r) { int mid = l + ((r - l) >> 1); if (nums[mid] > nums[mid + 1] && nums[mid] > nums[mid - 1]) { return mid; } if (nums[mid] < nums[mid + 1]) { l = mid + 1; } else if (nums[mid] < nums[mid - 1]) { r = mid - 1; } } return -1; } }
时间复杂度O(logN)
。
推荐学习:《java视频教程》
以上是簡單了解Java中二分法的基本想法與實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JVM通過字節碼解釋、平台無關的API和動態類加載實現Java的WORA特性:1.字節碼被解釋為機器碼,確保跨平台運行;2.標準API抽像操作系統差異;3.類在運行時動態加載,保證一致性。

Java的最新版本通過JVM優化、標準庫改進和第三方庫支持有效解決平台特定問題。 1)JVM優化,如Java11的ZGC提升了垃圾回收性能。 2)標準庫改進,如Java9的模塊系統減少平台相關問題。 3)第三方庫提供平台優化版本,如OpenCV。

JVM的字節碼驗證過程包括四個關鍵步驟:1)檢查類文件格式是否符合規範,2)驗證字節碼指令的有效性和正確性,3)進行數據流分析確保類型安全,4)平衡驗證的徹底性與性能。通過這些步驟,JVM確保只有安全、正確的字節碼被執行,從而保護程序的完整性和安全性。

Java'splatFormIndepentEncealLowsApplicationStorunonAnyOperatingsystemwithajvm.1)singleCodeBase:writeandeandcompileonceforallplatforms.2)easileupdates:updatebybytecodeforsimultanane deployment.3)testOnOneOnePlatForforurouniverSalpeforuluniverSalpehavior formafforulululyiversalivernave.444.44.444

Java的平台獨立性通過JVM、JIT編譯、標準化、泛型、lambda表達式和ProjectPanama等技術不斷增強。自1990年代以來,Java從基本的JVM演進到高性能的現代JVM,確保了代碼在不同平台的一致性和高效性。

Java如何緩解平台特定的問題? Java通過JVM和標準庫來實現平台無關性。 1)使用字節碼和JVM抽像操作系統差異;2)標準庫提供跨平台API,如Paths類處理文件路徑,Charset類處理字符編碼;3)實際項目中使用配置文件和多平台測試來優化和調試。

java'splatformentenceenhancesenhancesmicroservicesharchitecture byferingDeploymentFlexible,一致性,可伸縮性和便攜性。 1)DeploymentFlexibilityAllowsibilityAllowsOllowsOllowSorlowsOllowsOllowsOllowSeStorunonAnyPlatformwithajvM.2)penterencyCrossServAccAcrossServAcrossServiCessImplifififiesDeevelopmentandeDe

GraalVM通過三種方式增強了Java的平台獨立性:1.跨語言互操作,允許Java與其他語言無縫互操作;2.獨立的運行時環境,通過GraalVMNativeImage將Java程序編譯成本地可執行文件;3.性能優化,Graal編譯器生成高效的機器碼,提升Java程序的性能和一致性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版
中文版,非常好用

Dreamweaver Mac版
視覺化網頁開發工具