[[EVD]] - 剑指 Offer 11. 旋转数组的最小数字

题目分析:[[EVD]] - 剑指 Offer 11. 旋转数组的最小数字icon-default.png?t=M276https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/

简单描述:

  • 将升序数组旋转后得到新数组作为输入,找出其中的最小数字

限制🚫

  • n == numbers.length
  • 1 <= n <= 5000
  • 5000 <= numbers[i] <= 5000
  • numbers 原来是一个升序排序的数组,并进行了 1 至 n 次旋转

示例:

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

解题思路:

思路:

  • 1. #排序 排序后输出第一个数nums[0]
    • 利用algorithm中的sort进行排序 #[[C++ STL]]
  • 2. #二分查找 找到数值突变的左边界点(升序序列旋转后的分割点),就是最小值
    • 比较基准:数组最后一个数(分割后的右部分最大值)
    • left[all]>right[all],min<right[all-min]

效率:

  • 时间复杂度O(logn )
  • 空间复杂度O(1)

代码:

  • 1.排序
class Solution
{
public:
    /*c++库函数sort进行排序,自己实现可在排序中途找到旋转点时结束递归并返回对应数值*/
    int minArray(vector<int> &numbers)
    {
        sort(numbers.begin(), numbers.end());
        return numbers[0];
    }
};
  • 2.二分查找
class Solution
{
public:
    /*二分法找到数值突变的左边界点,就是最小值*/
    int minArray(vector<int> &numbers)
    {
        int l = 0, r = numbers.size() - 1;
        while (l <= r)
        {
            int m = l + (r - l) / 2;
            if (numbers[m] > numbers[r])
                l = m + 1; //往右边找
            else if (numbers[m] == numbers[r])
                r--;
            else
                r = m; //往左边找
        }
        return numbers[l]; //二分完后 l=r+1,即旋转点
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值