zoukankan      html  css  js  c++  java
  • LeetCode Find Minimum In Rotated Sorted Array

    #include <iostream>
    #include <cstdlib>
    #include <vector>
    
    using namespace std;
    // 4 5 1 2
    // 1 2
    class Solution {
    public:
        int findMin(vector<int> &num) {
            int len = num.size();
            if (len < 1) {
                // should not happened;
                return 0;
            }
            if (len == 1) {
                return num[0];
            } 
            int p = 0; 
            int q = len - 1;
            
            // array with no rotation
            if (num[p] < num[q]) {
                return num[p];
            }
            
            // array been rotated
            while (p + 1 < q) {
                int m = (p + q) / 2;
                if (num[m] > num[q]) {
                    p = m;
                } else if (num[m] < num[q]){
                    q = m;
                }
            }
            return num[q];
        }
    };
    
    int main() {
    
        //int arr[] = {4, 5, 6, 7, 0, 1, 2};
        //int arr[] = {1, 2, 3};
        int arr[] = {1, 2};
        //int arr[] = {2, 1};
        vector<int> array(arr, arr + sizeof(arr) / sizeof(int));
        
        Solution s;
        
        cout<<s.findMin(array)<<endl;    
        
        return 0;
    }

    第二轮:

    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.

     1 class Solution {
     2 public:
     3     int findMin(vector<int> &num) {
     4         int n = num.size();
     5         if (n < 1) {
     6             return INT_MIN;
     7         }
     8         if (n == 1) {
     9             return num[0];
    10         }
    11         int m = min(num[0], num.back());
    12         
    13         if (m == num[0]) {
    14             return m;
    15         }
    16         
    17         int p = -1;
    18         int q = n;
    19         while (p + 1 < q) {
    20             int mid = (p + q) / 2;
    21             if (num[mid] > m) {
    22                 p = mid;
    23             }  else {
    24                 q = mid;
    25             }
    26         }
    27         return num[q];
    28     }
    29 };

     上面写的太烦,二分搜索其实对于其实下标的选取还是很有讲究的,因为问题中的解的元素的索引空间就是在0...n-1之间,所以直接令p=0, q=n-1即可。如果是纯粹的二分搜索的话一般是初始为p=0, q=n(其实是用lower_bound的初始),因为元素可能不在0...n-1之间。

     1 class Solution {
     2 public:
     3     int findMin(vector<int>& nums) {
     4         int len = nums.size();
     5         int p = 0, q = len - 1;
     6         while (p < q) {
     7             int mid = (p + q) / 2;
     8             if (nums[mid] > nums[q]) {
     9                 p = mid + 1;
    10             } else {
    11                 q = mid;
    12             }
    13         }
    14         return nums[p];
    15     }
    16 };
  • 相关阅读:
    hdu 1005(找循环节)
    hdu 1452(因子和+逆元)
    hdu 1215(因子和)
    hdu 1492(约数的个数)
    hdu 2136(质数筛选+整数分解)
    HDU 1286 找新朋友
    HDU 2136 Largest prime factor
    HDU 1722 Cake
    HDU 1713 相遇周期
    HDU 2138 How many prime numbers
  • 原文地址:https://www.cnblogs.com/lailailai/p/4104736.html
Copyright © 2011-2022 走看看