题目

类型:设计
image.png

解题思路

对于 add 操作,我们可以使用「哈希表 套 哈希表」的方式,以 {x, {y : 点 (x,y) 数量}} 的形式对传入点进行存储。

对于 count 查询而言,假定传入的点为 (x, y)(x,y),我们可以先查询 xx 行都有哪些列,枚举这些列( 即枚举点 (x, ny) ),由 y 和 ny 可得正方形边长 len,此时再检查唯一确定的两点 (x±len,y) 和 (x±len,ny) 的出现次数,应用乘法原理,即可知道该正方形的方案数,统计所有合法方案数即是该询问的答案。

利用题目范围给定的 x 和 y 具有明确的范围 0 <= x, y <= 1000,我们可以使用数组充当哈希表,但是为了拓展性和减少边界判断,即支持将平面拓展到任意大小,最好还是直接使用哈希表。

代码

  1. class DetectSquares {
  2. Map<Integer, Map<Integer, Integer>> row2Col = new HashMap<>();
  3. public void add(int[] point) {
  4. int x = point[0], y = point[1];
  5. Map<Integer, Integer> col2Cnt = row2Col.getOrDefault(x, new HashMap<>());
  6. col2Cnt.put(y, col2Cnt.getOrDefault(y, 0) + 1);
  7. row2Col.put(x, col2Cnt);
  8. }
  9. public int count(int[] point) {
  10. int x = point[0], y = point[1];
  11. int ans = 0;
  12. Map<Integer, Integer> col2Cnt = row2Col.getOrDefault(x, new HashMap<>());
  13. for (int ny : col2Cnt.keySet()) {
  14. if (ny == y) continue;
  15. int c1 = col2Cnt.get(ny);
  16. int len = y - ny;
  17. int[] nums = new int[]{x + len, x - len};
  18. for (int nx : nums) {
  19. Map<Integer, Integer> temp = row2Col.getOrDefault(nx, new HashMap<>());
  20. int c2 = temp.getOrDefault(y, 0), c3 = temp.getOrDefault(ny, 0);
  21. ans += c1 * c2 * c3;
  22. }
  23. }
  24. return ans;
  25. }
  26. }