leetcode刷题笔记一百五十三题与一百五十四题 寻找旋转排序数组中的最小值 I与 II

leetcode刷题笔记一百五十三题与一百五十四题 寻找旋转排序数组中的最小值 I与 II

源地址:

153. 寻找旋转排序数组中的最小值

154. 寻找旋转排序数组中的最小值 II

问题描述:

153题问题描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

请找出其中最小的元素。

你可以假设数组中不存在重复元素。

示例 1:

输入: [3,4,5,1,2]
输出: 1
示例 2:

输入: [4,5,6,7,0,1,2]
输出: 0

154题问题描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

请找出其中最小的元素。

注意数组中可能存在重复的元素。

示例 1:

输入: [1,3,5]
输出: 1
示例 2:

输入: [2,2,2,0,1]
输出: 0

//使用二分法进行处理 由于旋转数组原先为有序 left < mid < right 
//进行旋转后, 当 right < mid时 则旋转点位于右侧区间,否则位于左侧区间

// 153题解法
object Solution {
    def findMin(nums: Array[Int]): Int = {
        var left = 0
        var right = nums.length - 1

        while (left < right) {
            val mid = (left + right)/2
            if (nums(right) < nums(mid)) left = mid + 1
            else right = mid
        }

        return nums(left)
    }
}

//154题解法
//154题较153题主要区别在于存在重复值,当对比两值相等,无法判断旋转点区间位于左侧还是右侧,故需要移动右侧指针位置,直到两者不相等
object Solution {
    def findMin(nums: Array[Int]): Int = {
        var left = 0
        var right = nums.length - 1

        while (left < right) {
            val mid = (left + right) / 2
            if (nums(mid) > nums(right)) left = mid + 1
            else if (nums(mid) < nums(right)) right = mid
            else right -= 1
        }
        return nums(left)
    }
}
posted @ 2020-09-02 14:36  ganshuoos  阅读(119)  评论(0编辑  收藏  举报