基础班 lintcode159&160 - Find Minimum in Rotated Sorted Array- medium

二分法
维持一个查询区间,并不断地按照某种标准对区间进行删减(二分),过程中保证最小值始终处于区间内。当区间缩小到只有两个值时,进行一次比较就可以获得答案。

起始区间即为输入区间,两个端点分别是 start(index = 0) 和 end(index = nums.length - 1)。当前所发现的最小值即为数组的最后一个值。取区间中间值 mid(index = start + (end - start) / 2),比较该值是否小于目前所发现的最小值。
如果小于,说明全数组最小值位于 start 和 mid 之间(包含start和mid),更新目前所发现的最小值
如果大于,说明全数组最小值位于 mid 和 end 之间(包含mid和end)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
你可以想一下如果小于起始数会怎么样
你怎么移动

题目

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.

Notice
You may assume no duplicate exists in the array.

Example

Given [4, 5, 6, 7, 0, 1, 2] return 0

OOXX二分法(find the first X)。特征:相对最后一个数的大小。O:>nums[end]; X: <=nums[end]。

切记要和最后一个数比,不可以和第一个数比,因为和第一个数比在没有rotate过的特殊情况里会找空。

强调一下,因为基础不牢固 int 不是int[] 返回的是一个数值

start 和end是新定义的 所以不用声明起始

public class Solution {
    /*
     * @param nums: a rotated sorted array
     * @return: the minimum number in the array
     */
    public int findMin(int[] nums) {
        // write your code here

        int start = 0;
        int end = nums.length - 1;
        int cmpTarget = nums[end];

        while (start + 1 < end){
            int mid = start + (end - start) / 2;
            if (nums[mid] > cmpTarget){
                start = mid;
            } else {
                end = mid;
            }
        }

        return Math.min(nums[start], nums[end]);
    }
}

lintcode160- Find Minimum in Rotated Sorted Array II- medium
就是最后一点 认为有重复值怎么办

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.

Notice
The array may contain duplicates.

Example
Given [4,4,5,6,7,0,1,2] return 0.

public class Solution {
    /*
     * @param nums: a rotated sorted array
     * @return: the minimum number in the array
     */
    public int findMin(int[] nums) {

        //返回int这里怎么处理?
        if (nums == null || nums.length == 0){
            throw new IllegalArgumentException();
        }

        int start = 0;
        int end = nums.length - 1;

        while (end > 0 && nums[end] == nums[start]){
            end--;
        }

        int cmpTarget = nums[end];

        while (start + 1 < end){
            int mid = start + (end - start) / 2;
            if (nums[mid] > cmpTarget){
                start = mid;
            } else {
                end = mid;
            }
        }

        return Math.min(nums[start], nums[end]);
    }
}
发布了54 篇原创文章 · 获赞 2 · 访问量 718

猜你喜欢

转载自blog.csdn.net/qq_40647378/article/details/104013550