美文网首页
【算法题】2547. 拆分数组的最小代价

【算法题】2547. 拆分数组的最小代价

作者: 程序员小2 | 来源:发表于2023-08-09 06:45 被阅读0次

题目:

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

将数组拆分成一些非空子数组。拆分的 代价 是每个子数组中的 重要性 之和。

令 trimmed(subarray) 作为子数组的一个特征,其中所有仅出现一次的数字将会被移除。

例如,trimmed([3,1,2,4,3,4]) = [3,4,3,4] 。
子数组的 重要性 定义为 k + trimmed(subarray).length 。

例如,如果一个子数组是 [1,2,3,3,3,4,4] ,trimmed([1,2,3,3,3,4,4]) = [3,3,3,4,4] 。这个子数组的重要性就是 k + 5 。
找出并返回拆分 nums 的所有可行方案中的最小代价。

子数组 是数组的一个连续 非空 元素序列。

示例 1:

输入:nums = [1,2,1,2,1,3,3], k = 2
输出:8
解释:将 nums 拆分成两个子数组:[1,2], [1,2,1,3,3]
[1,2] 的重要性是 2 + (0) = 2 。
[1,2,1,3,3] 的重要性是 2 + (2 + 2) = 6 。
拆分的代价是 2 + 6 = 8 ,可以证明这是所有可行的拆分方案中的最小代价。
示例 2:

输入:nums = [1,2,1,2,1], k = 2
输出:6
解释:将 nums 拆分成两个子数组:[1,2], [1,2,1] 。
[1,2] 的重要性是 2 + (0) = 2 。
[1,2,1] 的重要性是 2 + (2) = 4 。
拆分的代价是 2 + 4 = 6 ,可以证明这是所有可行的拆分方案中的最小代价。
示例 3:

输入:nums = [1,2,1,2,1], k = 5
输出:10
解释:将 nums 拆分成一个子数组:[1,2,1,2,1].
[1,2,1,2,1] 的重要性是 5 + (3 + 2) = 10 。
拆分的代价是 10 ,可以证明这是所有可行的拆分方案中的最小代价。

提示:

1 <= nums.length <= 1000
0 <= nums[i] < nums.length
1 <= k <= 10^9

java代码:

class Solution {
    public int minCost(int[] nums, int k) {
        int n = nums.length;
        int[] f = new int[n + 1];
        byte[] state = new byte[n];
        for (int i = 0; i < n; ++i) {
            Arrays.fill(state, (byte) 0);
            int unique = 0, mn = Integer.MAX_VALUE;
            for (int j = i; j >= 0; --j) {
                int x = nums[j];
                if (state[x] == 0) { // 首次出现
                    state[x] = 1;
                    ++unique;
                } else if (state[x] == 1) { // 不再唯一
                    state[x] = 2;
                    --unique;
                }
                mn = Math.min(mn, f[j] - unique);
            }
            f[i + 1] = k + mn;
        }
        return f[n] + n;
    }
}

相关文章

  • javaScript数据结构和算法--归并排序

    归并排序是一种分治算法,分而治之,将原始数组拆分成最小粒度的数组(数组的长度是1),接着将这些小数组进行归并(me...

  • [7kyu]Find the smallest integer

    该算法题来自于 codewars【语言: javascript】,翻译如有误差,敬请谅解~ 任务 找出数组中最小的...

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • 归并排序

    思路:将数组拆分,每次从中间拆分,直到不能拆分。然后将拆分到最后的数组,再慢慢的递归回来,按顺序一个个合并 算法实现

  • 2021-07-25【Math】红包概率算法

    笔试算法题(22):二分法求旋转数组最小值 & 骰子值概率_weixin_33918357的博客-CSDN博客[h...

  • 字节跳动iOS面试算法题——当前数组中没有的最小正整数

    背景 社畜初级程序员面试头条iOS开发,被完虐。其中一个算法题如下: 给定一个整数数组,输出当前数组中没有的最小正...

  • iOS开发 - 获取数组中最大数,最小数

    需求:获取数组中最大的数,最小数其实就是一排序算法直接上方法 同理获取数组中最小的数

  • 找出无序数组中最小的k个数(top k问题)

    给定一个无序的整型数组arr,找到其中最小的k个数 该题是互联网面试中十分高频的一道题,如果用普通的排序算法,排序...

  • 个人关于机器学习的周记之九

    这周我们将介绍梯度下降: 梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数的最小值。 梯...

  • Kruskal

    Kruskal算法此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入...

网友评论

      本文标题:【算法题】2547. 拆分数组的最小代价

      本文链接:https://www.haomeiwen.com/subject/hguopdtx.html