Find Minimum in Rotated Sorted Array

来源:互联网 发布:知往事之不可追 编辑:程序博客网 时间:2024/05/27 19:25

题目:153

Find Minimum in Rotated Sorted Array

Suppose a sorted array 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.

题目分析:

       从数据结构来分析,有序且是数组(顺序存储),查找最小的元素,首先最容易想到的就是折半查找(二分查找),如果没有旋转,则arr[mid]> arr[low],按从小到大排序,经过旋转后,如果arr[mid]> arr[low],最小值在右半区,如果arr[mid]< arr[low],最小值在左半边。有一些特殊的情况需要考虑,如当数组只有一个元素,数组就是按从小到大排序排好。返回在数组中的最小的元素。

这道题也是《剑指offer》面试题8。

(1)   朴素解法:

class Solution {public:    int findMin(vector<int> &num) {        if (num.size() == 1)            return num[0];        int low, mid, high;        low = 0;        high = num.size() - 1;        while (low < high) {            mid = (low + high) / 2;            if (num[low] < num[high])                return num[low];            if (num[mid] > num[low])                low = mid;            else if (num[mid] < num[low])                high = mid;            else                return num[high];        }    }};

(2)   C code

20150527     1)中解法已经很不错,再给出两种解法。

一个是:时间复杂度O(N)的,从后往前遍历数组中的元素,找到第一个该元素比其前一个元素小的就是旋转数组中的最小值,因为数组中的最小值是两个有序数组的分界值。

二个是:实现上有一些区别。

int findMin(int* nums, int numsSize) {    int start, end, mid;start = 0;end = numsSize - 1;if (nums[start] <= nums[end])return nums[start];while (nums[start] > nums[end]) {    if (end - start == 1) {        start = end;        break;    }mid = (start + end) / 2;if (nums[mid] > nums[start])start = mid + 1;else end = mid;}return nums[start];}
看了下剑指offer,对于[ 2, 1] 这样的输入这么处理的。


0 0