双周赛114(模拟、枚举 + 哈希、DFS)

news2024/9/23 19:22:21

文章目录

  • 双周赛114
    • [2869. 收集元素的最少操作次数](https://leetcode.cn/problems/minimum-operations-to-collect-elements/)
      • 模拟
    • [2870. 使数组为空的最少操作次数](https://leetcode.cn/problems/minimum-number-of-operations-to-make-array-empty/)
      • 哈希 + 枚举
    • [2871. 将数组分割成最多数目的子数组](https://leetcode.cn/problems/split-array-into-maximum-number-of-subarrays/)
      • AND 位运算性质
    • [2872. 可以被 K 整除连通块的最大数目](https://leetcode.cn/problems/maximum-number-of-k-divisible-components/)
      • DFS

双周赛114

2869. 收集元素的最少操作次数

简单

给你一个正整数数组 nums 和一个整数 k

一次操作中,你可以将数组的最后一个元素删除,将该元素添加到一个集合中。

请你返回收集元素 1, 2, ..., k 需要的 最少操作次数

示例 1:

输入:nums = [3,1,5,4,2], k = 2
输出:4
解释:4 次操作后,集合中的元素依次添加了 2 ,4 ,5 和 1 。此时集合中包含元素 1 和 2 ,所以答案为 4 。

示例 2:

输入:nums = [3,1,5,4,2], k = 5
输出:5
解释:5 次操作后,集合中的元素依次添加了 2 ,4 ,5 ,1 和 3 。此时集合中包含元素 1 到 5 ,所以答案为 5 。

示例 3:

输入:nums = [3,2,5,3,1], k = 3
输出:4
解释:4 次操作后,集合中的元素依次添加了 1 ,3 ,5 和 2 。此时集合中包含元素 1 到 3  ,所以答案为 4 。

提示:

  • 1 <= nums.length <= 50
  • 1 <= nums[i] <= nums.length
  • 1 <= k <= nums.length
  • 输入保证你可以收集到元素 1, 2, ..., k

模拟

class Solution {
    public int minOperations(List<Integer> nums, int k) {
        Set<Integer> set = new HashSet<>();
        for(int i = nums.size()-1; i >= 0; i--){
            if(nums.get(i) <= k){
                set.add(nums.get(i));
                if(set.size() == k) return nums.size() - i;
            }
        }
        return nums.size();
    }
}

2870. 使数组为空的最少操作次数

中等

给你一个下标从 0 开始的正整数数组 nums

你可以对数组执行以下两种操作 任意次

  • 从数组中选择 两个相等 的元素,并将它们从数组中 删除
  • 从数组中选择 三个相等 的元素,并将它们从数组中 删除

请你返回使数组为空的 最少 操作次数,如果无法达成,请返回 -1

示例 1:

输入:nums = [2,3,3,2,2,4,2,3,4]
输出:4
解释:我们可以执行以下操作使数组为空:
- 对下标为 0 和 3 的元素执行第一种操作,得到 nums = [3,3,2,4,2,3,4] 。
- 对下标为 2 和 4 的元素执行第一种操作,得到 nums = [3,3,4,3,4] 。
- 对下标为 0 ,1 和 3 的元素执行第二种操作,得到 nums = [4,4] 。
- 对下标为 0 和 1 的元素执行第一种操作,得到 nums = [] 。
至少需要 4 步操作使数组为空。

示例 2:

输入:nums = [2,1,2,2,3,3]
输出:-1
解释:无法使数组为空。

提示:

  • 2 <= nums.length <= 105
  • 1 <= nums[i] <= 106

哈希 + 枚举

class Solution {
    public int minOperations(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        for(int num : nums){
            map.merge(num, 1, Integer::sum);
        }
        int res = 0;
        for(Map.Entry<Integer, Integer> entry : map.entrySet()){
            int cnt = entry.getValue();
            if(cnt == 1) return -1;
            res += cnt / 3;
            cnt %= 3;
            if(cnt != 0) res += 1;
        }
        return res;
    }
}

2871. 将数组分割成最多数目的子数组

中等

给你一个只包含 非负 整数的数组 nums

我们定义满足 l <= r 的子数组 nums[l..r] 的分数为 nums[l] AND nums[l + 1] AND ... AND nums[r] ,其中 AND 是按位与运算。

请你将数组分割成一个或者更多子数组,满足:

  • 每个 元素都 属于一个子数组。
  • 子数组分数之和尽可能

请你在满足以上要求的条件下,返回 最多 可以得到多少个子数组。

一个 子数组 是一个数组中一段连续的元素。

示例 1:

输入:nums = [1,0,2,0,1,2]
输出:3
解释:我们可以将数组分割成以下子数组:
- [1,0] 。子数组分数为 1 AND 0 = 0 。
- [2,0] 。子数组分数为 2 AND 0 = 0 。
- [1,2] 。子数组分数为 1 AND 2 = 0 。
分数之和为 0 + 0 + 0 = 0 ,是我们可以得到的最小分数之和。
在分数之和为 0 的前提下,最多可以将数组分割成 3 个子数组。所以返回 3 。

示例 2:

输入:nums = [5,7,1,3]
输出:1
解释:我们可以将数组分割成一个子数组:[5,7,1,3] ,分数为 1 ,这是可以得到的最小总分数。
在总分数为 1 的前提下,最多可以将数组分割成 1 个子数组。所以返回 1 。

提示:

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 106

AND 位运算性质

https://leetcode.cn/problems/split-array-into-maximum-number-of-subarrays/solutions/2464645/li-yong-and-xing-zhi-yi-ci-bian-li-pytho-p3bj/

class Solution {
    /**
    1. 先满足分数之和尽可能小
    结论:
        随着 AND 的数量越来越多,AND 的结果只会越来越小
        随着 OR 的数量越来越多,OR 的结果只会越来越大
    ==> 
        假设 整个数组的 AND 记作 a > 0
        如果分出两个子数组 >= 2*a > a,此时只能分出一个数组,即 nums
    ==>最小的分数之和为 nums 的 AND 结果

    2. 再满足分出的子数组尽量多
    
     */
    public int maxSubarrays(int[] nums) {
        int ans = 0;
        int a = -1; // -1 就是 111...1,和任何数 AND 都等于那个数
        for(int x : nums){
            a &= x;
            if(a == 0){
                ans++;
                a = -1;
            }
        }
        return Math.max(ans, 1); // 如果 ans=0 说明所有数的 and>0,答案为 1
    }
}

2872. 可以被 K 整除连通块的最大数目

困难

给你一棵 n 个节点的无向树,节点编号为 0n - 1 。给你整数 n 和一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示树中节点 aibi 有一条边。

同时给你一个下标从 0 开始长度为 n 的整数数组 values ,其中 values[i] 是第 i 个节点的 。再给你一个整数 k

你可以从树中删除一些边,也可以一条边也不删,得到若干连通块。一个 连通块的值 定义为连通块中所有节点值之和。如果所有连通块的值都可以被 k 整除,那么我们说这是一个 合法分割

请你返回所有合法分割中,连通块数目的最大值

示例 1:

img

输入:n = 5, edges = [[0,2],[1,2],[1,3],[2,4]], values = [1,8,1,4,4], k = 6
输出:2
解释:我们删除节点 1 和 2 之间的边。这是一个合法分割,因为:
- 节点 1 和 3 所在连通块的值为 values[1] + values[3] = 12 。
- 节点 0 ,2 和 4 所在连通块的值为 values[0] + values[2] + values[4] = 6 。
最多可以得到 2 个连通块的合法分割。

示例 2:

输入:n = 7, edges = [[0,1],[0,2],[1,3],[1,4],[2,5],[2,6]], values = [3,0,6,1,5,2,1], k = 3
输出:3
解释:我们删除节点 0 和 2 ,以及节点 0 和 1 之间的边。这是一个合法分割,因为:
- 节点 0 的连通块的值为 values[0] = 3 。
- 节点 2 ,5 和 6 所在连通块的值为 values[2] + values[5] + values[6] = 9 。
- 节点 1 ,3 和 4 的连通块的值为 values[1] + values[3] + values[4] = 6 。
最多可以得到 3 个连通块的合法分割。

提示:

  • 1 <= n <= 3 * 104
  • edges.length == n - 1
  • edges[i].length == 2
  • 0 <= ai, bi < n
  • values.length == n
  • 0 <= values[i] <= 109
  • 1 <= k <= 109
  • values 之和可以被 k 整除。
  • 输入保证 edges 是一棵无向树。

DFS

class Solution {
    /**
    什么样的边可以删除?
        删除一条边分成两个连通块,这两个连通块的点权之和是k的倍数

    values之和可以被k整除
    只需要保证其中一个连通块的点权之和是k的倍数

    这意味着从任意一个点出发,计算出的答案都是一样的    
    
     */
    private List<Integer>[] g;
    private int[] values;
    private int k, ans;
    public int maxKDivisibleComponents(int n, int[][] edges, int[] values, int k) {
        g = new ArrayList[n];
        Arrays.setAll(g, e -> new ArrayList<>());
        for(int[] e : edges){
            int x = e[0], y = e[1];
            g[x].add(y);
            g[y].add(x);
        }
        this.values = values;
        this.k = k;
        dfs(0, -1);
        return ans;
    }

    public long dfs(int x, int fa){
        long sum = values[x];
        for(int y : g[x]){
            if(y != fa){
                sum += dfs(y, x);
            }
        }
        ans += sum % k == 0 ? 1 : 0;
        return sum;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1079750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis】之高并发场景下主从同步数据一致性问题探究

高并发极限场景 问题分布式锁失效&#xff0c;高并发极限场景下主从同步延时主节点崩溃等原因导致的数据不一致 背景知识&#xff1a;redis主从复制为异步同步过程 如图&#xff1a;redis cluster集群部署&#xff0c;多主多从架构&#xff08;基于哈希槽的分配策略&#xf…

Flink报错could not be loaded due to a linkage failure

文章目录 1、报错2、原因3、解决 1、报错 在Flink上提交作业&#xff0c;点Submit没反应&#xff0c;F12看到接口报错信息为&#xff1a; 大概意思是&#xff0c;由于链接失败&#xff0c;无法加载程序的入口点类xx。没啥鸟用的信息&#xff0c;去日志目录继续分析&#xff1a…

1712A 300A嵌入式电源系统

1712A 300A嵌入式电源系统 1712A 300A嵌入式电源系统采用模块化设计、组合式结构&#xff0c;由控制器、整流模块、交流配电单元、直流配电单元等组成。该系统将交流电转换成稳定的-48V直流电&#xff0c;用于铁塔、移动、电信、联通等公司的传输、接入网&#xff0c;以及专网等…

这样的丝瓜竟比砒霜还毒?赶紧看......

丝瓜滑嫩爽口&#xff0c;富含多种营养物质&#xff0c;无论凉拌还是炒菜都是不错的选择。可最近有人说&#xff0c;苦味的丝瓜有毒&#xff0c;甚至比砒霜还毒&#xff01; 这是真的吗&#xff1f; 苦味丝瓜&#xff0c;毒过砒霜&#xff1f; 苦味丝瓜中毒是因为碱糖甙生物碱…

NVIDIA CX 网卡驱动安装 测试

确定系统版本 cat /etc/issue Ubuntu 20.04.4 LTS \n \l uname -m x86_64 下载驱动 https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/ 选择对应系统版本架构 上传文件后解压文件 tar xf MLNX_OFED_LINUX-23.07-0.5.1.2-ubuntu20.04-x86_64.tgz 进…

【Spring框架学习3】Spring Bean的作用域 及 生命周期

一、Spring Bean的作用域有哪些&#xff1f; Spring框架支持以下五种Bean的作用域&#xff1a; Singleton&#xff1a;这是默认的作用域&#xff0c;在每个Spring IoC容器中只有一个Bean的实例(IoC初始化后)。Spring 中的 bean 默认都是单例的&#xff0c;是对单例设计模式的…

捕捉回忆的时光机:用AI智能管理的NAS,提升整理效率

记忆会模糊&#xff0c;但照片不会&#xff0c;每次打开照片的时候背后的故事就会浮现在我们眼前。当然&#xff0c;我们现在的设备也越来越多了&#xff0c;当我们要找某一张照片时总是需要从散落在各个设备里的照片库寻找&#xff0c;花费大量时间。而Terra Photos的出现&…

剑指offer——JZ37 序列化二叉树 解题思路与具体代码【C++】

一、题目描述与要求 序列化二叉树_牛客题霸_牛客网 (nowcoder.com) 题目描述 请实现两个函数&#xff0c;分别用来序列化和反序列化二叉树&#xff0c;不对序列化之后的字符串进行约束&#xff0c;但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。 二叉…

apple pencil有没有必要买?口碑好的电容笔推荐

相信很多小伙伴都在纠结&#xff0c;该选哪一支电容笔呢&#xff1f;一款原装的Apple Pencil&#xff0c;售价接近1000元&#xff0c;这个价位&#xff0c;在许多人的眼中&#xff0c;已经是相当的高了。其实&#xff0c;平替电容笔的价格很低&#xff0c;一两百块钱就能买到&a…

C/C++: * 和 *的区别

/** * * Althor:Hacker Hao * Create:2023.10.11 * */#include <bits/stdc.h> using namespace std; void fun1(int* ptr) {*ptr 3;ptr NULL; //不会改变原指针所指向的对象 }void fun2(int*& ptr) {*ptr 2;ptr NULL; //会改变原指针所指向的对象//也就…

2023年9月国产数据库大事记-墨天轮

本文为墨天轮社区整理的2023年9月国产数据库大事件和重要产品发布消息。 目录 9月国产数据库大事记 TOP109月国产数据库大事记&#xff08;时间线&#xff09;产品/版本发布兼容认证代表厂商大事记排行榜新增数据库厂商活动相关资料 9月国产数据库大事记 TOP10 9月国产数据库…

第十一章 共用体union和枚举enum

共用体 概念 有时想用同一段内存单元存放不同类型的变量。例如&#xff0c;把一个短整型变量&#xff0c;一个字符型变量和一个实型变量放在同一个地址开始的内存单元中 1000地址。以上3个变量在内存中占的字节数不同&#xff0c;但都从同一地址开始(图中设地址为1000)存放&a…

推荐高效的电脑磁盘备份解决方案!

该怎样实现电脑磁盘备份&#xff1f; 接下来&#xff0c;我们将为你介绍两种磁盘备份方法。一种是利用操作系统自带的功能&#xff0c;另一种则是通过第三方工具实现。 方法一. Windows自带的备份还原功能 要在Windows 11/10/8/7中备份软件&#xff0c;你可以使…

Linux shell编程学习笔记10:expr命令 和 算术运算

Linux Shell 脚本编程和其他编程语言一样&#xff0c;支持算数、关系、布尔、字符串、文件测试等多种运算。上节我们研究了 Linux shell编程 中的 字符串运算&#xff0c;今天我们研究 Linux shell编程的算术运算 &#xff0c;为了方便举例&#xff0c;我们同时对expr命令进行…

物联网AI MicroPython传感器学习 之 Relay继电器模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 继电器&#xff08;英文名称&#xff1a;relay&#xff09;是一种电控制器件&#xff0c;是当输入量的变化达到规定要求时&#xff0c;在电气输出电路中使被控量发生预定的阶跃变化的一种电器。…

linux查看文件内容命令more/less/cat/head/tail/grep

1.浏览全部内容more/less 文件&#xff1a; more&#xff1a;可以查看文件第一屏的内容&#xff0c;同时左下角有一个显示内容占全部文件内容的百分比&#xff0c;空格键会显示下一屏的内容&#xff0c;直到文件末尾 [rootmaster data]# more file1less&#xff1a;相较于mor…

前端工程化(editorconfig+ESLint+Prettier+StyleLint+Husky、Commitlint)

前言 致谢&#xff1a;有来技术大大 通过学习有来技术大大的文章和结合自己的实践&#xff0c;写一篇笔记记录一下 所使用的工具&#xff1a; ide项目风格(editorconfig)代码检查(ESLint)代码风格(Prettier)样式风格(StyleLint)git提交规范(Husky、Commitlint) 一、ide项目…

【算法设计与分析】— —单源最短路径的贪心算法

&#x1f383;欢迎大家前去观看我的算法设计与分析专栏&#xff1a; 算法设计与分析_IT闫的博客-CSDN博客 希望对大家有所帮助&#xff01; &#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java…

玉柴集团用USB Server对U盾远程安全管控

在当今数字化时代&#xff0c;企业的业务规模和组织结构日益复杂&#xff0c;对于U盾这样小小的&#xff0c;但却异常重要的USB设备的管理和使用提出了更高的要求。广西玉柴机器股份有限公司作为一家综合性集团企业&#xff0c;其业务规模庞大&#xff0c;组织结构复杂&#xf…

MapReduce(林子雨慕课课程)

文章目录 7. MapReduce7.1 MapReduce简介7.1.1 分布式并行编程7.1.2 MapReduce模型简介 7.2 MapReduce体系结构7.3 MapReduce工作流程概述7.4 Shuffle过程原理7.5 MapReduce应用程序的执行过程7.6 WordCount实例分析7.7 MapReduce的具体应用7.8 MaReduce编程实践 7. MapReduce …