zoukankan      html  css  js  c++  java
  • 时间复杂度为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;
        }
    }
  • 相关阅读:
    c#数组
    微软原版SQL Helper
    CROSS APPLY和 OUTER APPLY 区别详解
    Excel 开发备忘
    ZPL打印机公用代码
    SQL SERVER 索引维护
    C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)
    ZPL打印机命令解释
    在x64平台上调试依赖于x86的WCF服务
    SQL 行转列的两种做法
  • 原文地址:https://www.cnblogs.com/yz-lucky77/p/11193409.html
Copyright © 2011-2022 走看看