zoukankan      html  css  js  c++  java
  • 旋转数组的最小数字(改造二分法)

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

    思路:这儿题目说了数组是有序的,为了提升效率,可以用二分查找去做,题目上也说了用二分查找去做。事实上,以后的题目,只要说了有序,基本都可以用效率更高的查找,比如二分查找。

    代码:

    public class 旋转数组的最小数字 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int []arr = {5,1,2,3,4};
    		System.out.println("最小数字为"+min(arr));
    	}
    	
    	/**
    	 *  活用二分查找
    	 * @param arr
    	 * @return
    	 */
    	static int min(int arr[]){
    		int begin = 0;
    		int end = arr.length - 1;
    		// 考虑没有旋转这种特殊的旋转
    		if (arr[begin] < arr[end]) return arr[begin];
    		
    		while(begin+1<end){
    			int mid = begin + ((end-begin)>>1);
    			// 要么左侧有序,要么右侧有序
    			//  下面这行代码有个bug 假如数组为 1 1 1 0 1 这种数组应该在程序的入口检测一下
    			// 假如左侧和中间相等了  那么就应该用顺序查找最小值了。
    			if (arr[mid] >= arr[begin]) {   // 左侧有序
    				begin = mid;
    			}else {
    				end = mid;
    			}
    		}
    		return arr[end];
    	}
    
    }
    

    结果:

      

  • 相关阅读:
    JSON和Object数组在js中的转换
    Raphael绘制箭头arrow
    Web后台框架开发
    数据库开发
    docker
    git
    linux
    正则表达式工具
    python模拟ls命令
    python3基础
  • 原文地址:https://www.cnblogs.com/xiaoyh/p/10261897.html
Copyright © 2011-2022 走看看