」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 用 Java 建立旋轉排序數組搜尋:了解樞軸搜尋和二分搜尋

用 Java 建立旋轉排序數組搜尋:了解樞軸搜尋和二分搜尋

發佈於2024-11-07
瀏覽:224

Building a Rotated Sorted Array Search in Java: Understanding Pivot and Binary Search

什麼是旋轉排序數組?

考慮一個排序數組,例如:

[1, 2, 3, 4, 5, 6]

現在,如果這個陣列在某個樞軸處旋轉,例如在索引 3 處,它將變成:

[4, 5, 6, 1, 2, 3]

請注意,陣列仍然是排序的,但它被分成兩部分。我們的目標是有效地在此類數組中搜尋目標值。


搜尋策略

要在旋轉排序數組中搜索,我們需要:

  1. 找出樞軸:樞軸是陣列從較大值過渡到較小值的點。
  2. 二分查找:一旦找到主元,我們就可以在陣列的相應一半上使用二分查找。

分步代碼解釋

class Solution {
    public static void main(String[] args) {
        int[] arr = {4, 5, 6, 1, 2, 3}; // Example of rotated sorted array
        int target = 5;

        // Searching for the target
        int result = search(arr, target);

        // Displaying the result
        System.out.println("Index of target: "   result);
    }

    // Main search function to find the target in a rotated sorted array
    public static int search(int[] nums, int target) {
        // Step 1: Find the pivot
        int pivot = searchPivot(nums);

        // Step 2: If no pivot, perform regular binary search
        if (pivot == -1) {
            return binarySearch(nums, target, 0, nums.length - 1);
        }

        // Step 3: If the target is at the pivot, return the pivot index
        if (nums[pivot] == target) {
            return pivot;
        }

        // Step 4: Decide which half of the array to search
        if (target >= nums[0]) {
            return binarySearch(nums, target, 0, pivot - 1); // Search left side
        } else {
            return binarySearch(nums, target, pivot   1, nums.length - 1); // Search right side
        }
    }

    // Binary search helper function
    static int binarySearch(int[] arr, int target, int start, int end) {
        while (start  arr[mid   1]) {
                return mid;
            }

            // Check if the pivot is before the mid
            if (mid > start && arr[mid] 





守則解釋

  1. 搜尋():

    • 此函數負責在旋轉排序數組中搜尋目標。
    • 首先,我們使用 searchPivot() 函數來找出 pivot
    • 根據主元的位置,我們決定使用二分搜尋來搜尋陣列的哪一半。
  2. binarySearch():

    • 標準二分搜尋演算法,用於在排序的子數組中尋找目標。
    • 我們定義開始和結束索引並逐漸縮小搜尋空間。
  3. searchPivot():

    • 此函數標示樞軸點(陣列旋轉的地方)。
    • 主元是排序順序被「破壞」的索引(即陣列從較高的值變為較低的值)。
    • 如果沒有找到樞軸,表示陣列沒有旋轉,我們可以進行常規的二分查找。

演算法如何運作

對於像 [4, 5, 6, 1, 2, 3] 這樣的陣列:

  • 樞軸位於索引 2(6 是最大的,其後是 1,最小的)。
  • 我們使用這個主元將陣列分成兩部分:[4, 5, 6] 和 [1, 2, 3]。
  • 如果目標大於或等於第一個元素(本例為 4),我們將搜尋左半部。否則,我們搜尋右半部分。

此方法確保我們有效率地搜索,實現 O(log n) 的時間複雜度,類似於標準二分搜尋。


結論

旋轉排序數組是常見的面試問題,也是加深您對二分搜尋理解的有用挑戰。透過找到樞軸並相應地調整我們的二分搜索,我們可以在對數時間中有效地搜索數組。

如果您發現本文有幫助,請隨時在 LinkedIn 上與我聯繫或在評論中分享您的想法!快樂編碼!

版本聲明 本文轉載於:https://dev.to/mostafa_/building-a-rotated-sorted-array-search-in-java-understanding-pivot-and-binary-search-3k5f?1如有侵犯,請洽study_golang @163.com刪除
最新教學 更多>
  • 在 Next.js 中使用 React 伺服器元件和伺服器操作
    在 Next.js 中使用 React 伺服器元件和伺服器操作
    簡介:使用 React 伺服器元件增強 Next.js Next.js 已發展到包含 React Server Components 和 Server Actions 等強大功能,它們提供了一種處理伺服器端渲染和邏輯的新方法。這些功能提供了一種更有效率、更簡化的方法來建立 Web ...
    程式設計 發佈於2024-11-07
  • 為什麼我在 Java 中收到「無法對非靜態欄位進行靜態引用」錯誤?
    為什麼我在 Java 中收到「無法對非靜態欄位進行靜態引用」錯誤?
    避免「無法對非靜態欄位進行靜態引用」錯誤在Java程式設計中,「無法對非靜態欄位進行靜態引用」錯誤嘗試在靜態方法中存取非靜態欄位(也稱為實例變數)時,會發生「引用非靜態欄位」錯誤。 在提供的程式碼中,出現錯誤的原因是 main 方法被宣告為靜態,意味著它只能引用類別的靜態成員,包括靜態方法和欄位。然...
    程式設計 發佈於2024-11-07
  • ## 為什麼 Visual Studio 會反白顯示 __int128 但無法編譯它?
    ## 為什麼 Visual Studio 會反白顯示 __int128 但無法編譯它?
    Visual Studio 中的__int128 相容性問題排查雖然Visual Studio 的語法突出顯示表明__int128 資料類型可用,但編譯錯誤表明當前體系結構不支持它。當嘗試在 Visual Studio 中的 C 專案中使用此 128 位元整數類型時,會出現此問題。 Ursache...
    程式設計 發佈於2024-11-07
  • 在 TypeScript 的類別元件的建構函式中是否總是需要定義 `props` 和 `state` ?
    在 TypeScript 的類別元件的建構函式中是否總是需要定義 `props` 和 `state` ?
    當使用 TypeScript 在 React 中處理類別元件時,經常被問到是否有必要且強制在建構函式中定義 props 和 state 的問題。這個問題的答案取決於組件的特定需求。在這篇文章中,我們將了解何時以及為何使用建構子來定義 props 和狀態,以及不同方法的優缺點。 使用...
    程式設計 發佈於2024-11-07
  • 為什麼多年的經驗讓我選擇全端而不是平均棧
    為什麼多年的經驗讓我選擇全端而不是平均棧
    在全栈和平均栈开发方面工作了 6 年多,我可以告诉你,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我对两者的经验能给您一些有用的见解。 在这篇文章中,我将带...
    程式設計 發佈於2024-11-07
  • 如何處理 Python Base64 解碼中不正確的填滿錯誤?
    如何處理 Python Base64 解碼中不正確的填滿錯誤?
    在Python Base64解碼中處理不正確的填充在Python中使用64.decodestring()解碼basebase64編碼的資料時,你可能會遇到“填充不正確”錯誤。要繞過這個問題,您可以考慮幾種方法。 1。添加填充根據接受的答案中的建議,您可以在解碼之前簡單地添加最大可能的填充字符。在 P...
    程式設計 發佈於2024-11-07
  • PHP 可以像 JavaScript 一樣將函數當作參數傳遞嗎?
    PHP 可以像 JavaScript 一樣將函數當作參數傳遞嗎?
    在 PHP 中將函數作為參數傳遞將函數作為資料元素進行操作是現代程式設計中常用的通用技術。一個這樣的例子是將函數作為參數傳遞,這是 5.3 之前的 PHP 版本中不容易使用的功能。現在,我們深入研究此功能,探索何時以及如何使用它。 問題: 函數可以在 PHP 中作為參數傳遞嗎,類似 JavaScri...
    程式設計 發佈於2024-11-07
  • 反思 GSoC 4
    反思 GSoC 4
    Achievements, Lessons, and Tips for Future Success An exciting summer has come to a close for stdlib with our first participation in Google Summer of...
    程式設計 發佈於2024-11-07
  • 在 Go 中如何將位元組數組轉換為有符號整數和浮點數?
    在 Go 中如何將位元組數組轉換為有符號整數和浮點數?
    Go 中將位元組數組轉換為有符號整數和浮點數在Go 中,二進位包提供了從[]byte轉換無符號整數的函數數組,例如binary.LittleEndian.Uint16()和binary.BigEndian.Uint32()。然而,有符號整數或浮點數沒有直接等價物。 缺少有符號整數轉換函數的原因缺少有...
    程式設計 發佈於2024-11-07
  • 如何修復 Java + MySQL UTF-8 編碼問題:為什麼我的特殊字元顯示為問號?
    如何修復 Java + MySQL UTF-8 編碼問題:為什麼我的特殊字元顯示為問號?
    Java MySQL UTF-8 編碼問題Java MySQL UTF-8 編碼問題您提到了使用Java 和MySQL 時經常遇到的問題,其中儲存了特殊字元作為問號(“?”)。當 MySQL 資料庫、表格和欄位設定為使用 UTF-8 字元編碼,但 JDBC 連線未正確配置時,就會發生此問題。 在您的...
    程式設計 發佈於2024-11-07
  • 令牌桶演算法:流量管理必備指南
    令牌桶演算法:流量管理必備指南
    令牌桶演算法是控製網路流量、確保公平頻寬使用和防止網路擁塞的流行機制。它的運作原理很簡單,即根據令牌可用性來調節資料傳輸,其中令牌代表發送一定量資料的權利。該演算法對於維護各種系統(包括網路、API 和雲端服務)中的流量至關重要,提供了一種在不造成資源過載的情況下管理流量的方法。 令牌桶演算法如...
    程式設計 發佈於2024-11-07
  • 如何為您的 Python 專案選擇最佳的 XML 函式庫?
    如何為您的 Python 專案選擇最佳的 XML 函式庫?
    Python 中的XML 創建:庫和方法綜合指南在Python 中建立XML 文件時,開發人員可以選擇各種庫選項處理。最受歡迎和最直接的選擇是 ElementTree API,它是 Python 標準庫自 2.5 版以來不可或缺的一部分。 ElementTree:高效率選項ElementTree 提...
    程式設計 發佈於2024-11-07
  • 如何使用多個欄位對 Java 中的物件清單進行排序?
    如何使用多個欄位對 Java 中的物件清單進行排序?
    Java 中具有多個字段的列表對象的自定義排序雖然基於一個字段對列表中的對象進行排序很簡單,但使用多個字段進行排序可能有點棘手。本文深入研究按多個欄位排序的問題,並探討 Java 中可用的各種解決方案。 問題考慮一個場景,其中您有一個包含三個欄位的「Report」物件清單:ReportKey、學號和...
    程式設計 發佈於2024-11-07
  • 如何使用遞歸從具有父類別的資料庫產生巢狀選單樹?
    如何使用遞歸從具有父類別的資料庫產生巢狀選單樹?
    選單樹產生的遞歸在您的情況下,您有一個資料庫結構,其中類別有一個「根」欄位指示其父類別。您想要的 HTML 輸出涉及表示類別層次結構的巢狀清單。為此,可以使用遞歸 PHP 函數。 這是一個範例函數:function recurse($categories, $parent = null, $leve...
    程式設計 發佈於2024-11-07
  • Array_column 函數可以用於物件陣列嗎?
    Array_column 函數可以用於物件陣列嗎?
    將 array_column 與物件陣列一起使用將 array_column 與物件陣列一起使用本題探討了將 array_column 函數與由物件組成的陣列一起使用的可行性。開發人員實作了 ArrayAccess 接口,但發現它沒有任何影響。 PHP 5$titles = array_map(fu...
    程式設計 發佈於2024-11-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3