LeetCode每日一题(2448. Minimum Cost to Make Array Equal)

深入解析Lora SX1268:从基础配置到高级应用 本文深入解析了LoRa SX1268芯片从基础配置到高级应用的全过程。详细介绍了LoRa与FSK模式选择、核心参数(BW、SF、CR、LDRO)的配置策略、数据帧结构、缓冲区管理以及CAD模式等关键概念,旨在帮助开发者充分发挥SX1268在远距离、低功耗物联网通信中的潜力,并提供实用的调试技巧。 阅读详情

You are given two 0-indexed arrays nums and cost consisting each of n positive integers.

You can do the following operation any number of times:

Increase or decrease any element of the array nums by 1.
The cost of doing one operation on the ith element is cost[i].

Return the minimum total cost such that all the elements of the array nums become equal.

Example 1:

Input: nums = [1,3,5,2], cost = [2,3,1,14]
Output: 8

Explanation: We can make all the elements equal to 2 in the following way:

  • Increase the 0th element one time. The cost is 2.
  • Decrease the 1st element one time. The cost is 3.
  • Decrease the 2nd element three times. The cost is 1 + 1 + 1 = 3.
    The total cost is 2 + 3 + 3 = 8.
    It can be shown that we cannot make the array equal with a smaller cost.

Example 2:

Input: nums = [2,2,2,2,2], cost = [4,2,8,1,3]
Output: 0

Explanation: All the elements are already equal, so no operations are needed.

Constraints:

  • n == nums.length == cost.length
  • 1 <= n <= 105
  • 1 <= nums[i], cost[i] <= 106

首先明确一点, 最终 nums 中的那个值一定是初始 nums 中的某一个值, 也就是整个过程一定是所有 nums 中的数字往 nums 中的某一个数字靠拢的过程。至于为啥, 不知道, 直觉。

以 nums = [1,3,5,2], cost = [2,3,1,14]为例

我们先将 nums 和 cost 进行排序, 注意要关联排序, 不要破坏 nums 与 cost 中的对应关系。
得到
nums = [1, 2, 3, 5]
cost = [2, 14, 3, 1]
(我实现的时候是用的倒序排序, 现在回过头来看, 其实正序倒序应该都可以, 这里用正序)

假设
total_cost = 0
开始遍历
nums[0] = 1
nums[1] = 2
此时我们要么把 1 变成 2, 要么把 2 变成 1, 此时我们先考虑 1 变成 2 的情况, 2 变 1 的我们后面单独考虑。因为 cost[0] = 2 所以 1 变 2 的成本就是 2
total_cost = 2
再往下走
nums[1] = 2
nums[2] = 3
此时我们还是只考虑 2 变 3 的情况, cost[1] = 14, 所以 2 变成 3 的成本就是 14, 但是前面还有个 1, 此时 1 已经变成 2 了,也是从 2 变成 3, 但是成本不一样, cost[0] = 2, 所以都变成 3 的成本就是 2 + 14 = 16, 加上前面 1 变成 2 的成本, total_cost = 18
看出点端倪来了吗?假设 dp[i]是 nums[…i]都变成 nums[i]的成本, 那 dp[i] = dp[i-1] + (nums[i] - nums[i-1]) * sum(cost[0], cost[1], …cost[i-1]), 用人话说就是要都变成 nums[i]就要在都变成 nums[i-1]的基础上在加上两者的差值与 cost prefix sum 的乘积
这样算出来的 dp[i]就是左侧都变成 nums[i]成本, 那剩下的右侧的 nums[i+1…]呢?很简单,还是用上面的公式, 反过来遍历 nums 就可以了, 只不过 cost prefix sum 变成了 suffix sum。

这样我们就得到了所有左侧数字变成 nums[i]的成本 left_cost 和右侧数字都变成 nums[i]的成本 right_cost, 我们只需要找出 left_cost[i] + right_cost[i]的最小值就可以了

因为代码实现中途改过几遍, 不是很清晰, 比较混乱, 仅供参考



impl Solution {
    pub fn min_cost(nums: Vec<i32>, cost: Vec<i32>) -> i64 {
        let mut list: Vec<(i64, i64)> = nums.into_iter().zip(cost).map(|(n, c)| (n as i64, c as i64)).collect();
        list.sort_by_key(|n| (-n.0, -n.1));
        let cost_prefix: Vec<i64> = list
            .iter()
            .scan(0, |s, &(_, cost)| {
                *s += cost;
                Some(*s)
            })
            .collect();
        let total_cost_prefix: Vec<i64> = list
            .windows(2)
            .enumerate()
            .scan(0, |s, (i, w)| {
                let (num0, _) = w[0];
                let (num1, _) = w[1];
                *s += cost_prefix[i] * (num0 - num1);
                Some(*s)
            })
            .collect();
        let mut cost_suffix: Vec<i64> = list
            .iter()
            .rev()
            .scan(0, |s, &(_, cost)| {
                *s += cost;
                Some(*s)
            })
            .collect();
        cost_suffix.reverse();
        let mut total_cost_suffix: Vec<i64> = list
            .windows(2)
            .enumerate()
            .rev()
            .scan(0, |s, (i, w)| {
                let (num0, _) = w[0];
                let (num1, _) = w[1];
                *s += (num0 - num1) * cost_suffix[i + 1];
                Some(*s)
            })
            .collect();
        total_cost_suffix.reverse();
        total_cost_suffix.push(0);
        let mut ans = total_cost_suffix[0];
        for i in 0..total_cost_prefix.len() {
            ans = ans.min(total_cost_prefix[i] + total_cost_suffix[i + 1]);
        }
        ans
    }
}
避坑指南:海康MV_CC_SetIntValue接口的7个典型报错解决方案 本文深度解析海康工业相机SDK中MV_CC_SetIntValue接口的典型报错,提供7个实战解决方案。针对MV_E_CALLORDER、MV_E_PARAMETER等高频错误码,从设备状态、参数值域、依赖关系等核心约束入手,给出清晰的诊断流程与根治代码,帮助开发者构建健壮的参数设置模块,提升开发效率。 阅读详情

相关推荐

【S32K3 MCAL配置】-4.1-CAN Driver:如何解决CAN帧发送丢帧问题

【S32K3 MCAL配置】-4.1-CAN Driver:如何解决CAN帧发送丢帧问题

「汽车电子助手」的博客 1397

第316场周赛 6224. 最大公因数等于 K 的子数组数目 (C++)

帮助广大网友和自己更好的复习

qq_51933234的博客 581

粒子群优化与蚁群算法求解多旅行商问题

它要求在给定一组城市和旅行商之间的距离矩阵的情况下,找到一条最优的路径方案,使得所有旅行商可以分别从起始城市出发,途径其他城市,并最终回到起始城市,同时总旅行距离达到最小。这两种算法都是基于群体智能的优化算法,在求解组合优化问题时具有较好的性能表现。假设有n个城市需要被m个旅行商访问,城市间的距离由距离矩阵D表示,其中D(i,j)表示第i个城市到第j个城市的距离。粒子群优化算法是一种基于群体智能的优化算法,其中的粒子代表了潜在的解,并通过模拟粒子在解空间中的移动来搜索最优解。一、多旅行商问题建模。

m0_47037246的博客 537

leetcode 2448. Minimum Cost to Make Array Equal(使数组相等的最小成本)

binary search

蓝羽飞鸟的博客 954

leetcode2448. 使数组相等的最小开销【猜结论落在给定点 + 考虑初始值和变化量 + 三分法模板学习】

考虑变化量 + 三分法模板

小楼一夜听春雨 683

2448. 使数组相等的最小开销(困难,周赛)

这道题可以转化为:cost[i]是nums[i]出现的次数,然后都转化为中位数。参考题目:leetcode462. 最小操作次数使数组元素相等。为什么目标是中位数呢?根据中位数贪心的思想。

zhangjiaji111的博客 518

[Leetcode学习-c++&java] Minimum Operations to Make Array Equal(单数数组平均值)

问题: 难度:medium 说明: 给出一个数字,比如 3,然后就列举一个单数的数组:[1 , 3 , 5] 开始进行操作,可以选择两个元素,让其中一个 + 1 另一个就要 - 1,那么让这个单数数组的所有元素值都一样需要多少次这样的操作 题目连接:https://leetcode.com/problems/minimum-operations-to-make-array-equal/ 输入案例: Example 1: Input: n = 3 Output: 2 Explanation:

qq_28033719的博客 295

LeetCode 198:打家劫舍

动态规划解打家劫舍,核心在于定义 dp[i] 为前 i+1 间房能偷的最大金额。状态转移:dp[i]=max(dp[i-1], dp[i-2]+nums[i]),即当前房不偷或偷取(加上前 i-1 间最优)。初版误以为奇偶位置二选一,被反例 [2,1,1,2] 推翻,正解为 2+2=4。关键在于明确状态与选择,而非机械套公式。

find1star的博客 137

LeetCode //C - 1223. Dice Roll Simulation

Summary: This problem involves counting the number of distinct sequences possible when rolling a die n times, with constraints on the maximum consecutive occurrences of each number. The solution uses dynamic programming to track sequences ending with each

Made in Code 209

LeetCode 32. 最长有效括号

这题的关键是先把“括号是否匹配”和“有效子串是否连续”拆开。当前 ')' 只能匹配最近的、尚未匹配的 '('isValid被标记的位置连续多少个,最长有效括号子串就是多少。这份写法虽然不是最省空间的栈写法,但思路清晰:先标记所有有效位置,再统计最长连续有效区间。

zander258的博客 194

LeetCode 350. 两个数组的交集 II|Python 解法详解

这道题的关键是:统计较短数组的元素频次,再扫描另一个数组。理解这一点后,再结合边界条件检查,代码就能保持清晰且稳定。

a1250467048的博客 168

LeetCode 19:删除链表的倒数第 N 个节点复盘| dummy + 快慢指针

<think>我们要求根据给定内容生成≤150字的文章摘要。内容较长,是关于删除链表倒数第N个节点的解题思路。需要概括核心要点:dummy节点、快慢指针、fast先走n+1步、返回dummy.next、时间复杂度等。注意字数限制,中文摘要≤150字。要精简。 可能摘要:本文通过删除链表倒数第N个节点,讲解dummy+双指针方法。关键点:使用虚拟头节点处理删除头节点;slowPre需指向待删节点前一位,因此fast先走n+1步;再同步移动,当fast为空时,slowPre恰好在前一位,执行删除。最

yc2284238579的博客 186

解决leetcode第4017题数组中的峰值II

本文解决“数组中的峰值II”难题:统计区间内峰值子数组数量并支持单点更新。方法将区间按峰值索引分段,利用左右扩展计数,使用分治组合避免重复,并设计了峰值索引获取、分段统计、更新数组等函数。最终通过预处理查询顺序输出答案,示例验证正确。

2302_79682652的博客 180

20,84:有效的括号,柱状图中最大的矩形

这道题目又是一道有严格先后顺序的数据结构,所以我们可以使用栈来轻松解决这类问题。可以将字符串中处于左半部分的元素压入栈中,当遇到右半部分的元素时,我们可以将原来的元素先出栈,在和右半部分的元素进行比对,如果他俩是一对的话,就进行下一个循环,如果不是一对的话,就直接返回false,因为已经违反了规则。

2401_88017330的博客 186

leetcode 3903. 最小稳定下标 I 简单

如果不存在这样的下标,则返回。在下标 0 处,不稳定值为。

2401_88085478的博客 113

LeetCode 92:反转链表 II 复盘|从区间反转到头插法,彻底理解 dummy、pre、cur 和循环次数

<think>我们只需要根据用户提供的内容生成摘要,≤150字。用户内容是关于LeetCode反转链表II的详细讲解,包含头插法、指针、循环次数等。摘要需要简洁概括核心。注意字数限制。可以围绕题目、头插法、核心步骤、复杂度。写一段话。需要≤150字。检查。</think>摘要:本题要求反转单链表指定区间。推荐头插法:用dummy统一处理left=1,pre定位至left前一个,cur指向left。每次将cur.next摘出插到pre后,执行right-left次。核心三句“摘、接、插

yc2284238579的博客 320

LeetCode 525:连续数组(前缀和) —— 题解

力控前缀和经典题目——连续数组

2601_96587588的博客 643

LeetCode 补拙笔记 日期:2026.09.03 题目:240.搜索二维矩阵 II

核心:最大距离等于首尾临界点位置差;最小距离是相邻临界点的位置差的最小值;优化亮点:不保存全部临界点,仅记录第一个、上一个临界点,省去集合开销;合并判断条件,减少if分支;关键点:链表头、尾节点不可能成为临界点,遍历条件要保证curr存在后继节点。

sheeta1998的博客 236

LeetCode双题:滑动窗口破解最小子数组

解法⼀:暴力求解(会超时)算法思路:「从前往后」枚举数组中的任意⼀个元素,把它当成起始位置。然后从这个「起始位置」开始,然后寻找⼀段最短的区间,使得这段区间的和「⼤于等于」⽬标值。将所有元素作为起始位置所得的结果中,找到「最⼩值」即可。

2502_93625125的博客 217

leetcode】(三)堆排序和桶排序

1,堆结构就是用数组实现的完全二叉树结构2,完全二叉树中如果每棵子树的最大值都在顶部就是大根堆3,完全二叉树中如果每棵子树的最小值都在顶部就是小根堆4,堆结构的heapInsert与heapify操作5,堆结构的增大和减少6,优先级队列结构,就是堆结构。

C__learner_的博客 178

LeetCode 338. 比特位计数(动态规划 + 位运算详解)

<think>我们根据要求,需要基于用户提供的文章内容,生成≤150字的文章摘要。用户文章是关于LeetCode 338题的解题思路,重点在动态规划和位运算。摘要需简洁概括核心内容。注意长度限制。</think>本文介绍 LeetCode 338 题“比特位计数”,采用动态规划与位运算计算 0 到 n 每个数的二进制中 1 的个数。核心递推公式为 ans[i] = ans[i >> 1] + (i & 1),时间复杂度 O(n),空间复杂度 O(n)。同时对比了暴力法、Brian Kernighan 算法

2603_95532426的博客 322

力扣HOT 100-相交链表

【代码】力扣HOT 100-相交链表。

weixin_73214301的博客 75

3.5G 64T MetaAAU-HW.pptx

3.5G 64T MetaAAU-HW.pptx

【摄像头-OV5640】模块软硬件开发资料硬件参考设计原理图+STM32软件源码.zip

【摄像头_OV5640】模块软硬件开发资料硬件参考设计原理图+STM32软件源码:1.原理图+PCB封装库2.程序3.数据手册(引脚说明+寄存器说明)OV5640与STM32F407引脚连接说明.xlsxOV5640与STM32F429引脚连接说明.xlsxOV5640用户手册.pdf

上一篇: LeetCode每日一题(2207. Maximize Number of Subsequences in a String)
下一篇: LeetCode每日一题(1857. Largest Color Value in a Directed Graph)
wangjun861205
博客等级 码龄12年 11粉丝 464原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值