力扣第290场周赛

简介: 第一题:给你一个二维整数数组 nums ,其中 nums[i] 是由 不同 正整数组成的一个非空数组,按 升序排列 返回一个数组,数组中 的每个元素在 nums 所有数组 中都出现过。

第一题:

给你一个二维整数数组 nums ,其中 nums[i] 是由 不同 正整数组成的一个非空数组,按 升序排列 返回一个数组,数组中 
的每个元素在 nums 所有数组 中都出现过。
示例 1:
输入:nums = [[3,1,2,4,5],[1,2,3,4],[3,4,5,6]]
输出:[3,4]
解释:
nums[0] = [3,1,2,4,5],nums[1] = [1,2,3,4],nums[2] = [3,4,5,6],在 nums 中每个数组中都出现的数字是 3 和 
4 ,所以返回 [3,4] 。
示例 2:
输入:nums = [[1,2,3],[4,5,6]]
输出:[]
解释:
不存在同时出现在 nums[0] 和 nums[1] 的整数,所以返回一个空列表 [] 。
提示:
1 <= nums.length <= 1000
1 <= sum(nums[i].length) <= 1000
1 <= nums[i][j] <= 1000
nums[i] 中的所有值 互不相同

分析:

这道题不难,思路就是:便利数组中的每个数组,进行计数,个数是大数组长 
度的就满足条件,进行输出就可以啦。

代码实现:

class Solution {
public:
vector<int> intersection(vector<vector<int>>& nums) {
map<int,int > arr;
vector<int> ans;
for(int i=0;i<nums.size();i++)
    {
for(auto aa:nums[i])
        {
            arr[aa]++;
        }
    }
for(auto it  = arr.begin();it!= arr.end();++it)
     {
if(it->second==nums.size())
         {
             ans.push_back(it->first);
         }
     }
return ans;
    }
};

第二题

给你一个二维整数数组 circles ,其中 circles[i] = [xi, yi, ri] 表示网格上圆心为 (xi, yi) 且半径为 ri 的第 i 
个圆,返回出现在 至少一个 圆内的 格点数目 。
注意:
格点 是指整数坐标对应的点。
圆周上的点 也被视为出现在圆内的点。
示例 1:
输入:circles = [[2,2,1]]
输出:5
解释:
给定的圆如上图所示。
出现在圆内的格点为 (1, 2)、(2, 1)、(2, 2)、(2, 3) 和 (3, 2),在图中用绿色标识。
像 (1, 1) 和 (1, 3) 这样用红色标识的点,并未出现在圆内。
因此,出现在至少一个圆内的格点数目是 5 。
示例 2:
输入:circles = [[2,2,2],[3,4,1]]
输出:16
解释:
给定的圆如上图所示。
共有 16 个格点出现在至少一个圆内。
其中部分点的坐标是 (0, 2)、(2, 0)、(2, 4)、(3, 2) 和 (4, 4) 。
提示:
1 <= circles.length <= 200
circles[i].length == 3
1 <= xi, yi <= 100
1 <= ri <= min(xi, yi)

分析:

这道题就是很简单的暴力求解,题目描述分析一下知道,有效整数点的个数 
为0--200,很小。但是只通过暴力的话,时间可能会超时,这时就要进行 
优化。

优化:

注意到题目数据中半径的最大值是坐标值的最小值。这样可以不用枚举那么多的点数,从而减少时间复杂度。

代码实现:(优化后)

class Solution {
public:
int countLatticePoints(vector<vector<int>>& circles) {
int ans=0,mx=0;
for(auto &aa:circles)    //此处的循环就是找到比较小的测试范围。
    {
        mx=max(mx,max(aa[0],aa[1]));
    }
    mx=mx*2;
for(int i=0;i<=mx;i++)   //通过三层循环进行便利
    {
for(int j=0;j<=mx;j++)
        {
for(auto &sd:circles)
            {
int a=i-sd[0];
int b=j-sd[1];
int c=sd[2];
if(a*a+b*b<=c*c)
                {
                    ans++;
break;       //注意这个break,这里非常的细节,因为题目中说至少存在一个圆内,所以只要
                }                   //满足一个就退出这一层循环,进行下一个点的判断。
            }
        }
    }
return ans;
    }
};
目录
相关文章
|
6月前
|
Go
golang力扣leetcode 第 291 场周赛
golang力扣leetcode 第 291 场周赛
63 0
|
6月前
|
Go vr&ar
golang力扣leetcode 第 288 场周赛
golang力扣leetcode 第 288 场周赛
54 0
|
6月前
|
Go
golang力扣leetcode 第 286 场周赛
golang力扣leetcode 第 286 场周赛
59 0
|
算法 Android开发
LeetCode 周赛上分之旅 #48 一道简单的树上动态规划问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
66 1
|
6月前
|
Go
golang力扣leetcode第 294 场周赛
golang力扣leetcode第 294 场周赛
55 0
|
6月前
|
算法 Java Go
golang力扣leetcode 第 293 场周赛
golang力扣leetcode 第 293 场周赛
82 0
|
6月前
|
Go
golang力扣leetcode 第 290 场周赛
golang力扣leetcode 第 290 场周赛
52 0
|
6月前
|
Go C++
golang力扣leetcode 第 284 场周赛
golang力扣leetcode 第 284 场周赛
59 0
|
6月前
|
Go
golang力扣leetcode 第 292 场周赛
golang力扣leetcode 第 292 场周赛
68 0
|
6月前
|
存储
Leetcode第383场周赛
在LeetCode第383场周赛中,选手完成了3道题目。第一题是关于边界上的蚂蚁,蚂蚁根据非零整数数组nums的值移动,返回蚂蚁返回边界上的次数。解题方法是计算数组累加和为0的次数。第二题涉及计算网格的区域平均强度,给定一个灰度图像和阈值,返回每个像素所属区域的平均强度。解题关键在于理解相邻像素和区域定义,并计算平均强度。第三题是恢复单词初始状态的最短时间问题,通过移除前k个字符并添加k个字符,求恢复原词所需的最短时间。解题策略是检查去除前k个字符后的子串是否能作为原词的前缀。
34 1
Leetcode第383场周赛