旋转数组中的最小数字,剑指offer,P70 二分查找来实现O(logn)的查找

public class MinNumberInRotatedArray {

    public int getMinNumInRotatedArray(int[] array) {
        if(array == null) {
            return -1;
        }
        int leftIndex = 0;
        int rightIndex = array.length - 1;
        if(array[leftIndex] == array[rightIndex]) {
            return array[0];
        }
        int midIndex = leftIndex;
        while(array[leftIndex] >= array[rightIndex]) {
        //    while(true) { 换成这个其实一样
            if(rightIndex - leftIndex <= 1) {//循环退出的条件
                midIndex = rightIndex;
                break;
            }
            midIndex = (leftIndex+rightIndex)/2;
            if(array[leftIndex] == array[rightIndex] && array[leftIndex] == array[midIndex]) {//如果两边的值和中间的值相等,
                //则无法判断中间值在左边还是在右边,因此只能进行顺序查找
                minNumBySort(array, leftIndex, rightIndex);
            }
            if(array[leftIndex] <= array[midIndex]) {
                leftIndex = midIndex;
            }else if(array[rightIndex] >= array[midIndex]){
                rightIndex = midIndex;
            }
        }
        return array[midIndex];
    }

    public int minNumBySort(int[] arr, int leftIndex, int rightIndex) {
        int result = arr[leftIndex];
        for(int i = leftIndex; i < rightIndex; i++) {
            if(arr[i] < result) {
                result = arr[i];
            }
        }
        return result;
    }

    public static void main(String[] args) {
        MinNumberInRotatedArray testArray = new MinNumberInRotatedArray();
        int[] array = {4,5,6,1,2,3};
        System.out.println(testArray.getMinNumInRotatedArray(array));
    }
}
时间: 2024-11-08 12:39:25

旋转数组中的最小数字,剑指offer,P70 二分查找来实现O(logn)的查找的相关文章

数组中重复的数字 --剑指offer

题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. 思路:因为数字范围都是在 0-n-1 范围内的 所以直接在数字对应的位置上加上数组的长度 比如 第一个位置是2  然后在位置2加上数组的长度表示已经访问过一次 然后如果值大于2倍的长度 说明已经访问了两次 public c

剑指Offer面试题:6.旋转数组中的最小数字

一 题目:旋转数组中的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 这道题最直观的解法并不难,从头到尾遍历数组一次,我们就能找出最小的元素.这种思路的时间复杂度显然是O(n).但是这个思路没有利用输入的旋转数组的特性,肯定达不到面试官的要求. 我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组

【LeetCode-面试算法经典-Java实现】【153-Find Minimum in Rotated Sorted Array(找旋转数组中的最小数字)】

[153-Find Minimum in Rotated Sorted Array(找旋转数组中的最小数字)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 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 m

【LeetCode-面试算法经典-Java实现】【155-Find Minimum in Rotated Sorted Array II(找旋转数组中的最小数字II)】

[154-Find Minimum in Rotated Sorted Array II(找旋转数组中的最小数字II)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? Would this affect the run-time complexity? How and why? Supp

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

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

旋转数组中的最小数字

题目描述:把一个数组最开始的若干个元素移动到数组的末尾,称之为一个数组的旋转.输入一个递增排序的数组的旋转,输出旋转数组的最小元素. 例如:数组 {3,4,5,1,2} 为{1,2,3,4,5} 的一个旋转,该数组的最小元素为 1. 分析: int Min(int* numbers, int length) {     if(numbers == NULL || length <= 0)         throw new std::exception("Invalid parameter

【剑指offer】六,旋转数组中的最小数字

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 分析:数组旋转后会变为一个局部有序的数组,分为两部分,都是递增的.查找最小元素,我们首先想到的时冒泡排序一遍,或者一趟选择排序.或者直接找出a[i]<a[i-1]的点即为要查找的点.也可利用折半查找,判断最小值所在的一侧. 1 import java.util.ArrayLis

旋转数组的最小数字-剑指Offer

旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. 思路 使用二分查找,因为该旋转数组是两段排序好的数组,可根据中间值判断中间值属于哪个排列数组,逐渐缩小范围. 注意考虑特殊情况,数组可能出现多个元素相等 代码 public class Sol

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

题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { if (rotateArray.size() == 0

旋转数组的最小数字——剑指offer

题目:把一个数组最开始的若干各元素搬到数组的末尾,称之为旋转数组,输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}是数组{1,2,3,4,5}的一个旋转,该数组的最小值为1: 1 #include<stdio.h> 2 int MinInOrder(int r[], int p1, int p2) 3 { 4 int result = r[p1]; 5 for (int i = p1 + 1; i <= p2; i++) 6 { 7 if (r[i