剑指offer-面试题8 旋转数组的最小数字
来源:互联网 发布:c 窗体编程视频教程 编辑:程序博客网 时间:2024/05/16 15:59
面试题8 旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为 1。
思路
题目本身不难理解,就是一个有序数组的变形,这里有两个问题需要考虑:
(1)题目中说的旋转是一次旋转还是不限次数?
(2)数组中的数是严格递增还是可以有相同的数出现?
思考
我们先看第一个问题:如果能不限次数的话,那按照题目给的旋转方式,完全可以将数组旋转成一个无序数组,那寻找最小值只能是先排序再找最小值了,和题意不符,得出结论:只能旋转一次;
第二个问题:严格递增是我们想要的,如果是严格递增,那么二分查找将会非常有用,能有效减小时间复杂度。
考虑元素可以相同,极端情况:有个长度很大的数组,除了第一位是0之外,数组中其余的数都是1。我们发现,如果对数组进行随意旋转操作,那么0可能在的位置是数组的第2到n位。不能通过判断大小(因为只有一个元素不相同)来判断,那只能遍历数组比较大小获得最小值了。这严格来说也不太符合题意。但是在许多其它的答案中都考虑到了这个可能,仁者见仁,那我们也实现它。
代码
package swordOffer;/** * 这是剑指offer的第8题:旋转数组的最小数字 * 题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的 * 旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数 * 组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为 1。 * * @author Stephen Huge * */public class Ex08MinAtRotateArr { public static void main(String[] args) { Ex08MinAtRotateArr mara = new Ex08MinAtRotateArr(); int[] arr = {2, 3, 4, 5, 1};// int[] arr = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1}; int sol = mara.MinAtRotateArr(arr); System.out.println(sol); } public int MinAtRotateArr(int[] arr) { return MinAtRotateArr(arr, 0, arr.length - 1); } private int MinAtRotateArr(int[] arr, int left, int right) { int pivot = (left + right) / 2; if(arr[left] == arr[right]) { return iterateGet(arr); } if(left == pivot) { return arr[left + 1]; } if(arr[left] < arr[pivot]) { left = pivot; pivot = (pivot + right) / 2; } if(arr[left] > arr[pivot]) { right = pivot; pivot = (pivot - left) / 2; } return MinAtRotateArr(arr, left, right); } // 数组左右数相同时,无法使用二分法判断,采用遍历判断 private int iterateGet(int[] arr) { int result = arr[0]; for(int i = 1; i < arr.length; i++) { if(arr[i] < result) { result = arr[i]; } } return result; }}
执行结果是:
1
0 0
- 【剑指offer】面试题8:旋转数组的最小数字
- 剑指offer面试题8:旋转数组的最小数字
- 剑指Offer:面试题8 :旋转数组的最小数字
- 《剑指offer》面试题8旋转数组的最小数字
- 《剑指Offer》面试题8:旋转数组的最小数字
- 【剑指offer】 面试题8: 旋转数组的最小数字
- 剑指offer-面试题8:旋转数组的最小数字
- 剑指offer面试题8:旋转数组的最小数字
- 【剑指offer】面试题8:旋转数组的最小数字
- 剑指offer面试题8:旋转数组的最小数字
- 剑指offer--面试题8: 旋转数组的最小数字
- 剑指Offer---面试题8:旋转数组的最小数字
- 剑指offer-面试题8-旋转数组的最小数字
- 剑指offer-面试题8 旋转数组的最小数字
- 剑指offer-面试题8-旋转数组的最小数字
- 剑指offer 面试题8 旋转数组的最小数字
- 剑指offer面试题[8]-旋转数组的最小数字
- 【剑指Offer】面试题8:旋转数组的最小数字
- Linux学习笔记之输入输出重定向
- 利用Python解析CSV文件
- 计算机图形学领域国际期刊以及会议介绍
- Mac下Laravel的Homestead环境配置
- 窗——开了又关,关了又开(改编)
- 剑指offer-面试题8 旋转数组的最小数字
- Android下的音频通道配置文件mixer_paths.xml
- mysql 各种连接比较
- VMware Workstation cannot connect to the virtual machine 解决方案
- SQL系列之基本操作
- 数列查询算法
- 企业应用的趋势
- usb3.0开发指南:验证软件框架
- struts2 java.lang.ClassNotFoundException: org.apache.commons.lang.xwork.StringUtils