剑指offer06-旋转数组的最小数字*

155 阅读1分钟

旋转数组的最小数字

题目描述

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

思路

  • 二分查找变种

测试用例

  1. 功能测试(输入的数组是升序排序数组的一个旋转,数组中有重复的数字或者没有重复的数字);
    {3,4,5,1,2}、{2,1,2,2,2,2}、{2,2,2,2,1,2}、{2,2,2,1}、{2,2,2,2}
  2. 边界值测试(输入的数组是一个升序的数组,只包含一个数字的数组);
    {1,2,3,4,5}(旋转0个元素)、{1}
  3. 特殊输入测试(输入null指针)。

程序

    /**
     * code1
     * 时间复杂度:O(log n),空间复杂度:O(1)
     */
public class Solution {
    public int minNumberInRotateArray(int [] nums) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        int left = 0;
        int right = nums.length - 1;
        while (left < right) {
            int mid = (left + right) / 2;
            if (nums[mid] > nums[right]) {
                left = mid + 1;
            } else if (nums[mid] < nums[right]) {
                right = mid;
            } else {
                right--;
            }
        }
        return nums[left];
        }
    }
    /**
     * code2
     * 时间复杂度:O(log n),空间复杂度:O(1)
     */
public class Solution {
    public int minNumberInRotateArray(int [] rotateArray) {

        if(rotateArray.length==0)
            return 0;
 
        int low = 0;
        int high = rotateArray.length- 1;
        int mid = 0;
 
        while(low < high){
            // 子数组是非递减的数组,10111
            if (rotateArray[low] < rotateArray[high])
                return rotateArray[low];
            mid = low + (high - low) / 2;
            if(rotateArray[mid] > rotateArray[low])
                low = mid + 1;
            else if(rotateArray[mid] < rotateArray[high])
                high = mid;
            else low++;
        }
        return rotateArray[low];
        }
    }

参考

  1. 旋转数组的最小数字(牛客)
  2. 旋转数组的最小数字(GitHub)