【力扣每日一题】——统计圆里格点数量

简介: 力扣周赛算法题——统计圆里格点数量

统计圆里格点数量

一、题目描述

给你一个二维整数数组 circles ,其中 circles[i] = [xi, yi, ri] 表示网格上圆心为 (xi, yi) 且半径为 ri 的第 i 个圆,返回出现在 至少一个 圆内的 格点数目 。

注意:

  • 格点 是指整数坐标对应的点。
  • 圆周上的点 也被视为出现在圆内的点。

示例:

image.png

输入:circles = [[2,2,1]]
输出:5
解释:
给定的圆如上图所示。
出现在圆内的格点为 (1, 2)、(2, 1)、(2, 2)、(2, 3) 和 (3, 2),在图中用绿色标识。
像 (1, 1) 和 (1, 3) 这样用红色标识的点,并未出现在圆内。
因此,出现在至少一个圆内的格点数目是 5 。

提示:

  • 1 <= circles.length <= 200
  • circles[i].length == 3
  • 1 <= xi, yi <= 100
  • 1 <= ri <= min(xi, yi)

二、题目分析

这个题思路很简单,因为数据量很小,枚举就可以,但是我看到去重,首先想到的是set集合,然后把点的坐标转化成字符串存入set集合,但是我实现的时候使用的是 x +""+ y

class Solution {
    public int countLatticePoints(int[][] circles) {

        int n = circles.length;
        Set<String> set = new HashSet<>();

        for(int i = 0; i < n;i++){
            //圆心x坐标
            int x = circles[i][0];
            //圆心y坐标
            int y = circles[i][1];
            //半径
            int r = circles[i][2];
          
            
            for(int j = x-r; j <= x+r;j++){
                for(int k = y -r; k<= y+r;k++){
                    int num =  (j-x ) *(j-x)+ (k-y) *(k-y);
                    if(num <= r*r){
                        //存入set集合
                        set.add(j+" "+k);
                    }
                }
            }

        }
       
        return  set.size();
    }
}

然后就开始了 坐牢时间......

[[10,7,3],[5,9,5],[10,4,2],[3,8,2],[2,3,1],[2,10,1],[10,9,8],[6,6,3],[8,6,3],[9,8,7],[9,4,3],[7,4,1],[4,6,2],[4,3,2],[8,3,3]]

这组样例一直过不了,少一个点,然后就一直在想咋会少个点思路没问题啊

周赛结束后看完大佬的代码

  • 直接枚举数据范围所有点,遇到一个点满足题意就跳出循环进行下一个点的判断,这样去重比set高效很多

但是,我还是不明白为啥我写的会少一个点,然后我就在本地测试下,两组代码用list集合存入x +""+ y,然后对集合进行排序输出,终于发现少了一个112

原来这样转字符串 x +""+ y 会造成像(11, 2) 和 (1,12) 最后都是"112" 只需要转成这样的字符串就能解决x +" "+ y,我哭死..........

三、代码实现

class Solution {
    public int countLatticePoints(int[][] circles) {

        int n = circles.length;
        Set<String> set = new HashSet<>();

        for(int i = 0; i < n;i++){
               //圆心x坐标
            int x = circles[i][0];
            //圆心y坐标
            int y = circles[i][1];
            //半径
            int r = circles[i][2];
          
            
            for(int j = x-r; j <= x+r;j++){
                for(int k = y -r; k<= y+r;k++){
                    int num =  (j-x ) *(j-x)+ (k-y) *(k-y);
                    if(num <= r*r){
                        set.add(j+" "+k);
                    }
                }
            }

        }
       
        return  set.size();
    }
}

AC了,但是这运行时间总觉得很高

image.png

唉,还是题解区大佬们给的代码好,枚举都比我这代码效率高

class Solution {
    public int countLatticePoints(int[][] circles) {
        int count=0,n=200,m=200,p=circles.length;
        for(int i = 0;i <= n;i++){
            for(int j = 0;j <= m;j++){
                for(int k = 0 ;k < p;k++){
                    int a=Math.abs(circles[k][0]-i),b=Math.abs(circles[k][1]-j),c=circles[k][2];
                    if(a * a + b * b <= c * c){
                        count++;
                        break;
                    }
                }
            }
        }
        return count;
    }
}

image.png

相关文章
|
6月前
|
算法 测试技术 C#
区间合并|LeetCode2963:统计好分割方案的数目
区间合并|LeetCode2963:统计好分割方案的数目
|
6月前
|
算法 安全 测试技术
[组合数学]LeetCode:2954:统计感冒序列的数目
[组合数学]LeetCode:2954:统计感冒序列的数目
|
6月前
|
算法 测试技术 C#
【离散差分】LeetCode2953:统计完全子字符串
【离散差分】LeetCode2953:统计完全子字符串
|
6月前
leetcode-1220:统计元音字母序列的数目
leetcode-1220:统计元音字母序列的数目
48 0
|
6月前
leetcode-1995. 统计特殊四元组
leetcode-1995. 统计特殊四元组
40 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
45 0
|
4月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
6月前
[leetcode~数位动态规划] 2719. 统计整数数目 hard
[leetcode~数位动态规划] 2719. 统计整数数目 hard
|
6月前
leetcode2376. 统计特殊整数
leetcode2376. 统计特殊整数
54 1