本文主要是介绍【剑指offer系列】-11旋转数组(关键字:旋转数组、旋转链表、rotate()方法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路就是旋转后的数组,采用折半查找,根据数组递增的性质来缩小查找的范围
public class Main11 {public static void main(String[] args) {int[] array = {3,4,5,1,2};System.out.println(findMin(array, 0, array.length - 1));}private static int findMin(int[] array, int left, int right) {if (right - left == 1)//3 4 5(left) 1(right) 2return array[right];int L = left,R = right;int mid = (L + R) / 2;if (array[L] <= array[mid])//左边大于中间,min在后方,左边缩小范围left = mid;if (array[R] >= array[mid])//右边大于中间,min在前方,右边缩小范围right = mid;return findMin(array,left ,right );}
}
我们现在主要来研究数组的旋转,集合的旋转,或链表的旋转:
1.场景:
输入数组{1,2,3,4,5,6}从第4位开始旋转即旋转后面两个数,得到的新数组为:{5,6,1,2,3,4};
集合同理
链表:1 -> 2 -> 3 -> 4 ->5 ,k=2,从后向前旋转两个,4 -> 5 -> 1 -> 2 -> 3
2.API方法:
这里引入集合工具类Collections.rotate(Collection<?> list ,int distance)方法:
其中,list表示要被旋转的集合,distance表示旋转元素的个数
3.使用:
1.distance > 0,表示从后向前旋转,旋转distance个元素
即:{1,2,3,4,5,6},distance=2,则旋转后的集合为{5,6,1,2,3,4}
2.distance < 0,表示从前向后旋转,旋转||distance||个元素
即:{1,2,3,4,5,6},distance= -2,则旋转后的集合为{3,4,5,6,1,2}
这篇关于【剑指offer系列】-11旋转数组(关键字:旋转数组、旋转链表、rotate()方法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!