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》上的解法不一定是最好的!!!

  • 相关阅读:
    FTP登录 下载上传文件(太过简单暂时未写)
    依据文档批次命名图片
    UDP协议
    tcp协议(三次握手 四次挥手)
    1956年人工智能元年,而今天是我进入人工智能的日子,哈哈哈
    对比文件简易代码
    爬取网站内容,存放到excel中
    Redis-Py 使用
    python list减法
    sort 使用key函数时,赋多个排序参数
  • 原文地址:https://www.cnblogs.com/gattaca/p/4643750.html
Copyright © 2011-2022 走看看