zoukankan      html  css  js  c++  java
  • leetcode1552题解【二分+贪心】

    leetcode1552.两球之间的磁力

    题目链接

    算法

    二分+贪心

    时间复杂度O(nlogn + nlogm)

    1.根据题意描述,我们需要将m个球放入到n个篮子中,根据题目中数据范围描述发现m <= n,故可以将一个球放入到一个篮子中。这道题主要就是要求出相邻的两个球之间的距离的最小值,而且要尽可能的让这个最小值最大化

    2.分析完了题意,下面来分析一下如何解题。刚开始的思路是首先排序,然后将第一个球放到数组的第一个位置,然后根据剩余的球的个数枚举球的位置。但因为还需要记录相邻两个球的距离差,如果这样纯暴力的话写起来太过于繁琐,并且耗时大,最终该思路未果。在搜索了大佬们的解题思路后,了解到可以使用二分思想来对磁力进行二分,具体思路如下。

    3.对于一些球,它们之间磁力的最大值是poisiton数组中元素的最大值减去最小值(这里先不考虑球的个数),那么我们就可以确定了磁力的区间范围[l,r],然后将[l,r]划分为[l,mid-1][mid,r],为什么要这样划分呢,因为题目中说了要最大化最小磁力,所以我们要尽可能的使得mid更大。划分条件就是判断position数组是否能够找到m个篮子使得它能够满足相邻的两个球之间的距离大于等于mid,如果满足,则l=mid,否则r=mid-1

    4.为了使得最小磁力最大化,我们可以使其中一个球位于最左边的那个篮子里,然后再以此枚举球的位置,使得相邻的两个球的距离大于等于mid。

    5.由此,这道题的总体思路是:先排序,然后二分。

    C++代码

    class Solution {
    public:
        int maxDistance(vector<int>& position, int m) {
            sort(position.begin(), position.end());
            int len = position.size();
            int l = 1, r = position[len - 1] - position[0];
            while(l < r){
                int mid = l + r + 1>> 1;
                if(check(mid, position, m))
                    l = mid;
                else
                    r = mid - 1;
            }
            return l;
        }
        bool check(int k, vector<int>& position, int m){
            int len = position.size();
            int last = position[0];         //last用于记录上一个存放球的篮子的位置
            int t = 1;             //记录已经放入到篮子的球的个数
            for(int i = 1; i < len; i++){
                if(position[i] - last >= k){
                    ++t;
                    last = position[i];
                    if(t == m) return true;
                }
            }
            return false;
        }
    };
    

    这道题使用的二分模板来源于yxc大佬的二分查找算法模板

  • 相关阅读:
    龙年新作:水印文字添加工具源码摘要
    C语言关键字 浪里白条:goto
    继续聊WPF——自定义命令
    CSS3新的鼠标样式介绍
    C语言深入理解 常量与变量
    XCode 4 不能运行的解决办法
    Runtime专题:详解IOS开发应用之并发Dispatch Queues
    C语言关键字 乱世枭雄:static与extern
    一步步带你做vue后台管理框架(一)——介绍框架
    怎么在谷歌浏览器中安装.crx扩展名的离线Chrome插件?
  • 原文地址:https://www.cnblogs.com/KeepZ/p/13721495.html
Copyright © 2011-2022 走看看