zoukankan      html  css  js  c++  java
  • 剑指offer---06---数组,二分法---旋转数组的最小数字

     
    题意
    一个非递减数组拆成两个数组,查找数组的最小的数字。
    题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为旋转。 输入一个递增的排序的数组的一个旋转,输出旋转数组的最小元素。
     例如数组{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;
        }
    }
  • 相关阅读:
    CF251D
    P6914
    CF1100F
    双连通 / 圆方树 胡扯笔记
    P4082
    SparkSql使用Hive中注册的UDF函数报类找不到问题解决
    Oracle 查询时使用时间作为where报错hour must be between 1 and 12
    【面试-python】
    Linux和Git
    AMBA初探
  • 原文地址:https://www.cnblogs.com/buptyuhanwen/p/9376931.html
Copyright © 2011-2022 走看看