P66、面试题8:旋转数组的最小数字

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

用二分查找的方式来查找数组的最小值,这个值是存在于最大值到最小值的转折中,一个指针指向第一个升序子数组的第一个元素,第二个指针指向第二个升序子数组的最后一个元素,确定数组中间的元素,如果是比第一个指针的元素大,则表示中间指针存在第一个升序子序列中,将第一个指针指向中间指针指向的元素,如果中间元素比第二个指针指向的元素小,则表明中间元素存在第二个子序列中,则将第二个指针指向中间元素。

测试用例:

1)功能测试(输入的数组是升序排序数组的一个旋转,数组中有重复数字或者没有重复数字)。

2)边界值测试(输入的数组是一个升序排序的数组,只包含一个数字的数组)。

3)特殊输入测试(输入null指针)。

实现代码:

package com.yyq;

import java.util.Arrays;

/**
 * Created by Administrator on 2015/9/10.
 */
public class FindMin {
    public static int findMin(int[] array){
        int len = 0;
        int i = 0;
        int j = 0;
        int mid = 0;
        try {
            if (array == null || array.equals(" ")) {
                throw new Exception("Invalid Parameters");
            }
            len = array.length;
            j = len - 1;
            while(array[i] >= array[j]){
                if (j - i == 1 || j == i){
                    mid = j;
                    break;
                }
                mid = ( i + j ) / 2;
                if (array[i] == array[j] && array[mid] == array[i])
                    return minInOrder(array,i,j);
                if (array[mid] >= array[i])
                    i = mid;
                else if (array[mid] <= array[j])
                    j = mid;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return array[mid];
    }
    public static int minInOrder(int[] array,int i, int j){
        int result = 0;
        for (int m = i + 1; m <= j; m++){
            if (result > array[m]){
                result = array[m];
            }
        }
        return result;
    }

    // ====================测试代码====================
    public static void Test(int[] numbers, int expected)
    {
        int result = 0;
        System.out.println("The resource sequence is:");
        System.out.println(Arrays.toString(numbers));
        if(numbers == null || numbers.equals(" ")) return;
        result = findMin(numbers);
        if(result == expected)
            System.out.println("The minimum is " + result + ", Passed!");
        else
            System.out.println("Fail!");
    }

    public static void main(String[] args){
        // 典型输入,单调升序的数组的一个旋转
        int array1[] = {3, 4, 5, 6, 0, 1, 2};
        Test(array1, 0);

        // 有重复数字,并且重复的数字刚好的最小的数字
        int array2[] = {3, 4, 5, 1, 1, 2};
        Test(array2, 1);

        // 有重复数字,但重复的数字不是第一个数字和最后一个数字
        int array3[] = {3, 4, 5, 1, 2, 2};
        Test(array3, 1);

        // 有重复的数字,并且重复的数字刚好是第一个数字和最后一个数字
        int array4[] = {1, 0, 1, 1, 1};
        Test(array4, 0);

        // 单调升序数组,旋转0个元素,也就是单调升序数组本身
        int array5[] = {1, 2, 3, 4, 5};
        Test(array5, 1);

        // 数组中只有一个数字
        int array6[] = {2};
        Test(array6, 2);

        // 输入NULL
        Test(null, 0);
    }
}

输出结果:

The resource sequence is:

[3, 4, 5, 6, 0, 1, 2]

The minimum is 0, Passed!

The resource sequence is:

[3, 4, 5, 1, 1, 2]

The minimum is 1, Passed!

The resource sequence is:

[3, 4, 5, 1, 2, 2]

The minimum is 1, Passed!

The resource sequence is:

[1, 0, 1, 1, 1]

The minimum is 0, Passed!

The resource sequence is:

[1, 2, 3, 4, 5]

The minimum is 1, Passed!

The resource sequence is:

[2]

The minimum is 2, Passed!

The resource sequence is:

null

时间: 2024-11-08 20:26:33

P66、面试题8:旋转数组的最小数字的相关文章

【剑指offer】面试题 11. 旋转数组的最小数字

面试题 11. 旋转数组的最小数字 题目描述 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转, 输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. 解答 复杂度:O(logN) + O(1) public class Solution { public int minNumberInRotateArray(int

剑指offer面试题8——旋转数组的最小数字

题目1386:旋转数组的最小数字 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6708 解决:1505 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<= n<=1000000):代表旋转数组的元素个数. 输入的第二行包括n

面试题:旋转数组的最小数字

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增的排序的数组的一个旋转,输出旋转数组的最小元素.例如输入{1,2,3,4,5}的一个旋转为{3,4,5,1,2},该数组的最小值为1. 分析:首先想到的肯定是遍历一遍找出最小的元素,但是这样的时间复杂度为o(n),且没有利用到旋转数组的特性.观察可得,旋转数组可以分为两个有序的子数组.而且前一个数组的元素均大于后一个数组.这个发现对于我们解题将起到一个至关重要的作用.而更神奇的是最小的元素刚好是这两个子数组的分界

剑指offer-面试题8.旋转数组的最小数字

题目:把一个数组最开始的若干个元素搬到数据的末尾,我们称之为 数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组 的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该 数组的最小值为1. 这道题可以使用类似于二分查找的思想,算法思路如下: 1.假设有一个旋转数组A,我们设两个索引p1,p2 2.p1指向为数组第一个元素,p2指向为数组最后一个元素 3.取p3为数组中的中间元素 4.比较p3指向的元素与p1,p2.若p3>p1,则说明前半个    子数组为递增数

【剑指Offer学习】【面试题8 : 旋转数组的最小数字】

题目: 把一个数组最开始的若干个元素搬到数组的末尾, 我们称之数组的旋转.输入一个递增排序的数组的一个旋转, 输出旋转数组的最小元素.例如数组{3,4, 5, 1, 2 }为{ l1,2,3, 4,5}的一个旋转,该数组的最小值为1 实现代码如下: public class Test08 { /** * 把一个数组最开始的若干个元素搬到数组的末尾, 我们称之数组的旋转. * 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素. * 例如数组{3, 4, 5, 1, 2}为{l ,2, 3,

面试题08_旋转数组的最小数字——剑指offer系列

题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素. 例如:数组{3, 4, 5, 1 , 2} 是 数组{1,2,3,4,5}的一个旋转,该数组最小的数是1. 我们要做的就是找到这个旋转后数组的最小数. 解题思路: 思路1:直接遍历数组,找到最小的数,简单粗暴,时间复杂度O(n),空间复杂度O(1). 一般情况下,能够做到思路一的时空复杂度就很好了,但是这个题目,还可以有更好的思路,将时间复杂度降低. 思路2:

面试题8:旋转数组的最小数字

//把一个数组最开始的若干个元素搬到数组的末尾.eg:{3,4,5,1,2}是{1,2,3,4,5}的旋转数组 #include "stdafx.h" #include <iostream> using namespace std; int MinInOrder(int data[],int index1,int index2); int Min(int data[],int length) { if(data==NULL||length<=0) throw new

11&amp;12. 旋转数组的最小数字

面试题11. 旋转数组的最小数字(无重复元素) 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1. 示例 1: 输入:[3,4,5,1,2] 输出:1 示例 2: 输入:[2,2,2,0,1] 输出:0 class Solution { public int findMin(int[] nums) { int l = 0, h

【剑指Offer面试题】 九度OJ1386:旋转数组的最小数字

题目链接地址: http://ac.jobdu.com/problem.php?pid=1386 题目1386:旋转数组的最小数字 时间限制:1 秒内存限制:32 兆特殊判题:否提交:6914解决:1534 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为

剑指offer 面试题8:旋转数组的最小数字 题解

面试题8:旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个已从小到大排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.(要求不能直接遍历数组来求解.) 提交网址: http://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=11159 或 http: