剑指offer中旋转数组的最小数字,补充改良版

感谢剑指offer,一道题半天就过去了……………………hhhhhhhhh,真的收获很大啦,比如这道题,在原书的讲解下,我发现还可以再简单点

—————————————————蹄蹄同学还在学习路上,请大家多多指教——————————————————

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

因为数组本身是有序的,所以我们可以考虑使用二分查找,让中间值和最左边的值作比较,比如上面的栗子,5比3大说明数组还处于递增序列中,也就是说我们需要往后找,让左边的指针指向中间的值;但是如果中间的值比最左边的值要小的话就说明,最小值应该在前半部分,所以让右边的指针指向中间。这就是大概思想,但是有个问题时如果,数组中有重复的值,旋转后让左边的值和中间的值一样大,怎么办呢?比如:{0,1,1,1,1,}旋转为{1,1,1,0,1},

怎么办呢?

难道只能顺序查找了?

我想了一下,试了试一个新的方法,我直接让最左边的指针往右走了一下,相当于我不要最左边的值了,这又有什么影响呢?反正我只要找到最小值,如果左边是最小值,那中间这个值和它相等,说明最小值还有啊。是吧,还有对于有序的数列来说,去掉任意一个值它也还是有序啊。好勒,这样的话,我们10行代码搞定

public static void minnum(int i,int j,int a[]) {
        while(i=a[j]) {        
            int c=((int) Math.floor((j-i)/2))+i;
            if(a[i]             if(a[i]==a[c])i++;
            else j=c;        
        }
        if(a[i]         else
        System.out.println(a[j]);        
    }

 

你可能感兴趣的:(剑指offer,编程题,旋转数组,最小值)