leetcode寻找旋转排序数组中的最小元素

1.暴力法

遍历求最小值

class Solution {
public:
    int findMin(vector<int>& nums) {
        int imin=nums[0];
         for(int i=1;i<nums.size();i++)
           imin=min(imin,nums[i]);
         return imin;
    }
};

2.二分法

主要考虑的是存在重复元素

旋转后整体元素有两种情况:

全部升序

一部分升序+一部分升序

由于存在重复元素,故这里的升序并不是严格升序

重点考虑的是nums[mid]==nums[right]是,此时最小值在左还是在右不确定,但是由于两者相等,故right指向的元素不再需要,故right--

如3 3 1 3

1 3 3 3

代码如下:

class Solution {
public:
    int findMin(vector<int>& nums) {
        //考虑如何去重
      int left=0,right=nums.size()-1;
      while(left<right)
      {
          int mid=left+(right-left)/2;
          if(nums[mid]<nums[right])
            right=mid;
         else if(nums[mid]>nums[right])
           left=mid+1;
         else if(nums[mid]==nums[right])
           right--;//最小值可能在左,也可能在右,但right指向的元素不需要了,即使nums[right]是最小值,前面还有一个nums[mid]
      }
      return nums[right];
    }
};
发布了219 篇原创文章 · 获赞 3 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_38196982/article/details/105023746