博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer---06---数组,二分法---旋转数组的最小数字
阅读量:5796 次
发布时间:2019-06-18

本文共 1142 字,大约阅读时间需要 3 分钟。

 
题意
一个非递减数组拆成两个数组,查找数组的最小的数字。
题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为旋转。 输入一个递增的排序的数组的一个旋转,输出旋转数组的最小元素。
 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小元素为1.
 
 
分析
循环的方式来写二分法
1. 判定条件为start+1小于end,start=0, end=size-1 
2. mid=start+((end-start)>>1) 
3. 如果data[mid]满足条件直接返回,如果满足条件的数据在mid的右边则将start=mid,如果满足条件的数据在mid左边则将end=mid 
4. 最后因为left和right是相邻的,进行判断就可以了,同时最后的这个判断也包括了nums.length ==1和2的两种情况。
 
 
代码
import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] nums) {
        if (nums == null || nums.length == 0) return 0;
        
        int left = 0;
        int right = nums.length - 1;
        int mid = left;
        
        while (left + 1 < right) {
            mid = left + (right - left)/2;
            if (nums[mid] == nums[left] && nums[mid] == nums[right]) return threePosEqual(nums,left,right);
            if (nums[left] <= nums[mid]) left = mid;
            else if (nums[right] >= nums[mid]) right = mid;
        }
        
        if (nums[left] < nums[right]) return nums[left];
        else return nums[right];
    }
    
    public int threePosEqual(int[] nums,int left,int right) {
        int min = nums[left];
        for (int i = left + 1; left <= right; left++) {
            if (nums[left] < min) min = nums[left];
        }
        return min;
    }
}

转载于:https://www.cnblogs.com/buptyuhanwen/p/9376931.html

你可能感兴趣的文章
ES6
查看>>
c++编程思想(一)--对象导言
查看>>
【HIHOCODER 1142】 三分·三分求极值
查看>>
iText简介
查看>>
出现HTTP: 401 的时候的解析思路
查看>>
更改node版本
查看>>
【开发记录】微信小游戏开发入门——俄罗斯方块
查看>>
【递推】【组合计数】UVA - 11401 - Triangle Counting
查看>>
mfc WebBrowser打开本地网页
查看>>
【BZOJ】4147: [AMPPZ2014]Euclidean Nim
查看>>
unity3D:游戏分解之曲线
查看>>
ACM-ICPC 2018 徐州赛区网络预赛 D. Easy Math
查看>>
软件测试作业3
查看>>
用php做省份的三级联动 附带数据库
查看>>
css 实现圆形头像
查看>>
webpack4 系列教程(七): SCSS提取和懒加载
查看>>
mysql中给表添加字段
查看>>
Wormholes
查看>>
uva 11181 Probability|Given
查看>>
ajax 分页 步骤和代码
查看>>