leetcode-旋转数组的最小数字-54

Posted 天津 唐秙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode-旋转数组的最小数字-54相关的知识,希望对你有一定的参考价值。

题目要求
  把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
思路
  思路一,我们直接将数组进行顺序排序,返回数组中下标为0的数据,就是该数组的最小值。这种方法并没有使用题目中递增排序的数组这个条件,显然不是最优的方法,也不是面试官想要的方法。
  思路二,采用二分法查找数据,因为是递增的数组,所以只需要拿中间的数据和最右边的数据比较就能大致确定最小值的位置,但是存在一种特殊情况,就是数组中间的值和最右边的值是一样的,这时候我们是不能判断最小值是在中间值的左边还是右边,因此需要我们把最右边的边界减减,一定要确保中间值和最右边的值是不同的才能判断,这一部分对应if中最后的那个else处理的情况。

代码实现
思路一

class Solution {
public:
    int minArray(vector<int>& numbers) {
        if (numbers.size() == 0)
			return {};
		sort(numbers.begin(), numbers.end());
		return numbers[0];
    }
};

思路二

class Solution {
public:
    int minArray(vector<int>& numbers) {
        int left = 0, right = numbers.size() - 1, mid;
		while (left < right)
		{
			mid = (left + right) / 2;
			if (numbers[mid] < numbers[right])
				right = mid;
			else if (numbers[mid] > numbers[right])
				left = mid + 1;
			else
				right--;
		}
		return numbers[left];
    }
};

以上是关于leetcode-旋转数组的最小数字-54的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode(剑指 Offer)- 11. 旋转数组的最小数字

LeetCode(剑指 Offer)- 11. 旋转数组的最小数字

LeetCode 剑指 Offer 11. 旋转数组的最小数字 | Python

LeetCode面试题11. 旋转数组的最小数字

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

Leetcode刷题Python剑指 Offer 11. 旋转数组的最小数字