加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

LeetCode 153. Find Minimum in Rotated Sorted Array寻找旋转排

发布时间:2020-12-16 07:19:57 所属栏目:百科 来源:网络整理
导读:题目: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e.,? [0,1,2,4,5,6,7] ?might become ? [4,7,2] ). Find the minimum element. You may assume no duplicate exists in the array. Example 1:

题目:

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e.,?[0,1,2,4,5,6,7]?might become ?[4,7,2]).

Find the minimum element.

You may assume no duplicate exists in the array.

Example 1:

Input: [3,2] 
Output: 1

Example 2:

Input: [4,2]
Output: 0

分析:

给定了一个升序排序的数组且在某个点上进行了旋转。也就是[1,3,5]可能变成[3,2]。求其中的最小元素,且数组中没有重复元素。

遍历一遍数组直接求得最小元素,时间复杂度时O(n),不过很明显,题目中给定的数组是“有序的”,我们可以利用这个特点来更快的求解此问题。

如果给定一个有序数组(无旋转的),我们可以立刻知道数组中最小的元素就是第一个元素,而在这道题中,我们可以使用二分法来求解,而且每一次分割,必定会产生一个有序数组,和一个有可能有序的数组。

比如:[4,2]如果分割成[4,7]和[0,2],两个都是有序数组,我们可以立刻知道他们两个的最小值是4和0,再求一次min即可。当然这是最好的情况,即一次分割两个数组均有序。

当然大多数情况可能是其中一个有序,另一个是旋转有序的。

例如:[4,6]和[7,2],左侧的数组是有序的,右侧是旋转有序的,那么左面我们可以立刻得到最小值4,右侧则继续二分求解即可。

判断数组是否有序很简单,即数组左侧的元素是否小于右侧的,如果小于,则数组有序。

当数组剩两个元素的时候直接返回其中的最小值即可。

程序:

class Solution {
public:
    int findMin(vector<int>& nums) {
        if(nums.size()==1) return nums[0];
        int l = 0;
        int r = nums.size()-1;
        return find(nums,l,r);
    }
    int find(vector<int>& nums,int l,int r){
        if(nums[l] < nums[r] || l==r) return nums[l];
        if(r-l == 1) return min(nums[l],nums[r]);
        int mid = (l+r)/2;
        return min(find(nums,mid-1),find(nums,mid,r));
    }
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读