[LeetCode] Find Minimum in Rotated Sorted Array

题目

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 5 6 7 0 1 2).

Find the minimum element. You may assume no duplicate exists in the array.

找到最小元素,可以假定数组中不存在重复。

分析

其实这就是一个循环有序数组,循环有序数组就是将一个有序数组切成两段,并交换位置。

一个循环有序数组的最小元素就是其分界点,且一个循环有序数组从中间位置一分两半,可得到一个循环数组和一个有序数组。这样一来,主要的思路就是通过左边界元素和中间元素的大小关系判断循环部分在哪半边。

  • 当左边界元素 > 中间元素,左边元素有序,循环部分在左半边。
  • 当左边界元素 < 中间元素,左边元素有序,循环部分在右半边。

在判断该部分为循环部分时,发现其也为有序部分,该部分的起始值就是最小元素。

代码

#include <iostream>
#include <vector>

using namespace std ;

class Solution {
public:
    int findMin(vector<int>& nums) {
        int start = 0, end = nums.size() - 1;

        while (start < end) {
            if (nums[start] < nums[end])
                return nums[start];

            int mid = (start + end) / 2;

            if (nums[mid] < nums[start]) {
                end = mid;
            } else {
                start = mid + 1;
            }
        }

        return nums[start];
    }
};

int main() {
    Solution solution;
    int num[] = {7, 8, 1, 2, 3, 4, 5, 6};
    int length = sizeof(num) / sizeof(int);
    vector<int> nums(num, num + length);
    int min = solution.findMin(nums);
    cout << min << " is the smallest in array." << endl;
    return 0;
}

参考资料

CSDN 博客:http://blog.csdn.net/linhuanmars/article/details/40449295

LeetCode 讨论:https://discuss.leetcode.com/topic/4100/compact-and-clean-c-solution

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值