zoukankan      html  css  js  c++  java
  • 数据结构练习(31)旋转数组的最小元素

    旋转数组的最小元素(只针对单调增数组)

    思路:

    1. 如果 A[mid] < A[right] 则我们可以看出,右侧的数据是单调增的,所以最小值只能在 [left, mid] 区间内。

    2. 如果 A[mid] > A[right] 则可以观察出来,左侧的数据是是单调增的,所以最小值只能在 [mid, right] 旋转区间内。

    3. 如果 A[mid] == A[right] 则此时就要分情况讨论了,因为可能会同时存在 形如 {5, 3, 5, 5, 5} 和 {5, 6, 5, 5, 5}

       两种情况下,无法确切推导出来最小值在左边还是右边,于是调用递归,分别求出左右侧的最小值输出即可。

    int GetMinHelper(const int A[], int left, int right) {
        while (left + 1 < right) {
            int mid = left + (right - left) / 2;
            if (A[mid] < A[right]) {
                right = mid;
            }
            else if (A[mid] > A[right]) {
                left = mid;
            }
            else {
                int left_min = GetMinHelper(A, left, mid);
                int right_min = GetMinHelper(A, mid, right);
                return min(left_min, right_min);
            }
        }
        return min(A[left], A[right]);
    }
    -------------------------------------------------------

    kedebug

    Department of Computer Science and Engineering,

    Shanghai Jiao Tong University

    E-mail: kedebug0@gmail.com

    GitHub: http://github.com/kedebug

    -------------------------------------------------------

  • 相关阅读:
    模拟测试48
    模拟测试47
    模拟测试46
    NOIP模拟测试29(A)
    NOIP模拟测试19
    NOIP模拟测试18(T3待更新)
    杂题
    noip模拟测试18 T2搜索
    noip模拟测试17 2019-08-11 考后反思
    noip模拟测试14 20190807 考试反思
  • 原文地址:https://www.cnblogs.com/kedebug/p/2822507.html
Copyright © 2011-2022 走看看