leetcode刷题笔记一百五十三题与一百五十四题 寻找旋转排序数组中的最小值 I与 II
leetcode刷题笔记一百五十三题与一百五十四题 寻找旋转排序数组中的最小值 I与 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]
输出: 0154题问题描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [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)
}
}