”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 用 Java 构建旋转排序数组搜索:了解枢轴搜索和二分搜索

用 Java 构建旋转排序数组搜索:了解枢轴搜索和二分搜索

发布于2024-11-07
浏览:490

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如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在 Next.js 中使用 React 服务器组件和服务器操作
    在 Next.js 中使用 React 服务器组件和服务器操作
    简介:使用 React 服务器组件增强 Next.js Next.js 已经发展到包含 React Server Components 和 Server Actions 等强大功能,它们提供了一种处理服务器端渲染和逻辑的新方法。这些功能提供了一种更高效、更简化的方法来构建 Web ...
    编程 发布于2024-11-07
  • 为什么我在 Java 中收到“无法对非静态字段进行静态引用”错误?
    为什么我在 Java 中收到“无法对非静态字段进行静态引用”错误?
    避免“无法对非静态字段进行静态引用”错误在Java编程中,“无法对非静态字段进行静态引用”错误尝试在静态方法中访问非静态字段(也称为实例变量)时,会发生“引用非静态字段”错误。在提供的代码中,出现错误是因为 main 方法被声明为静态,这意味着它只能引用类的静态成员,包括静态方法和字段。然而,字段b...
    编程 发布于2024-11-07
  • ## 为什么 Visual Studio 突出显示 __int128 但无法编译它?
    ## 为什么 Visual Studio 突出显示 __int128 但无法编译它?
    Visual Studio 中的 __int128 兼容性问题排查虽然 Visual Studio 的语法突出显示表明 __int128 数据类型可用,但编译错误表明当前体系结构不支持它。当尝试在 Visual Studio 中的 C 项目中使用此 128 位整数类型时,会出现此问题。 Ursach...
    编程 发布于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中使用base64.decodestring()解码base64编码的数据时,你可能会遇到“填充不正确”错误。要绕过这个问题,您可以考虑几种方法。1。添加填充根据接受的答案中的建议,您可以在解码之前简单地添加最大可能的填充字符。在 Py...
    编程 发布于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 时经常遇到的问题,其中存储了特殊字符作为问号(“?”)。当 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, $level...
    编程 发布于2024-11-07
  • Array_column 函数可以用于对象数组吗?
    Array_column 函数可以用于对象数组吗?
    将 array_column 与对象数组一起使用本题探讨了将 array_column 函数与由对象组成的数组一起使用的可行性。开发人员实现了 ArrayAccess 接口,但发现它没有任何影响。PHP 5在 PHP 7 之前,array_column 本身不支持对象数组。要解决此限制,可以使用替代...
    编程 发布于2024-11-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3