剑指offer:查找转置数组中的最小值

public class Solution {
/*	把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 
	例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。*/
	public static void main(String[] args)
	{
		int[] array= {1,1,1,0,1,1};
		System.out.println(minNumberInRotateArray(array));
		System.out.println(minNumberInRotateArrayByErgodic(array));
	}
	/********************
	 *  通过二分查找方式查找
	 * @param array 需要进行查找的数组
	 * @return 查找到的最小值
	 */
	public static int minNumberInRotateArray(int [] array) {
		 int left=0;//数组左起点下标
		 int right=array.length-1;//数组末位置下标
		 int mid=(left+right)/2;//中间位置下标
		 
		 //旋转后数组满足条件,最左边元素大于等于最右边的元素
		//左侧下标小于右侧时,循环
		 while(right-left>1)
		 {
			 //如果中间下标位置所在元素大于左侧元素,说明mid在左侧非减区
			 //which means 最小元素位置在mid和right之间
			 if(array[mid]>=array[left])
			 {
				 left=mid;//变更最小值所在区间 右侧
			 }
			 else if(array[mid]<=array[right])
			 {
				 right=mid;//变更最小值所在区间 左侧
			 }
			 mid=(left+right)/2;//修改中间位置下标
		 }
		 return array[left]>array[right]?array[right]:array[left];
	    }
	/********************
	 * 通过遍历方式查找
	 * @param array 需要进行查找的数组
	 * @return 查找到的最小值
	 */
	public static int minNumberInRotateArrayByErgodic(int [] array) {
		//数组长度为零 返回0
		if(array==null||array.length==0)
		  return 0;
		//数组长度不为零
		int index=0;//遍历下标
		while((index<array.length-1)&&(array[index]<=array[index+1]))//开始查找
		{	
			index++;
		}
		//返回查找到的元素
		return array[index+1];
	    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43823363/article/details/87733702