zoukankan      html  css  js  c++  java
  • 剑指offer -11题

    剑指offer-11

    旋转数组最小的数字

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

    解题思路:

    在一个有序数组中查找元素我们一般使用二分查找(折半查找),时间复杂度O(logN),但是本题还有一个问题,就是遇到重复元素无法定位区间,此时需要切换到顺序查找.例如对于数组 {1,1,1,0,1},l、m 和 h 指向的数都为 1,此时无法知道最小数字 0 在哪个区间。

    //折半查找
    public int minNumberInRotateArray(int[]  nums){
    	if(nums.length == 0)
      	return 0;
      
      int low=0, high=nums.length - 1;  //define low and high
      while(low < high ){
        int mid = low + (high - low) / 2; //
        if(nums[low] == nums[mid] && nums[mid] == nums[high]) 
          return minNumber[nums, low ,high];
        else if (nums[mid] <= nums[high])
            high = mid;
        else 
            low = mid + 1;
    	}
      return nums[low];
    }
         
    //顺序查找
    private int minNumber(int []nums , int low ,int high){
          for(int i = low; i < high; i++){
            if(nums[i] > nums[i+1])
              return nums[i+1];
          }
       return nums[low];
    }
    
  • 相关阅读:
    经典分水岭算法的 C++ 实现
    一个简易的键盘按键测试程序
    工程优化方法中的“最速下降法”和“DFP拟牛顿法”的 C 语言实现
    基于哈夫曼编码的压缩解压程序(C 语言)
    博客选择:博客园 or CSDN
    Spring总结
    CSS总结
    EL表达式总结
    Jdbc总结
    hibernate总结
  • 原文地址:https://www.cnblogs.com/fightingcode/p/10802322.html
Copyright © 2011-2022 走看看