​LeetCode解法汇总2670. 找出不同元素数目差数组

news/2024/7/5 4:07:40

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台


描述:

给你一个下标从 0 开始的数组 nums ,数组长度为 n 。

nums 的 不同元素数目差 数组可以用一个长度为 n 的数组 diff 表示,其中 diff[i] 等于前缀 nums[0, ..., i] 中不同元素的数目 减去 后缀 nums[i + 1, ..., n - 1] 中不同元素的数目。

返回 nums 的 不同元素数目差 数组。

注意 nums[i, ..., j] 表示 nums 的一个从下标 i 开始到下标 j 结束的子数组(包含下标 i 和 j 对应元素)。特别需要说明的是,如果 i > j ,则 nums[i, ..., j] 表示一个空子数组。

示例 1:

输入:nums = [1,2,3,4,5]
输出:[-3,-1,1,3,5]
解释:
对于 i = 0,前缀中有 1 个不同的元素,而在后缀中有 4 个不同的元素。因此,diff[0] = 1 - 4 = -3 。
对于 i = 1,前缀中有 2 个不同的元素,而在后缀中有 3 个不同的元素。因此,diff[1] = 2 - 3 = -1 。
对于 i = 2,前缀中有 3 个不同的元素,而在后缀中有 2 个不同的元素。因此,diff[2] = 3 - 2 = 1 。
对于 i = 3,前缀中有 4 个不同的元素,而在后缀中有 1 个不同的元素。因此,diff[3] = 4 - 1 = 3 。
对于 i = 4,前缀中有 5 个不同的元素,而在后缀中有 0 个不同的元素。因此,diff[4] = 5 - 0 = 5 。

示例 2:

输入:nums = [3,2,3,4,2]
输出:[-2,-1,0,2,3]
解释:
对于 i = 0,前缀中有 1 个不同的元素,而在后缀中有 3 个不同的元素。因此,diff[0] = 1 - 3 = -2 。
对于 i = 1,前缀中有 2 个不同的元素,而在后缀中有 3 个不同的元素。因此,diff[1] = 2 - 3 = -1 。
对于 i = 2,前缀中有 2 个不同的元素,而在后缀中有 2 个不同的元素。因此,diff[2] = 2 - 2 = 0 。
对于 i = 3,前缀中有 3 个不同的元素,而在后缀中有 1 个不同的元素。因此,diff[3] = 3 - 1 = 2 。
对于 i = 4,前缀中有 3 个不同的元素,而在后缀中有 0 个不同的元素。因此,diff[4] = 3 - 0 = 3 。 

提示:

  • 1 <= n == nums.length <= 50
  • 1 <= nums[i] <= 50

解题思路:

分别使用前缀和后缀两个Map,Map的key为元素值,value为元素数量。

以某个位置i计算,i之前的统计到前缀Map中,i之后的统计到后缀Map中。

两个Map的数量之差,就是我们想要的答案。

代码:

public class Solution2670 {

    public int[] distinctDifferenceArray(int[] nums) {
        Map<Integer, Integer> suffixMap = new HashMap<>();
        Map<Integer, Integer> prefixMap = new HashMap<>();
        for (int num : nums) {
            add2Map(suffixMap, num);
        }
        int[] result = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            add2Map(prefixMap, nums[i]);
            reduce2Map(suffixMap, nums[i]);
            result[i] = prefixMap.size() - suffixMap.size();
        }
        return result;
    }

    private void add2Map(Map<Integer, Integer> map, int key) {
        Integer num = map.getOrDefault(key, 0);
        map.put(key, num + 1);
    }

    private void reduce2Map(Map<Integer, Integer> map, int key) {
        Integer num = map.getOrDefault(key, 0);
        if (num <= 1) {
            map.remove(key);
            return;
        }
        map.put(key, num - 1);
    }
}


http://lihuaxi.xjx100.cn/news/2006428.html

相关文章

AJAX-axios错误处理

场景&#xff1a; 处理&#xff1a;用更直观的方式&#xff0c;给普通用户展示错误信息 语法&#xff1a;在then方法的后面&#xff0c;通过点语法调用catch方法&#xff0c;传入回调函数并定义形参 axios({//请求选项}).then(result> {//处理数据}).catch(error>{//处理…

ele-h5项目使用vue3+vite开发:第二节、search 搜索框组件开发

如何设计一个组件 需求分析 布局 content left-iconbodyinput-controlright-iconaction 功能 使用 defineEmits 定义组件的事件 在组件的script setup 里如何定义事件 使用defineEmits&#xff08;&#xff09;定义先声明事件接口 <script setup lang"ts"> int…

【蓝桥备赛】优先队列

优先队列 队列是基于数组或者链表来实现的&#xff0c;是线性的结构&#xff1b;队列的特点是先进先出。 优先队列是一种特殊类型的队列&#xff0c;其中元素被赋予优先级&#xff0c;具有较高优先级的元素先被处理。 在竞赛中经常会遇到优先队列的思想 基本语法 基本语法…

python封装的.exe文件是如何在cmd中获取.xml路径的?

这段日子搞项目算法封装&#xff0c;愁死我。来回改了三遍&#xff0c;总算把相对路径、绝对路径&#xff0c;还有cmd给.exe传参的方式搞懂了。 主要是这个语句 workspace sys.argv[1] sys.argv[]的作用就是,在运行python文件的时候从外部输入参数往文件里面传递参数。 外部就…

linux+rv1126/imx6ull:opencv静态库交叉编译

目录 1.下载 2.准备工作 2.1安装依赖环境 2.2安装Cmake 2.3 解压opencv 3.Cmake设置 3.1文件夹选择 1&#xff09;进入源码根目录 2&#xff09;运行cmake 3&#xff09;选择目录 4&#xff09;进入配置界面 5&#xff09;查找编译器 6&#xff09;配置编译器 3.…

TCP 连接掉线自动重连

文章目录 TCP 连接掉线自动重连定义使用连接效果 TCP 接收数据时防止掉线。TCP 连接掉线自动重连。多线程环境下TCP掉线自动重连。 欢迎讨论更好的方法&#xff01; TCP 连接掉线自动重连 定义 定义一个类&#xff0c;以编写TCP连接函数Connect()&#xff0c;并且&#xff1a…

python实现的LDA算法

实现LDA算法需要用到一些数学和概率统计的知识&#xff0c;你需要根据LDA算法的具体公式&#xff0c;实现初始化模型参数、Gibbs采样、模型参数更新等具体的步骤。同时&#xff0c;还需要读取训练文件和词典文件&#xff0c;以及保存模型到文件的功能。 理解LDA算法的实现思路…

2024年美赛C题:Momentum in Tennis思路解析

Problem C: Momentum in Tennis 网球运动中的动力 【扫描下方二维码加入群聊&#xff0c;了解更多思路~】 中文题目&#xff1a; 在2023年温布尔登男子单打决赛中&#xff0c;20岁的西班牙新星卡洛斯阿尔卡拉斯击败了36岁的诺瓦克德约科维奇。这是德约科维奇自2013年以来在温布…