您的位置:首页 > 其它

找出旋转数组中最小的元素

2017-12-12 15:20 288 查看
题目:把一个数组最开始的若干个元素移到数组的末尾,我们称之为数组的旋转。输入一个递增数组的一个旋转数组,输出旋转数组的最小元素,例如{3,4,5,1,2}为{1,2,3,4,5}的旋转

分析:1.最简单的做法就是遍历该数组的所有元素,比较每个元素的大小,选出最小的元素。具体代码在此省略

2.如果我们要追求更好的算法效率,那么我们完全可以使用二分查找的思想,设置数组的开始和结束位置。

具体思想:我们设置目标数组的开始(min),中间(mid),末尾(max)三个位置,该数组的组成可以分为三段,第一段为一个递增的子数组,第二段为中间元素,第三段也是一个递增的子数组。

如果中间元素在第一个递增子数组中,它大于第一段子数组的第一个元素,即 numbers[mid] >= numbers[min],那么我们可以让该中间元素numbers[mid]为新子数组的第一个,这样就减小了查找范围。

如果中间元素在第二个递增数组中,他一定会小于第二段子数组的最后一个元素,即 numbers[mid] <= numbers[max],此时,我们可以让该中间元素numbers[mid]为第二个新子数组的最后一个,这样又减小了查找范围

具体实现代码如下:

package com.company;

public class Main {
/**
* 求旋转数组中的最小元素
* @param numbers
* @return
*/
public static int min(int[] numbers){

if(numbers == null  || numbers.length==0){
throw new RuntimeException("给定的数组错误");
}

int min=0;//开始位置
int mid = min;//中间位置
int max = numbers.length-1;//结束位置

while(numbers[mid] >= numbers[max]){
//如果数组中只有两个元素,则最小元素为numbers[max]
if(max - min ==1){
return numbers[max];
}
//计算中间位置
mid = min +(max - min)/2;
//如果三个位置的数相等,则选出其中最小的元素
if(numbers[min] == numbers[mid] && numbers[mid] == numbers[max]){
getMin(numbers,min,max);

}
// 如果中间位置对应的值在前一个排好序的部分,将mid设置为新的处理位置
if(numbers[mid] >= numbers[min]){
min= mid;
}else if(numbers[mid]<= numbers[max]){// 如果中间位置对应的值在后一个排好序的部分,将mid设置为新的处理位置
max = mid;
}

}

return numbers[min];

}

//获取数组中最小的元素
public static int getMin(int[] numbers,int start,int end){
int min = numbers[start];
for(int i=start+1;i<= end;i++){
if(min>numbers[i]){
min = numbers[i];
}
}
return min;
}

public static void main(String[] args) {
// 典型输入,单调升序的数组的一个旋转
int[] array1 = {3, 4, 5, 1, 2};
System.out.println(min(array1));

// 有重复数字,并且重复的数字刚好的最小的数字
//int[] array2 = {3, 4, 5, 1, 1, 2};
//System.out.println(min(array2));

// 有重复数字,但重复的数字不是第一个数字和最后一个数字
//int[] array3 = {3, 4, 5, 1, 2, 2};
//System.out.println(min(array3));

// 有重复的数字,并且重复的数字刚好是第一个数字和最后一个数字
//int[] array4 = {1, 0, 1, 1, 1};
//System.out.println(min(array4));

// 单调升序数组,旋转0个元素,也就是单调升序数组本身
//int[] array5 = {1, 2, 3, 4, 5};
//System.out.println(min(array5));

// 数组中只有一个数字
//int[] array6 = {2};
//System.out.println(min(array6));

// 数组中数字都相同
//int[] array7 = {1, 1, 1, 1, 1, 1, 1};
//System.out.println(min(array7));
//System.out.println(min(array6));

// 输入NULL
//System.out.println(min(null));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐