LeetCode 每日一题笔记 日期:2026.05.15 题目:153. 寻找旋转排序数组中的最小值
LeetCode 每日一题笔记0. 前言日期2026.05.15题目153. 寻找旋转排序数组中的最小值难度中等标签数组、二分查找1. 题目理解问题描述给定一个无重复元素的升序数组经过1~n次旋转后找出并返回数组中的最小元素。要求时间复杂度为O(logn)O(\log n)O(logn)。示例输入nums [3,4,5,1,2]输出1解释原数组为 [1,2,3,4,5]旋转3次得到输入数组最小值为1。输入nums [4,5,6,7,0,1,2]输出0解释原数组为 [0,1,2,4,5,6,7]旋转4次得到输入数组最小值为0。2. 解题思路核心观察旋转后的数组可分为两个有序子数组最小值就是右半部分的第一个元素利用二分查找通过比较arr[mid]和arr[right]判断最小值所在区间arr[mid] arr[right]说明最小值在 mid 的右侧含 mid1arr[mid] arr[right]说明最小值在 mid 的左侧含 mid。算法步骤初始化左右指针left 0right nums.length - 1循环直到left right计算mid left (right - left) / 2比较arr[mid]与arr[right]移动指针缩小范围返回nums[left]或nums[right]即为最小值。3. 代码实现packagelc153;classSolution{intbinary(int[]arr,intleft,intright){while(left!right){intmidleft(right-left)/2;if(arr[mid]arr[right]){leftmid1;}else{rightmid;}}returnarr[left];}publicintfindMin(int[]nums){returnbinary(nums,0,nums.length-1);}}4. 代码优化说明减少分支判断直接将逻辑合并到主函数中去掉单独的binary方法packagelc153;classSolution{publicintfindMin(int[]nums){intleft0,rightnums.length-1;while(leftright){intmidleft(right-left)/2;if(nums[mid]nums[right]){leftmid1;}else{rightmid;}}returnnums[left];}}5. 复杂度分析时间复杂度O(logn)O(\log n)O(logn)二分查找每次将区间减半最多执行log2n\log_2 nlog2n次循环。空间复杂度O(1)O(1)O(1)仅使用常数级额外变量无递归栈或额外数组开销。6. 总结核心思路二分查找利用旋转数组的局部有序性定位最小值关键判断通过arr[mid]与arr[right]的大小关系快速确定最小值所在区间优化后代码逻辑更紧凑去掉了不必要的方法调用可读性和效率更高。