154. 寻找旋转排序数组中的最小值 II
* 扫描一遍
```
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]
```
- 点赞
- 收藏
- 关注作者
评论(0)