美文网首页
特殊数组的二分查找

特殊数组的二分查找

作者: packet | 来源:发表于2019-03-13 21:44 被阅读0次

一个没有重复值的有序数组,把后半段,放在前半段。比如[4, 5, 6, 1, 2, 3],请返回某个值的下标。
我的第一反应是寻找出这个数组的断点(最大值),这样做再做两次二分搜索就可以了。
这样这个问题就化归为 寻找最大值 + 二分搜索了。
如果不用这种算法呢?能不能直接查找了。

首先这个这种数组要分三种情况。

  1. arr[m] = key, 直接返回m
  2. arr[m] >= arr[p], 然后再比较arr[m] , arr[p], arr[q]
  3. arr[m] < arr[q],然后再比较arr[m] , arr[p], arr[q]
public int find2(int[] arr, final int key) {
        if (arr == null || arr.length == 0) {
            return -1;
        }
        int p = 0;
        int q = arr.length - 1;
        while (p <= q) {
            int m = p + (q - p) / 2;
            if (arr[m] == key) {
                return m;
            }
            if (arr[m] >= arr[p]) {
                if (key < arr[m] && key >= arr[p]) {
                    q = m - 1;
                } else {
                    p = m + 1;
                }
            } else {
                if (key > arr[m] && key <= arr[q]) {
                    p = m + 1;
                } else {
                    q = m - 1;
                }
            }
        }

        return -1;
    }

刚拿到这道题目的时候,自然会想到二分搜索,想利用以前的经验去解决。但是如果思维囿于以前的经验,则不可能解决问题。因为新的问题需要新的手段,需要在以前的思路上更进一步。这道题目用到了两次分类讨论,所以一共有四种情况。
很遗憾,自己当时没有做出这道题,因为没有厘清这几种情况。
另外测试的话,一定要重点测试特殊情况,长度是1和2的数组。(这是折半的最小单元)
如果一般情况没有问题,特殊情况没有问题,这段代码大概率没问题。

相关文章

  • 特殊数组的二分查找

    一个没有重复值的有序数组,把后半段,放在前半段。比如[4, 5, 6, 1, 2, 3],请返回某个值的下标。我的...

  • 二分法查找

    二分法查找的前提是数组必须排序!!!二分法查找的前提是数组必须排序!!!二分法查找的前提是数组必须排序!!!二分法...

  • 二分查找及其变种

    一、 二分查找 如无特殊说明,本文中所有用到的待查数组均为从小到大顺序。 1.1 无重复元素的二分查找 实现C++...

  • 查找

    顺序查找 二分查找 插值查找 查找子数组最大和

  • 二分查找及其扩展

    在有序数组中,二分查找是效率较高的查找算法。二分查找一般有递归和迭代 对有序数组查找指定数字在数组中出现的次数//...

  • day13

    查找算法 顺序查找 二分查找 差值查找 斐波那契查找 二分查找 前提数组必须是有序的。 升级 Interpolat...

  • 循环数组的二分查找--Java实现

    与普通二分查找的不同: 以上的查找对象为循环数组,而普通二分查找的对象为有序的普通数组; 正因为是循环数组,取中进...

  • Java数据结构和算法(有序数组和二分查找)

    一、概述 有序数组中常常用到二分查找,能提高查找的速度。今天,我们用顺序查找和二分查找实现数组的增删改查。 二、有...

  • 4-1 LC:二分查找

    有序数组的二分查找

  • 二分搜索算法 Go

    说明 二分查找的数组必须是有序的,二分查找的优点是查找操作仅需要O(lgN)时间。 逻辑 首先传入的数组必须是有序...

网友评论

      本文标题:特殊数组的二分查找

      本文链接:https://www.haomeiwen.com/subject/gujxmqtx.html