旋转数组的最小数字
来源:互联网 发布:两台台式机共享网络 编辑:程序博客网 时间:2024/06/05 20:04
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
该题为剑指offer中面试题8。思路是使用二分查找
需要考虑的两个点:
1.如果旋转的元素为0,即该数组是一个递增(非递减)怎么办
2.如果数组left,right,mid三个元素相等,无法用二分查找,所以改用顺序查找。
package cn.array.rotate;public class Demo1 {public static void main(String[] args) {int[] a1 = {1,0,1,1,1};System.out.println(min(a1));}public static int min(int[] arr) {if (arr == null || arr.length == 0)throw new RuntimeException("数组不能为空");// 如果arr[0]<arr[arr.length-1],说明该数组完全有序,旋转的元素个数为0if (arr.length == 1 || arr[0] < arr[arr.length - 1])return arr[0];return min(arr, 0, arr.length - 1);}private static int min(int[] arr, int left, int right) {if (right - left == 1)return arr[right];int mid = left + (right - left) / 2;if (arr[left] > arr[mid])return min(arr, left, mid);else if(arr[left] < arr[mid])return min(arr, mid, right);//当左中两个元素相同时,要判断最右的元素大小//因为前面限制条件,最后的元素元素只能小等于arr[left]else{if(arr[right]<arr[left])return min(arr,mid,right);else//左中右三个元素相同,无法用二分查找,只能顺序查找return sequence(arr,left,right);}}//顺序查找private static int sequence(int[] arr, int left, int right) {int min=arr[left];for(int i=left+1;i<=right;i++)if(arr[i]<min)min=arr[i];return min;}}
0 0
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- java post接口测试代码
- 智能优化算法总结
- 腾讯课堂新手前端训练营day1
- iOS开发之语音朗读文字
- Android属性动画和视图动画的区别
- 旋转数组的最小数字
- Spring AOP小结
- linux vi编辑器命令整理一
- 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
- Android随笔随想-GUI-Fragment相关学习
- L1-047. 装睡
- 【GDOI2017模拟二试4.12】旅游路线(后缀自动机,trie)
- 实验6-2-出队入队
- centos7 安装docker