持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第33天,点击查看活动详情
6226. 摧毁一系列目标 - 力扣(LeetCode)
难度中等6收藏分享切换为英文接收动态反馈
给你一个下标从 0 开始的数组 nums ,它包含若干正整数,表示数轴上你需要摧毁的目标所在的位置。同时给你一个整数 space 。
你有一台机器可以摧毁目标。给机器 输入 nums[i] ,这台机器会摧毁所有位置在 nums[i] + c * space 的目标,其中 c 是任意非负整数。你想摧毁 nums 中 尽可能多 的目标。
请你返回在摧毁数目最多的前提下,nums[i] 的 最小值 。
示例 1:
输入:nums = [3,7,8,1,1,5], space = 2
输出:1
解释:如果我们输入 nums[3] ,我们可以摧毁位于 1,3,5,7,9,... 这些位置的目标。
这种情况下, 我们总共可以摧毁 5 个目标(除了 nums[2])。
没有办法摧毁多于 5 个目标,所以我们返回 nums[3] 。
示例 2:
输入:nums = [1,3,5,2,4,6], space = 2
输出:1
解释:输入 nums[0] 或者 nums[3] 都会摧毁 3 个目标。
没有办法摧毁多于 3 个目标。
由于 nums[0] 是最小的可以摧毁 3 个目标的整数,所以我们返回 1 。
提示:
1 <= nums.length <= 1051 <= nums[i] <= 1091 <= space <= 109
问题解析
当选了nums[i]后,nums[i]+space*1、nums[i]+space *2等都能被摧毁,这些位置的共同点就是%space后的余数都相等。
那么我们用哈希表记录下nums[i]%space的出现次数,同时记录下nums[i]%space中nums[i]中最小的元素。
只用根据哪个nums[i]%space的出现次数最大,然后选择其对应的最小的nums[i]即可。
AC代码
class Solution {
public:
unordered_map<int,int>cnt,mymap;
int destroyTargets(vector<int>& nums, int space) {
sort(nums.begin(),nums.end());
int mx=0,ans=1e9;
for(auto&num:nums)
{
cnt[num%space]++;
if(!mymap.count(num%space))
{
mymap[num%space]=num;
}
if(cnt[num%space]>mx)
{
mx=cnt[num%space];
ans=mymap[num%space];
}
else if(cnt[num%space]>=mx)
ans=min(ans,mymap[num%space]);
}
return ans;
}
};