• 实数域上的二分查找


       分析:在整个数域范围上二分查找最小磁力的大小

          然后记录这个最小磁力可以在position上放置几个球,根据球的数量与m的大小来决定二分范围

    class Solution {
        public int maxDistance(int[] position, int m) {
            int n = position.length;
            Arrays.sort(position);
            int l = 0, r = position[n-1];
            while(l <= r) { // 整个[l,r]范围上查询
                int mid = l + (r - l) / 2;
                int t = 1, pre = 0;
                for(int i = 1; i < n; i++) {
                    if(position[i] - position[pre] < mid) continue;
                    t++;
                    pre = i;
                }
                if(t >= m) l = mid + 1; // 放多了或者刚好还可能有剩余 距离加大
                else r = mid - 1; // 放少了 距离减小
            }
            return r;
        }
    }

     

    class Solution {
        public int minDays(int[] bloomDay, int m, int k) {
            int n = bloomDay.length;
            if(n < m * k) return -1;
            int l = 1, r = 1000000000;
            while(l <= r) {
                int mid = (l + r) >> 1;
                int constant = 0, sum = 0;
                for(int num : bloomDay) {
                    if(num <= mid) {
                        constant++;
                    } else {
                        constant = 0;
                    }
                    if(constant == k) {
                        constant = 0;
                        sum++;
                    }
                }
                if(sum >= m) {
                    r = mid - 1;
                } else {
                    l = mid + 1;
                }
            }
            return l;
        }
    }

    class Solution {
        public int splitArray(int[] nums, int m) {
            int n = nums.length;
            int l = 0, r = 0;
            for(int num : nums) {
                l = Math.max(l,num);
                r += num;
            }
            while(l <= r) {
                int mid = l + (r - l) / 2;
                int cnt = 1, sum = 0;
                for(int num : nums) {
                    sum += num;
                    if(sum <= mid) continue;
                    cnt++; sum = num;
                }
                if(cnt > m) l = mid + 1;
                else r = mid - 1;
            }
            return l;
        }
    }
  • 相关阅读:
    java多线程调试
    nginx学习网站收录
    eclispe使用
    网站收集
    《TCP/IP详解卷1:协议》——第6章 ICMP:Internet控制报文协议(转载)
    深入理解计算机系统——第12章:用信号量同步线程
    《TCP/IP详解卷1:协议》——第5章 RARP:逆地址解析协议(转载)
    YYHS-Floor it(递推+矩阵乘法+快速幂)
    YYHS-数列
    (转)Tarjan应用
  • 原文地址:https://www.cnblogs.com/yonezu/p/13512567.html
Copyright © 2020-2023  润新知