240103-把数组变空的最少操作次数

题目要求

给定由正整数组成的0索引数组nums,可以对数组进行以下两种操作:

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

返回使数组为空所需要的最少操作次数,如果不可能则返回-1。

思路

我的第一反应是,查找相同的元素 并删除。直觉上让我想到用哈希表来解决,把元素对应的值变成字符出现的次数。然后2和3的最小公倍数是6,也就是说只有1,7,13...这个数列无法被2和3组合出来,除此之外的所有正整数都可以被2和3组合出来。因此我们在得到哈希表之后只需要用数值mod 6即可 ,如果出现余数是1则返回-1。如果可以变空,则需要返回最少操作次数,**可以用除以6的值和余数来判断。**显而易见尽可能多用3可以节省次数,因此假设除以6的值是a,余数是b,分情况讨论:

  1. b = 0 ,这时当前的最优解是2a
  2. b = 1,如上文讨论,直接返回-1并跳出循环。
  3. b = 2,2a+1
  4. b = 3,2a+1
  5. b = 4,2a+2
  6. b = 5,2a+2

综上,逻辑判断结束,只需要累加每次的最优解个数即可。然后发现并不是这样的,因为7也可以用2*2+3...,那么如果不用6,用3来讨论又会怎样?(发现不过的时候我觉得会不会是背包问题?)

  1. b = 0,最优解是a
  2. b = 1 ,最优解是**(a-1)+2=a+1**需要判断一下a是否大于0。
  3. b = 2 ,最优解是a+1

再试一下!果断AC!

代码

cpp 复制代码
class Solution {
public:
    int minOperations(vector<int>& nums) {
        unordered_map<int, int> map;
        for (int num : nums) {
            map[num] = 0;
        }
        for (int num : nums) {
            map[num] += 1;
        }
        int res = 0;
        for (const auto &kv : map) {
            // printf("%d, %d\n", kv.first, kv.second);
            int a = kv.second / 3;
            switch(kv.second % 3) {
                case 0:
                    res += a;
                    // printf("case 0: res = %d\n", res);
                    break;
                case 1:
                    if (a > 0) {
                        res += a + 1;
                    } else {
                        return -1;
                    }
                    // printf("case 1: res = %d\n", res);
                    break;
                case 2:
                    res += a + 1;
                    // printf("case 2: res = %d\n", res);
                    break;
            }
        }
        return res;
    }
};
相关推荐
Navigator_Z21 小时前
LeetCode //C - 1252. Cells with Odd Values in a Matrix
c语言·算法·leetcode
语戚1 天前
力扣 1621. 大小为K的不重叠线段的数目:动态规划(Java 实现)
java·算法·leetcode·动态规划·力扣·dp
青山木1 天前
Hot 100 --- 最长有效括号
java·数据结构·算法·leetcode·动态规划
这料鬼有毒1 天前
二刷hot100-1143.最长公共子序列
算法·leetcode·动态规划
政企项目老覃1 天前
边缘 AI 推理部署:安防零售场景下的模型裁剪与端侧落地实践
人工智能·程序人生·算法·性能优化·vllm
爱吃苹果的日记本1 天前
数据结构第五课
数据结构·学习
Logic1011 天前
C语言/数据结构贪心算法题解:买卖股票的最佳时机——一次交易最大利润(O(n)时间O(1)空间)
c语言·数据结构·贪心算法·数组·时间复杂度·算法题·股票交易
Logic1011 天前
C语言/数据结构位运算题解:异或XOR找出货币交易中的“独特面值“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
ctlover1 天前
数据结构:树
数据结构·python
GreenTea1 天前
发布 3 天登顶 HN:不生成一个字的模型 Jev,我把它的源码和黑料都扒了一遍
前端·后端·算法