描述
输入一个递增排序的数组(元素不重复)的一个旋转(次数不详),找出某个元素.
输入
第一行:N,数组的长度
第二行:N个整数,作为数组的元素,空格分开
第三行:要查找的关键字K
输出
关键字K的下标,如果没有找到,输出-1
样例输入
5 6 1 2 3 4 1
样例输出
1
首先我们需要了解什么是旋转数组
旋转数组是:将包含 n 个元素的数组向右旋转 k 步。
例如,如果 n = 7 , k = 3,给定数组 [1,2,3,4,5,6,7]
,向右旋转后的结果为 [5,6,7,1,2,3,4]
。
所以算法思想:在旋转数组中,例如[6,1,2,3,4]中,我们并不知道到底旋转了多少次,但是,因为该数组在旋转前
是递增数组,所以在旋转数组中,必然有一个最小元素,在最小元素前是一个递增的子数组A,而在最小元素及最小元素后也是一个递增的子数组B。其中A中元素都大于B中元素。所以首先需要找到最小元素的位置。
然后比较目标元素k与数组第一个元素的大小,如果k>=第一个元素,说明k在A中,然后在A中利用二分查找法即可找到k;
若k<第一个元素,说明k在B中,然后在B中利用二分查找法即可找到k
Java代码: