From a4f80ae13fe1283bb44d1bf5dd1f6a137d7e5470 Mon Sep 17 00:00:00 2001 From: huangge1199 Date: Mon, 7 Jun 2021 13:10:07 +0800 Subject: [PATCH] =?UTF-8?q?1865:=E6=89=BE=E5=87=BA=E5=92=8C=E4=B8=BA?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E5=80=BC=E7=9A=84=E4=B8=8B=E6=A0=87=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/FindingPairsWithACertainSum.java | 112 ++++++++++++++++++ .../editor/cn/FindingPairsWithACertainSum.md | 52 ++++++++ 2 files changed, 164 insertions(+) create mode 100644 src/main/java/leetcode/editor/cn/FindingPairsWithACertainSum.java create mode 100644 src/main/java/leetcode/editor/cn/FindingPairsWithACertainSum.md diff --git a/src/main/java/leetcode/editor/cn/FindingPairsWithACertainSum.java b/src/main/java/leetcode/editor/cn/FindingPairsWithACertainSum.java new file mode 100644 index 0000000..7eb1ac6 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/FindingPairsWithACertainSum.java @@ -0,0 +1,112 @@ +//给你两个整数数组 nums1 和 nums2 ,请你实现一个支持下述两类查询的数据结构: +// +// +// 累加 ,将一个正整数加到 nums2 中指定下标对应元素上。 +// 计数 ,统计满足 nums1[i] + nums2[j] 等于指定值的下标对 (i, j) 数目(0 <= i < nums1.length 且 0 <= +// j < nums2.length)。 +// +// +// 实现 FindSumPairs 类: +// +// +// FindSumPairs(int[] nums1, int[] nums2) 使用整数数组 nums1 和 nums2 初始化 FindSumPairs +//对象。 +// void add(int index, int val) 将 val 加到 nums2[index] 上,即,执行 nums2[index] += val +// 。 +// int count(int tot) 返回满足 nums1[i] + nums2[j] == tot 的下标对 (i, j) 数目。 +// +// +// +// +// 示例: +// +// +//输入: +//["FindSumPairs", "count", "add", "count", "count", "add", "add", "count"] +//[[[1, 1, 2, 2, 2, 3], [1, 4, 5, 2, 5, 4]], [7], [3, 2], [8], [4], [0, 1], [1, +//1], [7]] +//输出: +//[null, 8, null, 2, 1, null, null, 11] +// +//解释: +//FindSumPairs findSumPairs = new FindSumPairs([1, 1, 2, 2, 2, 3], [1, 4, 5, 2, +//5, 4]); +//findSumPairs.count(7); // 返回 8 ; 下标对 (2,2), (3,2), (4,2), (2,4), (3,4), (4,4) +// 满足 2 + 5 = 7 ,下标对 (5,1), (5,5) 满足 3 + 4 = 7 +//findSumPairs.add(3, 2); // 此时 nums2 = [1,4,5,4,5,4] +//findSumPairs.count(8); // 返回 2 ;下标对 (5,2), (5,4) 满足 3 + 5 = 8 +//findSumPairs.count(4); // 返回 1 ;下标对 (5,0) 满足 3 + 1 = 4 +//findSumPairs.add(0, 1); // 此时 nums2 = [2,4,5,4,5,4] +//findSumPairs.add(1, 1); // 此时 nums2 = [2,5,5,4,5,4] +//findSumPairs.count(7); // 返回 11 ;下标对 (2,1), (2,2), (2,4), (3,1), (3,2), (3,4) +//, (4,1), (4,2), (4,4) 满足 2 + 5 = 7 ,下标对 (5,3), (5,5) 满足 3 + 4 = 7 +// +// +// +// +// 提示: +// +// +// 1 <= nums1.length <= 1000 +// 1 <= nums2.length <= 105 +// 1 <= nums1[i] <= 109 +// 1 <= nums2[i] <= 105 +// 0 <= index < nums2.length +// 1 <= val <= 105 +// 1 <= tot <= 109 +// 最多调用 add 和 count 函数各 1000 次 +// +// Related Topics 设计 哈希表 Ordered Map +// 👍 9 👎 0 + +package leetcode.editor.cn; + +import java.util.HashMap; +import java.util.Map; + +//1865:找出和为指定值的下标对 +public class FindingPairsWithACertainSum{ + public static void main(String[] args) { + //测试代码 +// Solution solution = new FindingPairsWithACertainSum().new Solution(); + } + //力扣代码 + //leetcode submit region begin(Prohibit modification and deletion) +class FindSumPairs { + + int[] nums1; + int[] nums2; + Map map = new HashMap<>(); + + public FindSumPairs(int[] nums1, int[] nums2) { + this.nums1 = nums1; + this.nums2 = nums2; + for (int i = 0; i < nums2.length; i++) { + map.put(nums2[i], map.getOrDefault(nums2[i], 0) + 1); + } + } + + public void add(int index, int val) { + map.put(nums2[index], map.getOrDefault(nums2[index], 0) - 1); + map.put(nums2[index] + val, map.getOrDefault(nums2[index] + val, 0) + 1); + nums2[index] += val; + } + + public int count(int tot) { + int count = 0; + for (int i = 0; i < nums1.length; i++) { + count += map.getOrDefault(tot - nums1[i], 0); + } + return count; + } +} + +/** + * Your FindSumPairs object will be instantiated and called as such: + * FindSumPairs obj = new FindSumPairs(nums1, nums2); + * obj.add(index,val); + * int param_2 = obj.count(tot); + */ +//leetcode submit region end(Prohibit modification and deletion) + +} \ No newline at end of file diff --git a/src/main/java/leetcode/editor/cn/FindingPairsWithACertainSum.md b/src/main/java/leetcode/editor/cn/FindingPairsWithACertainSum.md new file mode 100644 index 0000000..5eb51f9 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/FindingPairsWithACertainSum.md @@ -0,0 +1,52 @@ +

给你两个整数数组 nums1nums2 ,请你实现一个支持下述两类查询的数据结构:

+ +
    +
  1. 累加 ,将一个正整数加到 nums2 中指定下标对应元素上。
  2. +
  3. 计数 ,统计满足 nums1[i] + nums2[j] 等于指定值的下标对 (i, j) 数目(0 <= i < nums1.length0 <= j < nums2.length)。
  4. +
+ +

实现 FindSumPairs 类:

+ + + +

 

+ +

示例:

+ +
+输入:
+["FindSumPairs", "count", "add", "count", "count", "add", "add", "count"]
+[[[1, 1, 2, 2, 2, 3], [1, 4, 5, 2, 5, 4]], [7], [3, 2], [8], [4], [0, 1], [1, 1], [7]]
+输出:
+[null, 8, null, 2, 1, null, null, 11]
+
+解释:
+FindSumPairs findSumPairs = new FindSumPairs([1, 1, 2, 2, 2, 3], [1, 4, 5, 2, 5, 4]);
+findSumPairs.count(7);  // 返回 8 ; 下标对 (2,2), (3,2), (4,2), (2,4), (3,4), (4,4) 满足 2 + 5 = 7 ,下标对 (5,1), (5,5) 满足 3 + 4 = 7
+findSumPairs.add(3, 2); // 此时 nums2 = [1,4,5,4,5,4]
+findSumPairs.count(8);  // 返回 2 ;下标对 (5,2), (5,4) 满足 3 + 5 = 8
+findSumPairs.count(4);  // 返回 1 ;下标对 (5,0) 满足 3 + 1 = 4
+findSumPairs.add(0, 1); // 此时 nums2 = [2,4,5,4,5,4]
+findSumPairs.add(1, 1); // 此时 nums2 = [2,5,5,4,5,4]
+findSumPairs.count(7);  // 返回 11 ;下标对 (2,1), (2,2), (2,4), (3,1), (3,2), (3,4), (4,1), (4,2), (4,4) 满足 2 + 5 = 7 ,下标对 (5,3), (5,5) 满足 3 + 4 = 7
+
+ +

 

+ +

提示:

+ + +
Related Topics
  • 设计
  • 哈希表
  • Ordered Map
  • \n
  • 👍 9
  • 👎 0
  • \ No newline at end of file