1. 程式人生 > 實用技巧 >實數域上的二分查詢

實數域上的二分查詢

  分析:在整個數域範圍上二分查詢最小磁力的大小

      然後記錄這個最小磁力可以在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;
    }
}