Find Min In Rotated Sorted Array,寻找反转序列中最小的元素。

问题描述:寻找反转序列中最小的元素。

算法分析:和寻找某个数是一个道理,还是利用二分查找,总体上分两种情况。nums[left]<=nums[mid],else。但是,在截取子序列的时候,有可能得到一个顺序序列。如34512,截取后得到12,此时要对这种情况判断,因为是顺序的,所以,最左边的元素就是最小元素。这点区别于寻找target,因为寻找target是根据target和left,mid,right做比较判断的。所以就不用对这种顺序情况单独讨论了。

 

 1 public int findMin(int[] nums)
 2         {
 3             return findMin(nums, 0, nums.length - 1);
 4         }
 5         //递归
 6         public int findMin(int[] nums, int left, int right)
 7         {
 8             if(left == right)
 9             {
10                 return nums[left];
11             }
12             if(nums[left] < nums[right])//例如34512,在截取子序列时候,很可能就得到一个顺序序列,这时候直接判断。
13             {
14                 return nums[left];
15             }
16             int mid = (left+right)/2;
17             if(nums[left] < nums[mid])
18             {
19                 return findMin(nums, mid+1, right);
20             }
21             else
22             {
23                 return findMin(nums, left, mid);
24             }
25         }
26         
27         //迭代
28         public int findMin2(int[] nums, int left, int right)
29         {
30             while(left <= right)
31             {
32                 if(nums[left] < nums[right])
33                 {
34                     return nums[left];
35                 }
36                 if(left == right)
37                 {
38                     return nums[left];
39                 }
40                 int mid = (left+right)/2;
41                 if(nums[left] <= nums[mid])
42                 {
43                     left = mid + 1;
44                 }
45                 else
46                 {
47                     right = mid;
48                 }
49             }
50             return -1;
51         }

 

posted @ 2016-06-09 15:37  32ddd  阅读(221)  评论(0编辑  收藏  举报