把数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转(java)
1. 题目描述
2. 解题思路
(1)观察这个数组的规律就可以找出一些方法。我的想法是这个数组经过旋转以后,说实话其实无论怎么整无非就是找出数组的最小值嘛?嗯,找最小值?全部遍历就完事了。
(2)同样的道理居然是查找最小值,什么二分查找,堆排序…真的是一大堆方法了。说实话笔试很多这种文字游戏,第一次看的时候,都会心想:“这么难的吗?哦豁完蛋。此时你不要惊慌。多看几遍题目,读懂它。当你读懂了以后。你肯定会发问,就这?就这?这么简单?”。
3. 代码实现
(1)
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length==0 || array == null)
return 0;
int result = array[0];
for(int i = 1; i < array.length; i++)
{
if(result > array[i])
result = array[i];
}
return result;
}
}
(2)我就采用二分查找法
import java.util.ArrayList;
public class Solution {
//4,5,6,1,2,3
public int minNumberInRotateArray(int [] array) {
//1、数组大小为0时,返回0
if(array == null || array.length == 0)
return 0;
int left = 0;
int right = array.length - 1;
int mid = 0;
//2、采用二分法
while(array[left] >= array[right]){
if(right - left <= 1){
mid = right;
break;
}
mid = (left + right)/2;
//处理三个位置同时相同情况
if(array[left] == array[mid] && array[mid] == array[right])
{
//向中间靠拢
left++;
right--;
}else{
//二分法
if(array[left] <= array[mid]){
left = mid;
}else{
right = mid;
}
}
}
return array[mid];
}
}