Leetcode 153: Find Minimum in Rotated Sorted Array
2015-12-15 07:43
423 查看
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e.,
Find the minimum element.
You may assume no duplicate exists in the array.
Solution:
The minimum element is at the pivot, which separates the array into two parts. We can use binary search to find it. If the middle element is greater than the end element, mid is in the first part of the array, so set the start mid. If mid element is less than
the end, mid is in the second part of the array and thus we should set end mid. The reason why we choose to compare mid element with end element instead of the start is, a sorted array is also regarded as a rotated array. So if we choose to compare mid with
start, the element is always greater than the start, and start is always go forward until it equals end. So in this way the result is not correct.
Time complexity: O(logn)
Space complexity: O(n)
public class Solution {
public int findMin(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int start = 0;
int end = nums.length - 1;
int mid;
// Binary Search
while (start + 1 < end) {
mid = start + (end - start) / 2;
if (nums[mid] >= nums[end]) {
start = mid;
} else {
end = mid;
}
}
if (nums[start] <= nums[end]) {
return nums[start];
} else {
return nums[end];
}
}
}
(i.e.,
0 1 2 4 5 6 7might become
4 5 6 7 0 1 2).
Find the minimum element.
You may assume no duplicate exists in the array.
Solution:
The minimum element is at the pivot, which separates the array into two parts. We can use binary search to find it. If the middle element is greater than the end element, mid is in the first part of the array, so set the start mid. If mid element is less than
the end, mid is in the second part of the array and thus we should set end mid. The reason why we choose to compare mid element with end element instead of the start is, a sorted array is also regarded as a rotated array. So if we choose to compare mid with
start, the element is always greater than the start, and start is always go forward until it equals end. So in this way the result is not correct.
Time complexity: O(logn)
Space complexity: O(n)
public class Solution {
public int findMin(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int start = 0;
int end = nums.length - 1;
int mid;
// Binary Search
while (start + 1 < end) {
mid = start + (end - start) / 2;
if (nums[mid] >= nums[end]) {
start = mid;
} else {
end = mid;
}
}
if (nums[start] <= nums[end]) {
return nums[start];
} else {
return nums[end];
}
}
}
相关文章推荐
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- javascript数组操作总结和属性、方法介绍
- mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
- JavaScript Array扩展实现代码
- JavaScript之数组(Array)详解
- C#中Array与ArrayList用法及转换的方法
- Array栈方法和队列方法的特点说明
- Array.prototype.slice 使用扩展
- Array, Array Constructor, for in loop, typeof, instanceOf
- 实例详解ECMAScript5中新增的Array方法
- js Array的用法总结
- JavaScript 判断判断某个对象是Object还是一个Array
- Javascript中的Array数组对象详谈
- js模拟实现Array的sort方法
- 在javascript将NodeList作为Array数组处理的方法
- PHP array_multisort()函数的使用札记
- PHP中array_merge和array相加的区别分析
- Sorting Array Values in PHP(数组排序)
- 深入array multisort排序原理的详解
- Array 重排序方法和操作方法的简单实例