您的位置:首页 > 编程语言 > Java开发

Leetcode: Find Minimum in Rotated Sorted Array I & II (Java)

2015-05-25 20:04 621 查看
两道题,一道是无重复元素的有序数组另一道是有重复元素的有序数组。虽然经过旋转,但是有序数组仍然应该使用二分查找。二分查找仍然是简单的递归思想。

第一题:

public class Solution {
public int findMin(int[] nums) {
return findMinRange(nums, 0, nums.length-1);
}

public int findMinRange(int[] nums, int begin, int end) {
int mid;
int min;
if (begin==end) return nums[begin];
mid = (begin + end) / 2;
if (nums[begin] > nums[mid]) min = findMinRange(nums, begin+1, mid);
else if (nums[mid] > nums[end]) min = findMinRange(nums, mid+1, end);
else min = nums[begin];
return min;
}
}


第二题凡是出现大于关系,则与第一题处理一样。

此外要多考虑

nums[begin]==nums[mid] && nums[mid]==nums[end]


的情况,此时最小元素既有可能在(begin, mid]内,也可能在(mid, end]内。例如[3, 3, 1, 3]或[3, 1, 3, 3, 3, 3]。

另外,若

nums[begin]<nums[mid] && nums[mid]==nums[end]


则最小值一定就是nums[begin]。

第二题:

public class Solution {
public int findMin(int[] nums) {
return findMinRange(nums, 0, nums.length-1);
}

public int findMinRange(int[] nums, int begin, int end) {
int mid;
int min;
if (begin==end) return nums[begin];
mid = (begin + end) / 2;
if (begin==mid) {
if (nums[begin]<=nums[end]) return nums[begin];
else return nums[end];
}

if (nums[begin] > nums[mid]) min = findMinRange(nums, begin+1, mid);
else if (nums[begin] == nums[mid]) {
if (nums[mid] > nums[end]) min = findMinRange(nums, mid+1, end);
else if (nums[mid] == nums[end]) {
int min1, min2;
min1 = findMinRange(nums, begin+1, mid);
min2 = findMinRange(nums, mid+1, end);
if (min1<=min2) min = min1;
else min = min2;
}
else min = findMinRange(nums, begin+1, mid);
}
else {
if (nums[mid] > nums[end]) min = findMinRange(nums, mid+1, end);
else min = nums[begin];
}
return min;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: