您的位置:首页 > 其它

旋转数组的最小数字

2017-07-02 19:10 302 查看
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。

例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1

NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

/**
* 解法一:
*
* 算法思想描述:对输入数组中的所有元素进行排序,并输出排序后数组的第一个元素
*      1. 将数组中的元素保存至一个PriorityQueue中
*      2. 返回该PriorityQueue的第一个元素
*
*/
public class Solution {

public static void main(String[] args) {
Solution solution = new Solution();
int[] srcArray = {3, 4, 5, 1, 2};
System.out.println(solution.minNumberInRotateArray(srcArray));
}

public int minNumberInRotateArray(int [] array) {

// 若数组大小为0,则返回0
if(array.length == 0) return 0;

PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();

// 将数组中的元素保存至一个PriorityQueue中
for(int i = 0; i < array.length; i++) {
priorityQueue.offer(array[i]);
}

// 返回该PriorityQueue的第一个元素
return priorityQueue.peek();
}
}


/**
* 解法二:
*
*  遍历数组,若出现前一数组元素大于后一数组元素,由题意知该元素即为所求的最小元素;
*  否则,返回第一个数组元素(最小元素)
*
*/
public class Solution {

public static void main(String[] args) {
Solution solution = new Solution();
int[] srcArray = { 3, 4, 5, 1, 2 };
System.out.println(solution.minNumberInRotateArray(srcArray));
}

public int minNumberInRotateArray(int[] array) {

// 若数组大小为0,则返回0
if (array.length == 0) return 0;

// 遍历数组,若出现前一数组元素大于后一数组元素,由题意知该元素即为所求的最小元素;
for (int i = 0; i < array.length - 1; i++) {
if (array[i] > array[i + 1]) return array[i + 1];
}

// 返回第一个数组元素(最小元素)
return array[0];
}
}


/**
* 解法三:二分查找法查找数组中的元素
*  当array[mid] > array[high]时,改变low指针为mid + 1;
*  当array[mid] == array[high]时,改变high指针为high - 1;
*  当array[mid] < array[high]时,改变high指针为mid指针
*
*/
public class Solution {

public static void main(String[] args) {
Solution solution = new Solution();
int[] srcArray = { 3, 4, 5, 1, 2 };
System.out.println(solution.minNumberInRotateArray(srcArray));
}

// 二分查找法查找数组中的元素
public int minNumberInRotateArray(int[] array) {
int low = 0;
int high = array.length - 1;
while (low < high) {
int mid = low + (high - low) / 2;

// 当array[mid] > array[high]时,改变low指针为mid + 1
if (array[mid] > array[high]) {
low = mid + 1;

// 当array[mid] == array[high]时,改变high指针为high - 1
} else if (array[mid] == array[high]) {
high = high - 1;

// 当array[mid] < array[high]时,改变high指针为mid指针
} else {
high = mid;
}
}
return array[low];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息