Solution.java 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package weekContest.A399.A3;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. /**
  5. * @see <a href='https://leetcode.cn/problems/find-the-number-of-good-pairs-ii/description/'>100321. 优质数对的总数 II</a>
  6. * @ProjectName: LeetCode
  7. * @FileName: Solution
  8. * @Author: 杨逸
  9. * @Data:2024/5/26 10:26
  10. * @Description:
  11. * 给你两个整数数组 nums1 和 nums2,长度分别为 n 和 m。同时给你一个正整数 k。
  12. *
  13. * 如果 nums1[i] 可以被 nums2[j] * k 整除,则称数对 (i, j) 为 优质数对(0 <= i <= n - 1, 0 <= j <= m - 1)。
  14. *
  15. * 返回 优质数对 的总数。
  16. *
  17. *
  18. *
  19. * 示例 1:
  20. *
  21. * 输入:nums1 = [1,3,4], nums2 = [1,3,4], k = 1
  22. *
  23. * 输出:5
  24. *
  25. * 解释:
  26. *
  27. * 5个优质数对分别是 (0, 0), (1, 0), (1, 1), (2, 0), 和 (2, 2)。
  28. *
  29. * 示例 2:
  30. *
  31. * 输入:nums1 = [1,2,4,12], nums2 = [2,4], k = 3
  32. *
  33. * 输出:2
  34. *
  35. * 解释:
  36. *
  37. * 2个优质数对分别是 (3, 0) 和 (3, 1)。
  38. *
  39. *
  40. *
  41. * 提示:
  42. *
  43. * 1 <= n, m <= 105
  44. * 1 <= nums1[i], nums2[j] <= 106
  45. * 1 <= k <= 103
  46. */
  47. public class Solution {
  48. public long numberOfPairs(int[] nums1, int[] nums2, int k) {
  49. //同时能整除k和nums[j],才能整除k*nums[j]
  50. long result = 0;
  51. HashMap<Integer, Integer> map1 = new HashMap<>();
  52. HashMap<Integer, Integer> map2 = new HashMap<>();
  53. HashMap<Integer, Integer> map3 = new HashMap<>();
  54. //筛选能整除k的nums[i]
  55. ArrayList<Integer> list = new ArrayList<>();
  56. for (int v : nums1) {
  57. if (v%k==0)list.add(v);
  58. }
  59. for (Integer v : list) {
  60. map1.put(v, map1.getOrDefault(v, 0) + 1);
  61. }
  62. for (int v : nums2) {
  63. v = v*k;
  64. //map2.put(v, map2.getOrDefault(v, 0) + 1);
  65. if (v%2!=0){
  66. //奇数
  67. map2.put(v, map2.getOrDefault(v, 0) + 1);
  68. }else {
  69. //偶数
  70. map3.put(v, map3.getOrDefault(v, 0) + 1);
  71. }
  72. }
  73. for (Integer v1 : map1.keySet()) {
  74. //for (Integer v2 : map2.keySet()) {
  75. // if (v1%v2==0)result+=(map1.get(v1)*map2.get(v2));
  76. //}
  77. if (v1%2!=0){
  78. //奇数
  79. for (Integer v2 : map2.keySet()) {
  80. if (v1%v2==0)result+=(map1.get(v1)*map2.get(v2));
  81. }
  82. //特殊的5和1
  83. if (v1%5==0){
  84. for (Integer v2 : map3.keySet()) {
  85. if (v1%v2==0)result+=(map1.get(v1)*map3.get(v2));
  86. }
  87. }
  88. }else {
  89. //偶数
  90. for (Integer v2 : map3.keySet()) {
  91. if (v1%v2==0)result+=(map1.get(v1)*map3.get(v2));
  92. }
  93. //特殊的1
  94. Integer aDefault = map2.getOrDefault(1, 0);
  95. if (aDefault !=0){
  96. for (Integer integer : map1.keySet()) {
  97. if (integer%2==0)result+=aDefault*map1.get(integer);
  98. }
  99. }
  100. }
  101. }
  102. return result;
  103. }
  104. }