• 《剑指offer》面试题8 旋转数组的最小数字 Java版


    (找递增排序旋转数组中的最小数字)

    书中方法:这种题目就是要寻找数组的特点,然后根据这个特点去写。旋转后的递增数组分为两段递增序列,我们找到中点,如果比第一个元素大,表示在第一段递增序列里,如果比第一个元素小,表示在第二段递增序列里。这样就可以用递归或迭代完成。需要注意的一点是如果中间元素和第一个元素相等,并且和最后一个元素也相等,这时候我们判断不出这个元素是在第一个递增序列里还是在第二个递增序列里,这时候要从头到尾扫描来确定最小元素了。需要注意的另外一点是数组可能是没有旋转的,即把前面0个元素搬到了数组后面,这时候我们不应该进入递归或循环。

    	public int find(int[] a){
    		int index1 = 0;
    		int index2 = a.length-1;
    		int mid = index1;
    		
    		while(a[index1] >= a[index2]){
    			//index1始终在第一个序列,index2始终在第二个序列,当发生下面的情况时,找到最小值。
    			if(index1 == index2-1){
    				mid = index2;
    				break;
    			}
    			
    			mid = index1 + (index2-index1)/2;
    			
    			//如果发生了这种情况,不能通过迭代继续寻找下去了
    			if(a[mid] == a[index1] && a[mid] == a[index2]){
    				return searchMin(a, index1, index2);
    			}
    			
    			
    			if(a[mid] >= a[index1]){
    				index1 = mid;
    			}else if(a[mid] <= a[index2]){
    				index2 = mid;
    			}
    		}
    		return a[mid];
    	}
    	private int searchMin(int[] a, int start, int end){
    		int result = a[start];
    		for(int i=start+1; i<=end; i++){
    			if(a[i] < result){
    				result = a[i];
    			}
    		}
    		return result;
    	}
    
  • 相关阅读:
    飘逸的python
    hdu 4512 吉哥系列故事——完美队形I(最长公共上升自序加强版)
    Codeforces 482B. Interesting Array 线段树
    《开源框架那些事儿21》:巧借力与借巧力
    openNebula libvirt-virsh attach disk device for kvm
    configure mount nfs
    opennebula kvm attach disk
    openNebula 运维系列虚拟机virtual machines operations
    yum subversion puppet puppet-server
    文件系统,快存储,对象存储
  • 原文地址:https://www.cnblogs.com/czjk/p/11611209.html
Copyright © 2020-2023  润新知