目录
- 前言
- 问题介绍
- 解决方案
- 代码编写
- java语言版本
- c语言版本
- c++语言版本
- 思考感悟
- 写在最后
前言
当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~
在此感谢左大神让我对算法有了新的感悟认识!
问题介绍
原问题
给定一个从小到大有序的数组,该数组存在重复的数,并且该数组可能经过旋转处理,如arr = [1,2,3,4,5,6,7]代表数组未旋转,如果arr=[4,5,6,7,1,2,3],则表示该数组被旋转了,求该数组中的最小值
解决方案
原问题:
首先有一个规律,如果该数组没有被旋转,那么arr[0] 一定小于arr[n-1],否则一定是旋转过的
没有重复的情况如上
=
当l = mid = r相同时:
比较极端的情况,但是仍然是递增数组
具体代码请看代码逻辑处理
代码编写
java语言版本
原问题:
方法一:
/**
* 二轮测试:旋转数组的二分法查找
* @param arr
* @return
*/
public static int getMinCp1(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
int low = 0;
int mid = 0;
int high = arr.length - 1;
while (low < high) {
if (low == high - 1) {
break;
}
if (arr[low] < arr[high]) {
return arr[low];
}
mid = (low + high) / 2;
if (arr[low] > arr[mid]) {
high = low;
continue;
}
if (arr[low] < arr[mid]) {
low = mid;
continue;
}
while (low < mid) {
if (arr[low] < arr[mid]) {
return arr[low];
}else if (arr[low] == arr[mid]) {
low++;
continue;
}else {
high = mid;
break;
}
}
}
return Math.min(arr[low], arr[high]);
}
public static void main(String[] args) {
System.out.println(getMinCp1(new int[] {1,2,3,4,5}));
}
c语言版本
正在学习中
c++语言版本
正在学习中
思考感悟
看完解法,说实话我想用O(n)的解法[苦笑],要分析的情况真的挺复杂,不如直接使用O(N)的解法问题,并且在l=mid=r的情况下仍然存在循环找数字的情况,可以作为分析娱乐来,但不建议加到业务代码中。
写在最后
方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
如果需要git源码可邮件给2260755767@qq.com
再次感谢左大神对我算法的指点迷津!