Leetcode Find Minimum in Rotated Sorted Array (python+cpp)

Leetcode Find Minimum in Rotated Sorted Array

  • 题目
  • 解法1:brutal force
  • 解法2:二分法
  • 二刷解法

题目

Leetcode Find Minimum in Rotated Sorted Array (python+cpp)_第1张图片

解法1:brutal force

很惊讶brutal force的O(N)解法居然能过
python代码如下:

class Solution:
    def findMin(self, nums: List[int]) -> int:
        for i in range(1,len(nums)):
            if nums[i]<nums[i-1]:
                return nums[i]
            else:
                continue
        return nums[0]

解法2:二分法

这题只需要改一下二分法的判断条件就可以了
这边注意一下二分法的开写法和闭写法。总体来说,如果while left<=right, 那么mid=left+(right-left)/2。如果while left

具体此题解法如下:

  • 判断mid与左右的关系,如果mid元素比他后一个元素大,证明后面那个元素便是我们要找的最小值;如果mid元素比他前一个元素小,证明当前mid元素为最小值
  • 如果mid元素大于数组第一个元素,那么证明旋转点在mid右遍
  • 反之证明旋转点在mid左边

python代码如下:

class Solution:
    def findMin(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return nums[0]
        l = 0
        r = len(nums)-1
        
        if nums[r]>nums[l]:
            return nums[0]
        
        while l<r:
            mid = (l+r)//2
            if nums[mid]>nums[mid+1]:
                return nums[mid+1]
            if nums[mid]<nums[mid-1]:
                return nums[mid]
            
            if nums[mid]>nums[0]:
                l = mid+1
            else:
                r = mid-1

C++代码如下:

class Solution {
public:
    int findMin(vector<int>& nums) {
        if (nums.size()==1) return nums[0];
        
        int l = 0, r = nums.size()-1;
        
        if (nums[r]>nums[l]) return nums[0];
        
        while (r>l){
            int mid = l+(r-l)/2;
            
            if (nums[mid]>nums[mid+1]) return nums[mid+1];
            if (nums[mid]<nums[mid-1]) return nums[mid];
            
            if (nums[mid]>nums[0]) {
                l = mid+1;
            }else {
                r = mid-1;
            }
        }
        return 0;
    }
};

这边的C++写法要注意一点,因为返回情况都在条件判断里,所以函数结尾的时候不加一个默认返回值会报错。在后面随便加一个int返回值就行,对这题没有影响

二刷解法

实际上上面那种二分法解法,这个二分法本身是写错的。因为判断条件是l但是如果进入了移动右指针这一步,那么这个时候右指针就会变成左指针更左边的一个元素,这样显然是不对的。所以由于整除的这个特性,l = mid+1, 而right=mid而不是mid-1.
上面这种解法提交之所以能过是因为加了中间的判断,没有中间的判断是会出错的。下面写了一种正确的通用解法,当然加上中间的判断还是会快很多的

class Solution {
public:
    int findMin(vector<int>& nums) {
        int n = nums.size();
        int l = 0;
        int r = n-1;
        int mid;
        while(l + 1 <= r){
            mid = l + (r - l) / 2;
            if (nums[mid] > nums.back()){
                l = mid + 1;
            } else{
                r = mid;
            }
        }
        return nums[l];
    }
};

你可能感兴趣的:(Leetcode,二分查找,c++,二分法,leetcode,python)