時間復雜度為O(logn)&O(log(m+n))


Olog(n) 折半查找,歐幾里得算法,冪運算。

折半查找

int binary_search(int a[], int x)
{

//折半查找默認數組已經排序
    int low = 0, high = a.length() - 1;
    while (low <= high)
    {
        int mid = (low + high) / 2;
        if (a[mid] < x)
            low = mid + 1;
        else if (a[mid] > x)
            high = mid - 1;
        else
            return mid;
    }
    return -1;
}

歐幾里得算法求最大公因數

int gcd(int m, int n)
{
    //m>n
    while (n != 0)
    {
        int yu = m % n;
        m = n;
        n = yu;
    }
    return m;
}

冪運算

int pow_m(int x, int y)
{
    //x的y次
    if (y == 0)
        return 1;
    if (y == 1)
        return x;
    if (y % 2 == 0)
        return pow_m(x*x, y / 2);
    if (y % 2 == 1)
        return x * pow_m(x*x, y / 2);
}

O(log(m+n))  歸並排序

float median(vector<int>& nums1,vector<int>& nums2 )
{
    int x1 = nums1.size();
    int x2 = nums2.size();
    if (nums1.empty())
    {
        if (nums2.size() % 2 == 0)
            return (nums2[x2 / 2] + nums2[x2 / 2 - 1]) / 2;
        if (nums2.size() % 2 != 0)
            return nums2[x2 / 2];
    }
    if (nums2.empty())
    {
        if (nums1.size() % 2 == 0)
            return (nums1[x1 / 2] + nums2[x1 / 2 - 1]) / 2;
        if (nums1.size() % 2 != 0)
            return nums1[x1 / 2];
    }
    //歸並排序
    vector<int>c;
    int i, j, k;//分別為nums1,nums2,c的下標
    for (i = 0, j = 0; i < x1&&j < x2;)
    {
        if (nums1[i] < nums2[j])
        {
            c.push_back(nums1[i]);
            i++;
        }
        else
            c.push_back(nums2[j++]);
    }
    while (i < x1)
    {
        c.push_back(nums1[i++]);
    }
    while (j < x2)
    {
        c.push_back(nums2[j++]);
    }
    int k = c.size();
    if (k% 2 == 0)
        return (c[k / 2] + nums2[k - 1]) / 2;
    if (k % 2 != 0)
        return nums1[k / 2];
//歸並排序,順便求了中位數
}

 二分查找數組中小於等於某個數的最大的數:

int binary_up_bound(long long a[], int low, int high, long long key)
{
    while (low < high)
    {
        int mid = (low + high + 1) / 2;
        if (a[mid] > key)
        {
            high = mid - 1;
        }
        else
        {    //a[mid] <= key
            low = mid;
        }
    }
    if (a[low] <= key)
    {
        return low;
    }
    else
    {
        return -1;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM