• LeetCode153 寻找旋转排序数组中的最小值


    假设按照升序排序的数组在预先未知的某个点上进行了旋转。

    ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

    请找出其中最小的元素。

    你可以假设数组中不存在重复元素。

    示例 1:

    输入: [3,4,5,1,2]
    输出: 1

    示例 2:

    输入: [4,5,6,7,0,1,2]
    输出: 0




    /*
    算法思想:
        二分查找模板 II 的变式应用。
        首先要判断这个有序数组是否旋转了,通过比较第一个和最后一个数的大小,如果第一个数小,则没有旋转,直接返回这个数。如果第一个数大,就要进一步搜索。我们定义left和right两个指针分别指向开头和结尾,还要找到中间那个数,然后和left指的数比较,如果中间的数大,则继续二分查找右半段数组,反之查找左半段。终止条件是当左右两个指针相邻,返回小的那个。
    */
    //算法实现:
    
    class Solution {
    public:
        int findMin(vector<int> &num) {
            int left = 0, right = num.size() - 1;
            if (num[left] > num[right]) {   //有旋转
                while (left != (right - 1)) {   //终止条件是当左右两个指针相邻
                    int mid = (left + right) / 2;
                    if (num[left] < num[mid])   //中间的数大,则继续二分查找右半段数组
                        left = mid;
                    else 
                        right = mid;
                }
                return min(num[left], num[right]);  //返回小的那个
            }
            return num[0];
        }
    };
  • 相关阅读:
    【题解】国家集训队礼物(Lucas定理)
    【题解】佳佳的斐波那契数列(矩阵)
    【题解】Zap(莫比乌斯反演)
    HNOI2019爆零记
    Emacs配置
    【题解】Journeys(线段树优化连边)
    一直没有敢发的NOIP2018游记
    【题解】Digit Tree
    【题解】BZOJ3489 A Hard RMQ problem(主席树套主席树)
    【题解】大括号
  • 原文地址:https://www.cnblogs.com/parzulpan/p/10071558.html
Copyright © 2020-2023  润新知