剑指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<j-1&&a[i]>=a[j]) {        
            int c=((int) Math.floor((j-i)/2))+i;
            if(a[i]<a[c])i=c;
            if(a[i]==a[c])i++;
            else j=c;        
        }
        if(a[i]<a[j])System.out.println(a[i]);
        else
        System.out.println(a[j]);        
    }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值