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;
        }
    }
  • 相关阅读:
    Delphi 与 C/C++ 数据类型对照表
    JAVA中堆和栈的区别
    关于Column '*' not found 解决方案 Hibernate使用SQL查询返回实体类型,即返回某个类,或实体类
    Oracle笔记
    oracle时间运算
    struts2中iterator标签的相关使用
    url传中文,转码
    表格的css,细线表格
    使用struts 2 获取服务器数据 ongl表达式 标签
    struts 2 Commons FileUpload文件上传
  • 原文地址:https://www.cnblogs.com/yz-lucky77/p/11193409.html
Copyright © 2011-2022 走看看