首页 > 其他分享 >leetcode数论(2453. 摧毁一系列目标)

leetcode数论(2453. 摧毁一系列目标)

时间:2024-08-06 09:25:14浏览次数:13  
标签:space 数论 res nums 2453 目标 int 摧毁 leetcode

前言

经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。

数论包含最大公约数(>=2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。

描述

给你一个下标从 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 。

示例 3:

输入:nums = [6,2,5], space = 100
输出:2
解释:无论我们输入哪个数字,都只能摧毁 1 个目标。输入的最小整数是 nums[1] 。

提示:

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

实现原理与步骤

1.nums[i] + c * space转换意思为两数相差c*space.模 space 相同的数是可以被这些数中最小的那个数摧毁的.

2.按模space相同数最大分组的最小值。

 实现代码(按模分组)

import java.util.*;

class Solution {
    public int destroyTargets(int[] nums, int space) {
        // 使用HashMap存储按模space分组的数字
        Map<Integer, List<Integer>> g = new HashMap<>();
        
        // 按模space值将每个数字进行分组
        for (int x : nums) {
            int key = x % space;
            if (!g.containsKey(key)) {
                g.put(key, new ArrayList<>());
            }
            g.get(key).add(x);
        }
        
        // 初始化变量以追踪最大组大小和最大组中最小的值
        int mx = 0;
        int ans = Integer.MAX_VALUE;
        
        // 遍历每个组
        for (List<Integer> a : g.values()) {
            int m = a.size();
            int low = Collections.min(a);
            
            // 如果当前组大小大于最大组大小,或者当前组大小等于最大组大小但最小值更小,则更新最大组大小和最小值
            if (m > mx || (m == mx && low < ans)) {
                mx = m;
                ans = low;
            }
        }
        
        // 返回最大组中的最小值
        return ans;
    }
}

实现代码(枚举超时)

class Solution {
    public int destroyTargets(int[] nums, int space) {
        int res = Integer.MAX_VALUE;
        int maxCount = 0;
        for (int i = 0; i < nums.length; i++) {
            int temp = 0;
            for (int j = 0; j < nums.length; j++) {
                if (i != j) {
                    if (Math.abs(nums[j] - nums[i]) % space == 0) {
                        temp++;
                    }
                }

            }
            if (temp > maxCount) {
                maxCount = temp;
                res = nums[i];
            } else if (temp == maxCount) {
                res = Math.min(res, nums[i]);
            }
        }
        return res;

    }
}

1.QA:

标签:space,数论,res,nums,2453,目标,int,摧毁,leetcode
From: https://blog.csdn.net/acuteeagle01/article/details/140908962

相关文章

  • leetcode数论(326. 3 的幂)
    前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。数论包含最大公约数(>=2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。描述给定一个整数,写一个......
  • leetcode力扣第29题:两数相除
    这题看似简单,实则一点也不难(不是),实则还是比较困难。最简单的做法是直接用减法,不停循环计数,最后统计减多少次能成。如果被除数是2^31-1或差不多大小的数,而除数是1差不多大小的数,那循环减法要执行的次数太多,一定会超时。所以一定要有更好的思路(1)通过二分法查找可能的商(2)对于......
  • LeetCode 1631. Path With Minimum Effort
    原题链接在这里:https://leetcode.com/problems/path-with-minimum-effort/description/题目:Youareahikerpreparingforanupcominghike.Youaregiven heights,a2Darrayofsize rowsxcolumns,where heights[row][col] representstheheightofcell (row,c......
  • day32【LeetCode力扣】541. 反转字符串 II
    day32【LeetCode力扣】541.反转字符串II1.题目描述给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。如果剩余字符少于k个,则将剩余字符全部反转。如果剩余字符小于2k但大于或等于k个,则反转前k个字符,其余字符......
  • LeetCode面试150——13罗马数字转整数
    题目难度:简单默认优化目标:最小化平均时间复杂度。Python默认为Python3。目录1题目描述2题目解析3算法原理及代码实现3.1模拟法参考文献1题目描述罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符    数值I      1V    ......
  • 【Python】Python中的输入与输出——内附Leetcode【151.反转字符串中的单词】的C语言
    输入与输出导读一、Python中的输出1.1基本用法1.2格式化输出1.3通过`:`格式化值的输出1.4其它格式化输出二、Python中的输入2.1基本用法2.2`split()`方法2.3split()习题演练结语导读大家好,很高兴又和大家见面啦!!!在上一篇内容中我们介绍了Python中的数据类......
  • leetcode200. 岛屿数量C++题解,精美图例和流程图,一题带你弄懂图的dfs遍历算法
    leetcode200.岛屿数量给你一个由‘1’(陆地)和‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例1:输入:grid=[[“1”,“1”,“1”,......
  • [LeetCode] 2053. Kth Distinct String in an Array
    Adistinctstringisastringthatispresentonlyonceinanarray.Givenanarrayofstringsarr,andanintegerk,returnthekthdistinctstringpresentinarr.Iftherearefewerthankdistinctstrings,returnanemptystring"".Notethat......
  • LeetCode 热题 HOT 100 (017/100)【宇宙最简单版】
    【链表】No.0148排序链表【中等】......
  • LeetCode 136场双周赛 Q4. 标记所有节点需要的时间
    这道题也是一道比较经典的树形dp模板题;太久没写了,赛时一眼就想到了,但是敲的时候摸索了半天,还是没敲出来;首先看题目,需要求出无向树上从每个节点为树根节点到其他所有节点中最长路径的值,然后每条边的距离其实就是,如果目的地是奇数距离为1,目的地是偶数距离为2那么这个逻辑很简单,其......