- 扫描一遍
class Solution { public int findMin(int[] nums) { int n =nums[0] ; for(int i = 1 ; i< nums.length;i++) { if(n>nums[i]) n = nums[i]; } return n; } }
- 扫描方法改进 找出通过旋转的条件可得 旋转点前是小一点数 旋转点后的数是大一点的数
class Solution { public static int findMin(int[] nums) { int n = nums.length ; int flag = nums[n-1]; for(int i = 0 ; i < n ; i++){ if(nums[i]<flag) return nums[i]; } return flag; } }
- 二分 相比于前一道题 增加了多个相同的数
class Solution { public static int findMin(int[] nums) { int l = 0; int r = nums.length-1 ; while(l<r){ int mid = (l+r)/2; if(nums[l]<nums[r]) return nums[l]; if(nums[mid]>nums[r]) l = mid+1; //而且mid不是最小值 [3,1,3] 0.5变为0 无法使mid变化 导致一直储在原地 else if(nums[mid]<nums[l]) r = mid; else r--;//避免了重复陷入死循环 而且最小值相对储在中间位置 } return nums[l]; } } //[3,1,3] //[1,1] //[1,3,5] //[2,2,2,0,1] //[2,0,0,0,1,2]