• leetcode(c++)(二分查找)


    #include <iostream>
    #include <numeric>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    
    double findMediaSorted(const vector<int>&n1,const vector<int>& n2)
    {
        int m = n1.size(),n = n2.size();
        if(m > n)return findMediaSorted(n2,n1);
        int left = 0, right = m;
        while(left <= right){
            int x = left + (right - left ) / 2;
            int y = (m + n + 1) / 2 - x;
            int xLeft = (x == 0) ? INT_MIN : n1[x-1];
            int xRight = (x == m) ? INT_MAX : n1[x];
            int yLeft = (y == 0) ? INT_MIN : n2[y-1];
            int yRight = (y == n) ? INT_MAX : n2[y];
            if(xLeft <= yRight && yLeft <= xRight)
            {
                if((m + n) % 2 == 0)return (double)(max(xLeft,yLeft), min(xRight,yRight)) / 2.0;
                else return (double)max(xLeft,yLeft);
            }
            else if(xRight > yLeft) right = x - 1;
            else left = x + 1;
        }
        return -1;
    }
    
    bool valid(const vector<int>& nums,int m, int sum)
    {
        int curSum = 0, cnt = 1;
        for(auto num : nums)
        {
            curSum += num;
            if(curSum > sum)
            {
                curSum = num;
                ++cnt;
                if(cnt > m)return false;
            }
        }
        return true;
    }
    
    int binary(const vector<int>& nums,int m, int low,int high)
    {
        while(low <= high)
        {
            int mid = low + (high - low) / 2;
            if(valid(nums,m,mid))high = mid - 1;
            else low = mid + 1;
        }
        return low;
    }
    
    int splitArray(const vector<int>& nums, int m)
    {
        int sum = accumulate(nums.begin(),nums.end(),0);
        int maxVal = *(max_element(nums.begin(),nums.end()));  
        return binary(nums,m,maxVal,sum);
    }
    
    bool check(int x, vector<int>& position,int m)
    {
        int pre = position[0],cnt = 1;
        for(int i = 1; i < position.size(); ++i)
        {
            if(position[i] - pre >= x)
            {
                pre = position[i];
                ++cnt;
            }
        }
        return cnt >= m;
    }
    
    int maxDistance(vector<int>& position,int m)
    {
        sort(position.begin(),position.end());
        int left = 1, right = position.back() - position[0],res = -1;
        while(left <= right)
        {
            int mid = left + (right - left ) / 2;
            if(check(mid,position,m))
            {
                res = mid;
                left = mid + 1;
            }
            else
            {
                right = mid - 1;
            }
        }    
        return res;
    }
    
    int main()
    {
    
        //LeetCode4
        vector<int>nums1{1,3};
        vector<int>nums2{2};
        cout << findMediaSorted(nums1,nums2) << endl;
    
        //LeetCode410
        vector<int> nums{7,2,5,10,8};
        int m = 2;
        cout << splitArray(nums,m) << endl;
    
        //LeetCode1552
        nums = {1,2,3,4,7};
        m = 3;    
        cout << maxDistance(nums,m) << endl;
    
    
        return 0;
    }
  • 相关阅读:
    JS 实现日期信息增加年数,月数,天数
    ROW_NUMBER() OVER函数的基本用法,也可用于去除重复行
    Oracle存储过程返回游标实例详解
    PL/Sql 中创建、调试、调用存储过程
    HTTP 错误 404.13
    oracle查询多行数据合并成一行数据
    C# 实现list=list.OrderBy(q=>q.字段名).ToList(); 按多个字段排序
    [bcc32 Error] ws2def.h(231): E2238 Multiple declaration for 'sockaddr'
    [bcc32 Error] typeinfo.h(154): E2367 Can't inherit RTTI class from non-RTTI base 'exception'
    sql server 语法 MSDN
  • 原文地址:https://www.cnblogs.com/fourmi/p/16252880.html
Copyright © 2020-2023  润新知