当前位置: 首页 > 面试题库 >

在java中搜索排序和旋转数组中的元素

洪开济
2023-03-14
问题内容

您将获得一个排序和旋转的数组,如下所示:

int arr[]={16,19,21,25,3,5,8,10};

如果您注意到数组已排序和旋转。您需要以 o(log n) 时间复杂度搜索上述数组中的元素。


问题答案:

您可以使用线性搜索在上述数组中搜索元素,但这需要 o(n)。
您可以使用二进制搜索算法的变体来解决上述问题。您可以使用可以将数组划分为两个排序的子数组({16,19,21,25},{3,5,8,10} )的属性,尽管您不需要找到枢轴点(元素开始减少)。

算法:

  • 计算中,即低+高/2。
  • 检查 a[mid…high] 是否已排序
  • 如果数字介于范围之间,则低=中+1。
  • 如果数字不在范围内,high=mid-1。
  • 检查 a[low..mid] 是否已排序。
  • 如果数字位于范围之间,则高 = 中 1..
  • 如果数字不在范围内,则低=中+1。

让我们借助示例来理解这一点。

4f46c21b2f-Array.png

在上述数组中搜索 5 涉及的步骤:

  • 计算中即 3 (0+7/2)
  • amid > ahigh && 5 < alow && 5 < a[high] ( 25 ),所以数字( 5 )在右边,所以low会变成中+1。
  • a[mid] == 5,所以你可以返回它。

用于在已排序和旋转的数组中搜索元素的 Java 程序:
创建一个名为的类

SearchElementSortedAndRotatedArrayMain.java。

package org.arpit.java2blog;
public class SearchElementSortedAndRotatedArrayMain {

    public static void main(String[] args) {
        int arr[]={16,19,21,25,3,5,8,10};
        System.out.println("Index of element 5 : "+findElementRotatedSortedArray(arr,0,arr.length-1,5));
    }
    public  static  int findElementRotatedSortedArray(int[] arr,int low,int high,int number)
    {
        int mid;
        while(low<=high)
        {
            mid=low + ((high - low) / 2);;

            if(arr[mid]==number)
            {
                return mid;
            }
            if(arr[mid]<=arr[high])
            {
                // Right part is sorted
                if(number > arr[mid] && number <=arr[high])
                {
                    low=mid+1;
                }
                else
                {
                    high=mid-1;
                }
            }
            else
            {
                // Left part is sorted
                if(arr[low]<=number && number < arr[mid])
                {
                    high=mid-1;
                }
                else
                {
                    low=mid+1;
                }
            }
        }
        return -1;
    }
}

当你运行上面的程序时,你会得到以下输出:

Index of element 5 : 5


 类似资料:
  • 最初的问题是这样的: 假设排序后的数组在某个事先未知的轴上旋转。 (即0 1 2 4 5 6 7可能4 5 6 7 0 1 2)。 给您一个要搜索的目标值。如果在数组中找到,返回其索引,否则返回-1。 您可以假设数组中不存在重复项。链接在这里https://oj.leetcode.com/problems/search-in-rotated-sorted-array/ 我不知道这里的‘目标值’是什

  • 我真的被困在这件事上了,我很想得到你的帮助 我正在尝试编写一个带有签名的方法: 该方法以循环排序的二维数组和搜索num的值作为参数获取。如果值num在mat数组中,则该方法返回true。如果num值不在mat数组中,则该方法返回false。 如果第1季度的所有值都比第2季度的值小,第2季度的值比第3季度的值小,第3季度的值比第4季度的值小,那么该数组就是圆形的。 例如,以下数组是循环排序的: 如果

  • 本文涉及 4 道「搜索旋转排序数组」题: LeetCode 33 题:搜索旋转排序数组 LeetCode 81 题:搜索旋转排序数组-ii LeetCode 153 题:寻找旋转排序数组中的最小值 LeetCode 154 题:寻找旋转排序数组中的最小值-ii 可以分为 3 类: 33、81 题:搜索特定值 153、154 题:搜索最小值 81、154 题:包含重复元素 33. 搜索旋转排序数组

  • 本文向大家介绍编写Golang程序以搜索排序数组中的元素,包括了编写Golang程序以搜索排序数组中的元素的使用技巧和注意事项,需要的朋友参考一下 解决这个问题的方法 步骤1:将数组从第0个索引迭代到n-1,其中n是给定数组的大小。 步骤2:声明low = 0th索引和high = n-1。启动一个for循环,直到低电平小于高电平为止。 步骤3:找到mid =(low + high)/ 2,如果中

  • 问题内容: 我想知道旋转JavaScript数组的最有效方法是什么。 我想出了这个解决方案,其中一个正数将数组向右旋转,而一个负数向左(): 然后可以使用这种方式: 在下面的评论中指出的那样,我上面的原始版本有一个缺陷,那就是正确的版本(附加返回值允许链接): 是否有可能在JavaScript框架中更紧凑和/或更快速的解决方案?(以下任何一种建议的版本都不会更紧凑或更快速) 有没有内置数组旋转的J

  • 问题内容: 假设我有以下数组: 我怎么在那里我有值序列发生指数:?因此,在这种情况下的预期输出为:。 编辑: 1)请注意,这只是一个序列。可能是或或,仅此而已。 2)如果将我的数组修改为:,则具有相同序列的预期结果将是。 我正在寻找一些NumPy快捷方式。 问题答案: 嗯,这基本上是图像处理中经常出现的问题。这篇文章中列出了两种方法:基于纯NumPy和基于OpenCV(cv2)。 方法1: 使用N