您的位置:首页 > 其它

LeetCode Find Minimum in Rotated Sorted Array & LeetCode Find Minimum in Rotated Sorted Array II

2015-09-05 22:21 531 查看

Find Minimum in Rotated Sorted Array

题意:有一个排好序的数组,可能旋转,并给出旋转后的序列,不知道旋转点在哪里,求整个数组的最小值
解法一:……刚刚看到题目的时候我也是震惊了,貌似遍历一遍就可以了,那么提议当中的旋转点貌似是多余的?……突然感觉到了深深的恶意……

<span style="font-size:18px;">public class Solution {
public int findMin(int[] num) {
int min = num[0];
int len = num.length;
for (int i = 1; i < len; i++) {
if (min > num[i])
min = num[i];
}
return min;
}
}</span>

解法二:前一个解法的确是恶意满满,那么就换一个不那么low的解法。

采用二分的想法,不过因为是旋转过的,所以正常二分进行的条件不是arr[mid] > < = target,而是arr[mid]> < arr[left]和arr[right]

arr[mid] > arr[right] / arr[mid] > arr[[left] 表示右半段是上升的,right=mid即可

arr[mid] < arr[left] / arr[mid] < arr[right] 表示左半段是上升的,left=mid即可

<span style="font-size:18px;">public class Solution {
public int findMin(int[] num) {
int left = 0, right = num.length - 1, mid;
if (num[left] <= num[right])
return num[left];
while (left + 1 < right) {
mid = (left + right) / 2;
if (num[mid] > num[left]) {
left = mid;
} else {
right = mid;
}
}
return num[right];
}

public static void main(String[] args) {
Solution s = new Solution();
// System.out.println(s.findMin(new int[] { 1, 2 }));
System.out.println(s.findMin(new int[] { 3, 4, 5, 1, 2 }));
// System.out.println(s.findMin(new int[] { 2, 1 }));
System.out.println(s.findMin(new int[] { 2, 3, 4, 5, 1 }));
System.out.println(s.findMin(new int[] { 2, 3, 1 }));
System.out.println(s.findMin(new int[] { 3, 1, 2 }));
}
}</span>


Find Minimum in Rotated Sorted Array II

这道题目和上一道题目类似,只是少了一个约束条件:没有duplicate。也就是说,一个包含duplicate的数组进行rotate。
解决的方法,我这里参考了一下其他人的解决方法,都是用二分,然后如果arr[mid]==arr[right] right--;
import java.util.*;

public class Solution {
public int findMin(int[] num) {
int left = 0, right = num.length - 1, mid;
while (left + 1 < right) {
mid = (left + right) / 2;
if (num[mid] > num[left]) {
left = mid;
} else if (num[mid] < num[left]) {
right = mid;
} else {
right--;
}
}
return num[right];
}

public static void main(String[] args) {
Solution s = new Solution();
// System.out.println(s.findMin(new int[] { 1, 2 }));
System.out.println(s.findMin(new int[] { 3, 4, 5, 1, 2 }));
// System.out.println(s.findMin(new int[] { 2, 1 }));
System.out.println(s.findMin(new int[] { 2, 3, 4, 5, 1 }));
System.out.println(s.findMin(new int[] { 2, 3, 1 }));
System.out.println(s.findMin(new int[] { 3, 1, 2 }));
System.out.println(s.findMin(new int[] { 3, 1, 3 }));
System.out.println(s.findMin(new int[] { 1, 1, 1, 1, 1 }));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: