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

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

使用二分查找,在arr[left..right]上找到这个范围的最小值

1.若果arr[left] < arr[right] 那么arr[left]就是最小值,直接返回即可。

2.令mid = (left +  right)/2,mid即数组的中间位置

  1)如果 arr[left] > arr[mid],说明要找的数在mid的左边,令 right = mid,然后回到步骤一。

  2)如果 arr[right] < arr[mid],说明要找的数在mid的右边,令 left = mid,然后回到步骤一。

3.1和2没有命中的情况就是 arr[left] >= arr[right],arr[left] <= arr[mid],arr[right] >= arr[mid],所以剩余的情况为                           arr[left] = arr[mid] = arr[right]

    此时可以直接遍历找到最小值,我依然使用二分查找,从i开始向右遍历,设i = left。

    情况1:arr[i] < arr[mid] 说明arr[i]就是最小值,直接返回。

    情况2:arr[left] < arr[i]说明arr[i] > arr[mid] ,令right = mid,然后回到步骤一。

    情况3:如果到i == mid都没有出现上面2种情况,说明从left到mid的值全部一样,令left = mid,然后回到步骤一 

public int minNumberInRotateArray(int [] array) {
        int left = 0;
        int right = array.length - 1;
        int mid = 0;
        while(left < right){
            if(array.length == 0) return 0;
            if(left == right - 1) break;
            if(array[left] < array[right])
                return array[left];
            mid =(left + right)/2;
            if(array[left] > array[mid]){
                right = mid;
                continue;
            }
            if (array[right] < array[mid]){
                left = mid;
                continue;
            }
            while(left < mid){
                if(array[left] == array[mid])
                    left++;
                else if(array[left] < array[mid])
                    return array[left];
                else {
                    right = mid;
                    break;
                }
            }
        }
        return Math.min(array[left],array[right]);
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用AngularJs编写的简单 益智游戏(附源代码)  这是一个简单的 javascript 项目。这是一个拼图游戏,也包含一个填字游戏。这个游戏玩起来很棒。有两个不同的版本可以玩这个游戏。你也可以玩填字游戏。 关于游戏 这款游戏的玩法很简单。如上所述,它包含拼图和填字游戏。您可以通过移动图像来玩滑动拼图。您还可以选择要在滑动面板中拥有的列数和网格数。 另一个是填字游戏。在这里你只需要找到浏览器左侧提到的那些单词。 要运行此游戏,您需要在系统上安装浏览器。下载并在代码编辑器中打开此项目。然后有一个 index.html 文件可供您修改。在命令提示符中运行该文件,或者您可以直接运行索引文件。使用 Google Chrome 或 FireFox 可获得更好的用户体验。此外,这是一款多人游戏,双方玩家都是人类。 这个游戏包含很多 JavaScript 验证。这个游戏很有趣,如果你能用一点 CSS 修改它,那就更好了。 总的来说,这个项目使用了很多 javascript 和 javascript 库。如果你可以添加一些具有不同颜色选项的级别,那么你一定可以利用其库来提高你的 javascript 技能。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值