当前位置:   article > 正文

LeetCode 2251. 花期内花的数目_code2251

code2251

2251. 花期内花的数目

【前缀和+TreeMap+二分】这道题显然是一道前缀和的题,但是我们发现start和end的值非常大,但是区间个数却不多,也就是说过于离散了。那么开一个start到end的数组显然是行不通的,所以我们可以用哈希表来解决这种离散问题。

使用TreeMap来记录<start/end + 1, +1/-1>这样的键值对,由于TreeMap是有序的,所以我们可以直接遍历map的keySet来计算前缀和,查找的时候去查第一个<=查询时间的value可以。

  1. class Solution {
  2. public int binarySearch(int[] arr, int target){
  3. int left = 0, right = arr.length - 1;
  4. while(left <= right){
  5. int mid = (left + right) >>> 1;
  6. if(arr[mid] > target){
  7. right = mid - 1;
  8. }else{
  9. left = mid + 1;
  10. }
  11. }
  12. if(right < 0) return -1;
  13. return arr[right];
  14. }
  15. public int[] fullBloomFlowers(int[][] flowers, int[] persons) {
  16. TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
  17. for(int[] f: flowers){
  18. int start = f[0];
  19. int end = f[1] + 1;
  20. map.put(start, map.getOrDefault(start, 0) + 1);
  21. map.put(end, map.getOrDefault(end, 0) - 1);
  22. }
  23. int pre = 0;
  24. for(var entry: map.entrySet()){
  25. map.put(entry.getKey(), entry.getValue() + pre);
  26. // System.out.println(entry.getKey() + " " + map.get(entry.getKey()));
  27. pre = entry.getValue();
  28. }
  29. int[] keys = new int[map.size()];
  30. int i = 0;
  31. for(var k: map.keySet()) keys[i++] = k;
  32. int[] ans = new int[persons.length];
  33. i = 0;
  34. for(var p: persons){
  35. int key = binarySearch(keys, p);
  36. if(!map.containsKey(key)) ans[i++] = 0;
  37. else ans[i++] = map.get(key);
  38. }
  39. return ans;
  40. }
  41. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/article/detail/50325
推荐阅读
相关标签
  

闽ICP备14008679号