【二分查找】旋转数字的最小数字

如下图所示,最小的数字没有序的那一组。
且一定在大数字的右面。在这里插入图片描述
当begin和end相邻时,退出while循环,此时那个n[end]就是所求数字


	public static int f(int[] n) {
		
		/**
		 * 该算法有一个漏洞,当面对相同元素时,
		 * 比如:有序数组01111-->10111
		 * 中间值>=begin值,使得程序误以为左侧有序。
		 * 所以在遇到这种情况时,应该采用顺序扫描法。
		 */
		
		int begin = 0;
		int end = n.length - 1;
		
		//当begin 和 end 指向相邻元素时,退出。
		while(begin + 1 < end) {
			int mid = begin + ((end - begin) >> 1);
			if(n[mid] >= n[begin]){ //左侧有序,根据推测,最小值一定出现在无序的一侧
				begin = mid;
			} else {
				end = mid;
			}
		}
		//当begin和end指向相邻元素的时候,最小值一定出现在右。  
		return n[end];
	}
	
	public static void main(String[] args) {
		int [] n = {3,4,5,1,2};
		System.out.println(f(n));
	}
发布了81 篇原创文章 · 获赞 13 · 访问量 2393

猜你喜欢

转载自blog.csdn.net/alovelypeach/article/details/104145594