實數域上的二分查詢
阿新 • • 發佈:2020-08-16
分析:在整個數域範圍上二分查詢最小磁力的大小
然後記錄這個最小磁力可以在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]範圍上查詢 intmid = 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; // 放多了或者剛好還可能有剩餘 距離加大 elser = 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; } }