剑指Offer - 旋转数组中的最小数字 (C/C++, Java, Python 2.x 分别实现)

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。


思路:

    方法1:3个条件:数组空,返回0;    数组本身有序,返回第一个元素; 否则最小的元素位于数组中,遍历找最小值

    方法2:二分查找变体,采用左闭右开的写法,维持左端最小值 


C/C++    运行时间:25ms    占用内存:612k

方法1:

class Solution
{
public:
    int minNumberInRotateArray(vector<int> rotateArray)
    {
        int key = rotateArray.size(), ans = 0;
        if(key==0)    return 0;    //若数组为空 直接返回0
        else
        {
            if(rotateArray[0]<rotateArray[key-1])//若数组原本就由大到小排序,则返回第一个元素
                return rotateArray[0];
            else    //否则,最小的元素的值在数组内部
            {
                for(int i=1; i<key; ++i)
                {
                    if(rotateArray[i]<rotateArray[i-1])
                    {
                        ans = rotateArray[i];
                        break;
                    }
                }
                return ans;
            }
        }
    }
};

方法2:    运行时间:28ms    占用内存:608k

class Solution
{
public:
    int minNumberInRotateArray(vector<int> rotateArray)
    {
        int key = rotateArray.size();
        if(key==0)    return 0;    //若数组为空 直接返回0
        else
        {
            if(rotateArray[0]<rotateArray[key-1])//若数组原本就由大到小排序,则返回第一个元素
                return rotateArray[0];
            else    //二分
            {
                int left = 0, right = key-1, mid;
                while(left<right)
                {
                    mid = (left+right)/2;
                    if(rotateArray[mid]>rotateArray[right])
                        left = mid+1;
                    else
                        right = mid;
                }
                return rotateArray[left];
            }
        }
    }
};

Java    运行时间:254ms    占用内存:27816k

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) 
    {
        int length = array.length, ans = 0;
        if(length == 0)
	    {
		   return 0;
	    }
	    else
        {
            if(array[0]<array[length-1])
                return array[0];
            else
            {
                for(int i=1; i<length; ++i)
                {
                    if(array[i]<array[i-1])
                    {
                        ans = array[i];
                        break;
                    }
                }
                return ans;
            }
        }
    }
}

Python 2.x    运行时间:999ms    占用内存:5724k

方法1:

# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        length, ans = len(rotateArray), 0
        if length==0:
            return 0
        else:
            if rotateArray[0]<rotateArray[length-1]:
                return rotateArray[0]
            else:
                for i in range(1,length):
                    if rotateArray[i]<rotateArray[i-1]:
                        return rotateArray[i]

方法2:二分查找变体,采用左闭右开的写法,维持l是最小值    运行时间:1314ms    占用内存:5728k

class Solution:
    def minNumberInRotateArray(self, rotateArray):
        if not rotateArray:
            return 0
        l, h = 0, len(rotateArray) - 1
        while l < h:
            m = (l + h) // 2
            if rotateArray[m] > rotateArray[h]:
                l = m + 1
            else:
                h = m
        return rotateArray[l]


猜你喜欢

转载自blog.csdn.net/m0_38024592/article/details/80474427