1.

6041. 多个数组求交集
image.png

  1. class Solution {
  2. public List<Integer> intersection(int[][] nums) {
  3. List<Integer> list = new ArrayList<>();
  4. int[] res = new int[1001];
  5. for(int[] num:nums){
  6. for(int i=0;i<num.length;i++){
  7. res[num[i]]++;
  8. }
  9. }
  10. for(int i=0;i<res.length;i++){
  11. if(res[i]==nums.length){
  12. list.add(i);
  13. }
  14. }
  15. return list;
  16. }
  17. }

2.

6042. 统计圆内格点数目
模拟,圆包括的最大范围内
image.png
image.png

  1. class Solution {
  2. public int countLatticePoints(int[][] circles) {
  3. int maxX = 0, maxY = 0, minX = Integer.MAX_VALUE, minY = Integer.MAX_VALUE;
  4. for (int[] c : circles) {
  5. minX = Math.min(minX, c[0] - c[2]);
  6. minY = Math.min(minY, c[1] - c[2]);
  7. maxX = Math.max(maxX, c[0] + c[2]);
  8. maxY = Math.max(maxY, c[1] + c[2]);
  9. }
  10. int res = 0;
  11. for (int i = minX; i <= maxX; i++) {
  12. for (int j = minY; j <= maxY; j++) {
  13. for (int[] c : circles) {
  14. int tmp = (i - c[0]) * (i - c[0]) + (j - c[1]) * (j - c[1]);
  15. if (tmp <= c[2] * c[2]) {
  16. res++;
  17. break;
  18. }
  19. }
  20. }
  21. }
  22. return res;
  23. }
  24. }

3

6043. 统计包含每个点的矩形数目
image.pngimage.png

  1. class Solution {
  2. public int[] countRectangles(int[][] rectangles, int[][] points) {
  3. //哈希表key为高度,List为宽度的集合。
  4. HashMap<Integer, List<Integer>> map = new HashMap<>();
  5. for (int[] rectangle : rectangles) {
  6. int l = rectangle[0];
  7. int h = rectangle[1];
  8. List<Integer> list = map.getOrDefault(h, new ArrayList<>());
  9. list.add(l);
  10. map.put(h, list);
  11. }
  12. //由于需要对宽度的列表使用二分法,所以需要排序。
  13. for (int key : map.keySet()) {
  14. Collections.sort(map.get(key));
  15. }
  16. int[] ans = new int[points.length];
  17. for (int i = 0; i < points.length; i++) {
  18. int[] p = points[i];
  19. int x = p[0];
  20. int y = p[1];
  21. int count = 0;
  22. //本题重点,枚举可能的高度,并找到当前高度下,合法的矩形数量。
  23. for (int h = 100; h >= 1; h--) {
  24. //枚举高度已经比point的高度还小了,不可能再找到合法矩形了。
  25. if (h < y) break;
  26. //不存在以当前h为高度的矩形,跳过。
  27. if (!map.containsKey(h)) continue;
  28. //二分搜索,并累加答案
  29. count += binarySearch(map.get(h), x);
  30. }
  31. ans[i] = count;
  32. }
  33. return ans;
  34. }
  35. public int binarySearch(List<Integer> nums, int k) {
  36. //二分法找nums中有多少元素大于等于k。
  37. int n = nums.size();
  38. int left = 0;
  39. int right = n - 1;
  40. while (left < right) {
  41. int mid = left + (right - left) / 2;
  42. if (nums.get(mid) >= k) {
  43. right = mid;
  44. } else {
  45. left = mid + 1;
  46. }
  47. }
  48. return nums.get(right) >= k ? n - right : 0;
  49. }
  50. }

4

6044. 花期内花的数目
image.pngimage.png

  1. class Solution {
  2. public int[] fullBloomFlowers(int[][] flowers, int[] persons) {
  3. List<Integer> in = new ArrayList<>();
  4. List<Integer> out = new ArrayList<>();
  5. for (int[] f : flowers) {
  6. in.add(f[0]);
  7. out.add(f[1]);
  8. }
  9. in.sort((o1, o2) -> o1 - o2);
  10. out.sort((o1, o2) -> o1 - o2);
  11. int[] res = new int[persons.length];
  12. for (int i = 0; i < persons.length; i++) {
  13. int left = 0,right=in.size()-1;
  14. int cnt = 0;
  15. //计算开花数量
  16. while(left<right){
  17. int mid = left+(right-left+1)/2;
  18. if(in.get(mid)>persons[i]){
  19. right = mid-1;
  20. }else{
  21. left = mid;
  22. }
  23. }
  24. if(in.get(left)<=persons[i]){
  25. cnt+=(left+1);
  26. }
  27. //计算凋谢数量
  28. left = 0;
  29. right = out.size()-1;
  30. while(left<right){
  31. int mid = left+(right-left+1)/2;
  32. if(out.get(mid)>=persons[i]){
  33. right = mid-1;
  34. }else{
  35. left = mid;
  36. }
  37. }
  38. if(out.get(left)<persons[i]){
  39. cnt-=(left+1);
  40. }
  41. res[i] = cnt;
  42. }
  43. return res;
  44. }
  45. }