码迷,mamicode.com
首页 > 编程语言 > 详细

【LeetCode-面试算法经典-Java实现】【155-Find Minimum in Rotated Sorted Array II(找旋转数组中的最小数字II)】

时间:2015-08-21 07:09:12      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:数组   查找   面试   算法   java   

【154-Find Minimum in Rotated Sorted Array II(找旋转数组中的最小数字II)】


【LeetCode-面试算法经典-Java实现】【所有题目目录索引】

原题

  Follow up for “Find Minimum in Rotated Sorted Array”:
  What if duplicates are allowed?
  Would this affect the run-time complexity? How and why?
  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.
  The array may contain duplicates.

题目大意

   “查找旋转排序的数组最小值”的后续:允许重复元素,但是两个字数组依然局部有序。

解题思路

  采用类二分搜索算法进行查找

代码实现

算法实现类

public class Solution {

    public int findMin(int[] nums) {
        // 参数校验
        if (nums == null || nums.length < 1) {
            throw new IllegalArgumentException();
        }

        int lo = 0;
        int hi = nums.length - 1;
        int mid = 0;

        // 可以排除数组全局有序的情况
        while (nums[lo] >= nums[hi]) {

            // 如果只有两个元素,返回后一个
            if (hi - lo == 1) {
                mid = hi;
                break;
            }

            mid = lo + ((hi - lo) >> 1);

            if (nums[mid] == nums[lo] && nums[mid] == nums[hi]) {
                // 只能采用顺序搜索方法,不能采用lo++,hi--的方式
                // 因为lo可能是前一个有序数组的最后一个
                // hi也可能是后一个有序数组的第一个
                return sequenceSearch(nums, lo, hi);
            }

            // 如果mid在前一个有序数组中
            if (nums[mid] >= nums[lo]) {
                lo = mid;
            }
            // 如果mid在后一个有序数组中
            else if (nums[mid] <= nums[hi]) {
                hi = mid;
            }

        }


        return nums[mid];
    }

    /**
     * 顺序搜索数组中的最小值,nums是由有序数组按某个轴旋转得来的
     *
     * @param nums  搜索数组
     * @param start 开始位置
     * @param end   结束位置
     * @return 最小值
     */
    public int sequenceSearch(int[] nums, int start, int end) {
        for (int i = start; i < end; i++) {
            if (nums[i] > nums[i + 1]) {
                return nums[i + 1];
            }
        }
        return nums[start];
    }
}

评测结果

  点击图片,鼠标不释放,拖动一段位置,释放后在新的窗口中查看完整图片。

技术分享

特别说明

欢迎转载,转载请注明出处【http://blog.csdn.net/derrantcm/article/details/47828189

版权声明:本文为博主原创文章,未经博主允许不得转载。

【LeetCode-面试算法经典-Java实现】【155-Find Minimum in Rotated Sorted Array II(找旋转数组中的最小数字II)】

标签:数组   查找   面试   算法   java   

原文地址:http://blog.csdn.net/derrantcm/article/details/47828189

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!