LeetCode算法学习之寻找排序数组中的最小值
完整代码实现:
class Solution {public int findMin(int[] nums) {// Arrays.sort(nums);// return nums[0];//二分查找算法int left = 0;int right = nums.length - 1;while(left < right){int mid = left + (right - left)/2;if(nums[mid] > nums[right]){left = mid + 1;//说明最小值在右边部分}else{right = mid;  //说明最小值在左边部分}}return nums[left];}
}算法思路(二分查找)
由于数组是旋转过的升序数组,它仍然具有部分有序的特性,可以利用二分查找高效地找到最小值。
关键观察
1. 旋转后的数组结构:
可以分成两个部分:
 左半部分:较大的元素,仍然保持升序(如 [4,5,6,7])。
右半部分:较小的元素,仍然保持升序(如 [0,1,2])。
最小值位于右半部分的第一个元素(即旋转点)。
2. 二分查找策略:
比较 nums[mid] 和 nums[right]:
如果 nums[mid] > nums[right],说明 mid 在左半部分,最小值在右侧(mid + 1 到 right)。
否则,mid 在右半部分,最小值在左侧(left 到 mid)。
算法步骤
1. 初始化:
left = 0,right = nums.length - 1。
2. 循环条件:
当 left < right 时,继续搜索。
3. 计算中点:
mid = left + (right - left) / 2(防止整数溢出)。
4. 比较 nums[mid] 和 nums[right]:
如果 nums[mid] > nums[right]:
最小值在右侧,移动 left = mid + 1。
否则:
最小值在左侧或 mid 本身,移动 right = mid。
5. 终止条件:
当 left == right 时,循环结束,nums[left] 即为最小值。
