Find Minimum in Rotated Sorted Array

本文介绍了一种高效查找旋转排序数组中最小元素的方法。通过判断数组是否为旋转排序数组,并利用二分查找思想来缩小搜索范围,最终确定最小元素的位置。提供了两种不同的Java实现方式。

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Find the minimum element.

You may assume no duplicate exists in the array.

思路:1.确认是否为rotated sorted array 如果是且num[mid] > num[right] 表明最小值在mid的右边,如果num[mid] < num[right] 表明最小值在mid的左边。

   2.如果不是rotated sorted array 则为普通的sorted array, 则最小值在mid的左边。

 1 public class Solution {
 2     /**
 3      * @param num: a rotated sorted array
 4      * @return: the minimum number in the array
 5      */
 6     public int findMin(int[] num) {
 7         int left = 0;
 8         int right = num.length - 1;
 9         while (left + 1 < right) {
10             int mid = left + (right - left) / 2;
11             if (num[left] > num[right] && num[mid] > num[right]) {
12                 left = mid + 1;
13             } else if (num[left] > num[right] && num[mid] < num[right]){
14                 right = mid;
15             } else if (num[left] < num[right]) {
16                 right = mid;
17             }
18         }
19         if (num[left] < num[right]) {
20             return num[left];
21         } else {
22             return num[right];
23         }
24     }
25 }

 

 1 public class Solution {
 2     /**
 3      * @param num: a rotated sorted array
 4      * @return: the minimum number in the array
 5      */
 6     public int findMin(int[] nums) {
 7         if (nums == null || nums.length == 0) {
 8             return -1;
 9         }
10         
11         int start = 0, end = nums.length - 1;
12         int target = nums[nums.length - 1];
13         
14         // find the first element <= target
15         while (start + 1 < end) {
16             int mid = start + (end - start) / 2;
17             if (nums[mid] <= target) {
18                 end = mid;
19             } else {
20                 start = mid;
21             }
22         }
23         if (nums[start] <= target) {
24             return nums[start];
25         } else {
26             return nums[end];
27         }
28     }
29 }

 

    

转载于:https://www.cnblogs.com/FLAGyuri/p/5294407.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值