• 时间复杂度为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;
        }
    }
  • 相关阅读:
    leetcode78 Subsets
    leetcode76 Minimum Window Substring
    leetcode73 Set Matrix Zeroes
    leetcode70 Climbing Stairs
    leetcode50 Pow(x, n)
    leetcode49 Group Anagrams
    leetcode48 Rotate Image
    正则表达式及字符处理
    RPM软件包管理.作业
    yum管理RPM包.作业
  • 原文地址:https://www.cnblogs.com/yz-lucky77/p/11193409.html
Copyright © 2020-2023  润新知