您的位置:首页 > Web前端

剑指offer 旋转数组的最小数字

2017-05-16 11:01 495 查看
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

暴力法求解:(不提倡)

import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length==0){
return 0;
}

int min=Integer.MAX_VALUE;
int min_index=0;
for(int i=0;i<array.length;i++){
if(array[i]<min){
min=array[i];
min_index=i;
}
}

return min;
}
}
稍微优化:

import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length==0){
return 0;
}
for(int i=0;i<array.length;i++){
if(array[i]>array[i+1]){
return array[i+1];
}
}
return array[0];
}
}

由于原有数组是递增数组,那么旋转后的数组是部分有序的,一看见部分有序就应该想到二分查找:
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length==0){
return 0;
}

int st=0;
int end=array.length-1;
int mid=(st+end)/2;

while(st<end){
if(array[mid]==array[st]){
return array[mid+1];//循环跳出点注意。。。
}
if(array[mid]>array[st]){
st=mid;
}else{
end=mid;
}

mid=(st+end)/2;

//return array[st];
}
return array[0];//确保考虑到旋转数组旋转后变为原数组的情况
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: