zoukankan      html  css  js  c++  java
  • Find Minimum in Rotated Sorted Array(旋转数组的最小数字)

    题目描述:

    Suppose a sorted array is rotated at some pivot unknown to you beforehand.
    
    (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
    
    Find the minimum element.
    
    You may assume no duplicate exists in the array.

      这道题《剑指offer》上有原题,直接上代码

    solution:

    int findMin(vector<int>& nums) {
        int start = 0;
        int end = nums.size() - 1;
        while (start < end)
        {
            if (nums[start] < nums[end])
                break;
            int mid = start + (end - start) / 2;
            if (nums[mid] >= nums[start])
                start = mid + 1;
            else
                end = mid;
        }
        return nums[start];
    }

    参考:https://leetcode.com/discuss/13389/compact-and-clean-c-solution

      上述程序没有考虑数组中存在相同元素这一情况。如果考虑的话,代码需要修改。

    solution:

    int findMin(vector<int>& nums) {
        int start = 0;
        int end = nums.size() - 1;
        while (start < end)
        {
            if (nums[start] < nums[end])
                break;
            int mid = start + (end - start) / 2;
            if (nums[mid] > nums[end])
                start = mid + 1;
            else if (nums[mid] < nums[end])
                end = mid;
            else
            {
                ++start;
                --end;
            }
        }
        return nums[start];
    }

    最后附上一个《剑指offer》上的解法:

    int MinInOrder(vector<int> &nums, int start, int end)
    {
        int min = nums[start];
        for (int i = 1; i < nums.size(); ++i)
        {
            if (nums[i] < min)
                min = nums[i];
        }
        return min;
    }
    
    int findMin(vector<int>& nums) {
        int start = 0;
        int end = nums.size() - 1;
        while (start < end)
        {
            if (nums[start] < nums[end])
                break;
            int mid = start + (end - start) / 2;
    
            if (nums[mid] == nums[start] && nums[mid] == nums[end])
            {
                return MinInOrder(nums, start, end);
            }
            if (nums[mid] >= nums[start])
                start = mid + 1;
            else
                end = mid;
        }
        return nums[start];
    }

    PS:

      《剑指offer》上的解法不一定是最好的!!!

  • 相关阅读:
    4
    3
    2
    JAVA中的Token
    swagger2常用注解说明
    Java SimpleDateFormat 中英文时间格式化转换
    Shiro+Redis实现tomcat集群session共享
    理解并设计rest/restful风格接口
    这一篇比上一遍更形象一点,整合到一起看看还是不错的
    SSM 三大框架---事务处理
  • 原文地址:https://www.cnblogs.com/gattaca/p/4643750.html
Copyright © 2011-2022 走看看