题解 | #旋转数组的最小数字#

旋转数组的最小数字

http://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba

描述

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


方法1 暴力求解法

最简单的想法就是撇开旋转数组不谈,直接遍历数组求最小值
时间复杂度 O(n)
空间复杂度 O(1)

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

方法2 前后比较法

由于旋转前的数组是非递减数组,所以旋转后只有一个位置有可能出现递减的情况,找到这个位置即可找到最小元素,若没有递减情况,则取第一个元素。
时间复杂度 O(n)
空间复杂度 O(1)

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

方法3 二分法

有没有什么降低时间复杂度的方法呢?我们考虑二分法的时间复杂度为O(logn),所以我们考虑用二分法解决该问题。当中位元素值小于末位时,最小值一定在前半段;当中位元素大于末位时,最小值一定在后半段。这样就可以利用循环解决大部分情况。但当在处理二分法时,我发现了一个严重的问题, 即当数组某一次循环中头、中、尾三个位置的数值相同时,问题复杂度会回归到O(n)。 理由是在这种情况下无法判断最小值会隐藏在前半段还是后半段中,导致循环进行不下去,下面代码中****部分即为无法解决的情况。

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        int first =0;
        int last = array.length-1;
        int mid = (first+last)/2;
        while(first<last){
            if(array[mid] < array[last]){
                last = mid;
            }
            if(array[mid] > array[last]){
                first = mid+1;
            }
            if(array[mid] == array[last]){
                if(array[first] != array[mid]){
                    last = mid;
                }
                else{
                    ***************************
                }
            }
             mid = (first+last)/2
        }
        return array[mid];
    }
}

时间复杂度:O(logn) (部分情况除外)
空间复杂度:O(1)

全部评论

相关推荐

xxxxOxo:该催就催,想要你的不会因为催就挂,催了就挂的是因为本来就要挂你
点赞 评论 收藏
分享
05-12 18:24
长安大学 UE4
因为是家里第一代大学生,报专业报学校都没人可以指导,只能自己看着来毕业找工作,父母只知道考公务员啊考教师啊,丝毫不考虑难度我说要去大城市打工才行,小县城对学历没有需求,开的工资都很低,两三千养活不了的结果都不同意我去大城市,觉得北上广深远,不稳定,一年到头不着家,养这么大孩子算白养了要我怎么办,不考公不考编就是死路一条呗,出去打工就是不孝呗可是考公考编也好难,考上也是小职员,到时候又变成了家里第一代体制内了,不还是样样靠自己有时候很羡慕同学,要去大城市打拼,家里都很支持去看看外面的世界也羡慕同学父母都是体制内的,考上还有所依靠家里没有办法给予帮助,简直是进入死胡同一样
Two_Shadow:你先拿到offer,路是自己走的,你真去了谁拦得住你呢,不用给自己扣帽子,我也是我家第一代大学生啊,农村人,高考96个志愿我就填50多个计算机,爸妈让我填满保底我说我不,我就学计算机,上大学了让我考研我说我不考,我就喜欢干活,现在签了offer,他们也释怀,不回家就努力提升自己,就往家里打钱,就开视频,还能怎么样呢,路是自己走的,他们只是希望你能走得好一点,但大部分父母,尤其是农村父母根本帮不了你什么,难道你就不走路了吗,希望能骂醒你,不要想太多做太少。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务