剑指 Offer 11. 旋转数组的最小数字

题目

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

在这里插入图片描述

  • 大家先自己思考一下, 他这个是把一个上升的数组, 后面的一部分换到了后面
  • 相信大家肯定能想到这个O(n)的算法
  • 思路 :
    • 因为他是把一部分小的放到上升数列的后面那么遍历数组出现下降的地方一定是最小的值
  • 代码
class Solution {
public:
    int minArray(vector<int>& numbers) {
         int x = numbers[0], flag = 1;
         for (int i = 1; i < numbers.size(); i ++)
            if (x > numbers[i]){
                return numbers[i];
            }else{
                x = numbers[i];
            }

         return numbers[0];    
    }
};
  • 还有一个更好的办法这个肯定是面试要考的这个方法 二分出答案
  • 思路
    • 两个指针l = 0, r = size() - 1 中间的mid = (r + l) >> 1 下取整
    • 我们来想二分是三种情况
      • a[r] > a[mid] 这个证明什么 他是把原来上升数组的前面部分放到了后面如果 最后一个数大于a[mid] 那么是不是证明mid 到 r这之间是不是没有正确答案, 因为他这个是连续上升的 转换过后数组前面的值必然是大于最后一个值的 r = mid在这里插入图片描述

      • a[r] < a[mid] 这个证明什么索引小于mid的数都大于a[r] 那么肯定答案不会再索引小于mid的地方所以 l = mid + 1
        在这里插入图片描述

      • 最后a[r] = a[mid] 这个有人会说那么r = mid可以直接移到这里其实不是会出现这种情况, 下面这种情况就在 mid到r之间所以可以肯定的是不会r这就算数组全部相等 哪那边还有mid 所以 r = r - 1;
        在这里插入图片描述

class Solution {
       public int minArray(int[] numbers) {
       int l = 0, r = numbers.length - 1;
       while (l < r) {
           int mid = ((r + l) >> 1);
           //只要右边比中间大,那右边一定是有序数组
           if (numbers[r] > numbers[mid]) {
               r = mid;
           } else if (numbers[r] < numbers[mid]) {
               l = mid + 1;
            //去重
           } else r--;
       }
       return numbers[l];
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最常见的Java面试题大全的程序面试程序,很有影响力的哦!好好珍惜这个资料吧!有Java的常见面试题的冒泡,常见的算法,继承,多态 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装:  封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性:  多态性是允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值