[LeetCode] 2453. Destroy Sequential Targets

You are given a 0-indexed array nums consisting of positive integers, representing targets on a number line. You are also given an integer space.

You have a machine which can destroy targets. Seeding the machine with some nums[i] allows it to destroy all targets with values that can be represented as nums[i] + c * space, where c is any non-negative integer. You want to destroy the maximum number of targets in nums.

Return the minimum value of nums[i] you can seed the machine with to destroy the maximum number of targets.

Example 1:

Input: nums = [3,7,8,1,1,5], space = 2
Output: 1
Explanation: If we seed the machine with nums[3], then we destroy all targets equal to 1,3,5,7,9,... 
In this case, we would destroy 5 total targets (all except for nums[2]). 
It is impossible to destroy more than 5 targets, so we return nums[3].

Example 2:

Input: nums = [1,3,5,2,4,6], space = 2
Output: 1
Explanation: Seeding the machine with nums[0], or nums[3] destroys 3 targets. 
It is not possible to destroy more than 3 targets.
Since nums[0] is the minimal integer that can destroy 3 targets, we return 1.

Example 3:

Input: nums = [6,2,5], space = 100
Output: 2
Explanation: Whatever initial seed we select, we can only destroy 1 target. The minimal seed is nums[1].

Constraints:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 109
  • 1 <= space <= 109

摧毁一系列目标。

给你一个下标从 0 开始的数组 nums ,它包含若干正整数,表示数轴上你需要摧毁的目标所在的位置。同时给你一个整数 space 。

你有一台机器可以摧毁目标。给机器 输入 nums[i] ,这台机器会摧毁所有位置在 nums[i] + c * space 的目标,其中 c 是任意非负整数。你想摧毁 nums 中 尽可能多 的目标。

请你返回在摧毁数目最多的前提下,nums[i] 的 最小值 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/destroy-sequential-targets
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路是 hashmap + counting sort。按照题意,对于任何一个数字 nums[i],他能够摧毁的目标值满足 nums[i] + c * space,其中 c 是正整数。那么其实所有可以被 nums[i] 摧毁的数字 X 都满足 X % space = nums[i]。发现这个规律之后,我们就可以遍历一遍 input 数组,把数组中的每个数字都 % space,然后以 nums[i] % space 为 key 存入 hashmap。

此时我们再次遍历 input 数组,对于每个数字 num,我们找到他(num % space)在 hashmap 里的对应的 value,这个 value 就是如果以当前数字 nums[i] 作为“武器”,能摧毁的目标数量。我们遍历整个数组,看看哪个武器能摧毁最多的目标,同时注意如果有多个武器摧毁的目标数量一样,取元素值最小的那个。

时间O(n)

空间O(n)

Java实现

 1 class Solution {
 2     public int destroyTargets(int[] nums, int space) {
 3         HashMap<Integer, Integer> map = new HashMap<>();
 4         for (int num : nums) {
 5             int key = num % space;
 6             map.put(key, map.getOrDefault(key, 0) + 1);
 7         }
 8         
 9         int max = 0;
10         int res = 0;
11         for (int num : nums) {
12             int value = map.get(num % space);
13             if (value == max) {
14                 res = Math.min(res, num);
15             } else if (value > max) {
16                 res = num;
17                 max = value;
18             }
19         }
20         return res;
21     }
22 }

 

相关题目

1010. Pairs of Songs With Total Durations Divisible by 60

2453. Destroy Sequential Targets

LeetCode 题目总结

posted @ 2023-01-05 07:29  CNoodle  阅读(35)  评论(0编辑  收藏  举报