LeetCode 2735. 收集巧克力【枚举】2043

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

给你一个长度为 n 、下标从 0 开始的整数数组 nums ,表示收集不同巧克力的成本。每个巧克力都对应一个不同的类型,最初,位于下标 i 的巧克力就对应第 i 个类型。

在一步操作中,你可以用成本 x 执行下述行为:

  • 同时修改所有巧克力的类型,将巧克力的类型 ith 修改为类型 ((i + 1) mod n)th

假设你可以执行任意次操作,请返回收集所有类型巧克力所需的最小成本。

示例 1:

输入:nums = [20,1,15], x = 5
输出:13
解释:最开始,巧克力的类型分别是 [0,1,2] 。我们可以用成本 1 购买第 1 个类型的巧克力。
接着,我们用成本 5 执行一次操作,巧克力的类型变更为 [1,2,0] 。我们可以用成本 1 购买第 2 个类型的巧克力。
然后,我们用成本 5 执行一次操作,巧克力的类型变更为 [2,0,1] 。我们可以用成本 1 购买第 0 个类型的巧克力。
因此,收集所有类型的巧克力需要的总成本是 (1 + 5 + 1 + 5 + 1) = 13 。可以证明这是一种最优方案。

示例 2:

输入:nums = [1,2,3], x = 4
输出:6
解释:我们将会按最初的成本收集全部三个类型的巧克力,而不需执行任何操作。因此,收集所有类型的巧克力需要的总成本是 1 + 2 + 3 = 6

提示:

  • 1 <= nums.length <= 1000
  • 1 <= nums[i] <= 10^9
  • 1 <= x <= 10^9

解法

提示1

这道题有两个成本,一个是收集每种巧克力的成本数组 nums ;另一种是执行巧克力数组 rotate 的成本 x

不难想到,由于成本数组长度最多为 1000 1000 1000 ,则巧克力数组长度也不会超过 1000 1000 1000 ,最多 rotate 1000 1000 1000 次,就会回到原样。所以可以尝试所有可能——**枚举操作次数,从操作 0 0 0 次到操作 n − 1 n−1 n1 次。

提示2

考虑简单情况:

  • 如果不操作,第 i i i 个巧克力必须花费 nums [ i ] \textit{nums}[i] nums[i] 收集,总花费为所有 nums [ i ] \textit{nums}[i] nums[i] 之和。例如示例 2 不操作是最优的。
  • 如果只操作一次,第 i i i 个巧克力可以在操作前购买,也可以在操作后购买,取最小值,即 min ⁡ ( nums [ i ] , nums [ ( i + 1 ) m o d n ] ) \min(\textit{nums}[i], \textit{nums}[(i+1)\bmod n]) min(nums[i],nums[(i+1)modn])
  • 如果操作两次,购买第 i i i 个巧克力的花费为 min ⁡ ( nums [ i ] , nums [ ( i + 1 ) m o d n ] , nums [ ( i + 2 ) m o d n ] ) \min(\textit{nums}[i], \textit{nums}[(i+1)\bmod n], \textit{nums}[(i+2) \bmod n]) min(nums[i],nums[(i+1)modn],nums[(i+2)modn]) 。例如示例 1,我们可以操作两次,这样每块巧克力都只需要 1 1 1 的花费,总成本为 2 x + 1 + 1 + 1 = 13 2x+1+1+1=13 2x+1+1+1=13

依此类推。

提示3

如果暴力枚举操作次数,再枚举每个巧克力,再计算购买这个巧克力的最小花费,总的时间复杂度是 O ( n 3 ) \mathcal{O}(n^3) O(n3)

一个初步的优化是, O ( n 2 ) \mathcal{O}(n^2) O(n2) 的时间预处理所有子数组的最小值,保存到一个二维数组中。这样做需要 O ( n 2 ) \mathcal{O}(n^2) O(n2) 的时间和空间。

但其实不需要预处理,还有更简单的做法:

  1. 用一个长为 n n n 的数组 s s s 统计不同操作次数下的总成本, s [ i ] s[i] s[i] 统计操作 i i i 次下的总成本
  2. 写一个二重循环,枚举子数组的左端点 i i i 和右端点 j j j
  3. 在枚举右端点的同时,维护从 nums [ i ] \textit{nums}[i] nums[i] nums [ j ] \textit{nums}[j] nums[j] 的最小值 mn \textit{mn} mn
  4. mn \textit{mn} mn 加到 s [ j − i ] s[j−i] s[ji] 中,这是因为长为 j − i + 1 j-i+1 ji+1 的子数组恰好对应着操作 j − i j-i ji 次时要计算的子数组,或者说区间 [ i , j ] [i,j] [i,j] 的最小值对应操作 j − i j-i ji 次取巧克力的成本。
    1. 对每个区间 [ i , i ] [i,i] [i,i] ,最小值就是 n u m s [ i ] nums[i] nums[i] ,也就是操作 0 0 0 次取每个巧克力的成本;
    2. 对每个区间 [ i , i + 1 ] [i,i+1] [i,i+1] ,最小值是 min ⁡ ( n u m s [ i ] , n u m s [ i + 1 ] ) \min(nums[i], nums[i+1]) min(nums[i],nums[i+1]) ,也就是操作 1 1 1 次时取每个巧克力的成本。
    3. ……
  5. 最后输出 min ⁡ ( s ) \min(s) min(s)
// cpp
class Solution {
public:long long minCost(vector<int>& nums, int x) {int n = nums.size();vector<long long> s(n); // s[k] 统计操作 k 次的总成本for (int i = 0; i < n; ++i)s[i] = (long long) i * x;for (int i = 0; i < n; ++i) { // 子数组左端点int mn = nums[i];for (int j = i; j < n + i; ++j) { // 子数组右端点(把数组看做环状)mn = min(mn, nums[j % n]); // 维护nums[i : j]的最小值s[j - i] += mn; // 累加操作 j-i 次时的成本}}return *min_element(s.begin(), s.end());}
};// java
class Solution {public long minCost(int[] nums, int x) {int n = nums.length;long[] s = new long[n];for (int i = 0; i < n; ++i) s[i] = (long) i * x;for (int i = 0; i < n; ++i) {int mn = nums[i];for (int j = i; j < n + i; ++j) {mn = Math.min(mn, nums[j % n]);s[j - i] += mn;}}long ans = Long.MAX_VALUE;for (long v : s) ans = Math.min(ans, v);return ans;}
}// go
func minCost(nums []int, x int) int64 {n := len(nums)s := make([]int64, n)for i := range s {s[i] = int64(i) * int64(x)}for i, mn := range nums {for j := i; j < n + i; j++ {mn = min(mn, nums[j % n]);s[j - i] += int64(mn);}}return slices.Min(s)
}// rust
impl Solution {pub fn min_cost(nums: Vec<i32>, x: i32) -> i64 {let n = nums.len();let mut s: Vec<i64> = (0..n).map(|i| i as i64 * x as i64).collect();for i in 0..n {let mut mn = nums[i];for j in i..(n + i) {mn = mn.min(nums[j % n]);s[j - i] += mn as i64;}}*s.iter().min().unwrap()}
}// python
class Solution:def minCost(self, nums: List[int], x: int) -> int:n = len(nums)s = list(range(0, n * x, x))for i, mn in enumerate(nums):for j in range(i, n + i):mn = min(mn, nums[j % n])s[j - i] += mnreturn min(s)

复杂度分析:

  • 时间复杂度: O ( n 2 ) \mathcal{O}(n^2) O(n2),其中 n n n nums \textit{nums} nums 的长度。
  • 空间复杂度: O ( n ) \mathcal{O}(n) O(n)

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

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

相关文章

【快速全面掌握 WAMPServer】09.如何在 WAMPServer 中安装 Composer

网管小贾 / sysadm.cc WAMPServer 的大名想必应该有不少人特别是新手小白们略有耳闻吧。 它是出自法国大神之手的一款 PHP 开发环境集成包&#xff0c;工作于 Windows 环境&#xff0c;类似于它这样的集成包在 Linux 平台上反正我是没找到&#xff0c;所以它应该算是对使用 Wi…

CollectionUtils

使用 CollectionUtils 类的常用方法 在Java开发中&#xff0c;我们经常需要对集合进行各种操作&#xff0c;而Apache Commons Collections库提供了一个方便的工具类 CollectionUtils&#xff0c;其中包含了许多实用的方法。在这篇博客中&#xff0c;我们将深入了解一些常用的方…

MIT线性代数笔记-第35讲-期末复习

目录 35.期末复习打赏 35.期末复习 已知一个矩阵 A A A满足 A x ⃗ [ 1 0 0 ] A \vec{x} \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} Ax ​100​ ​无解且 A x ⃗ [ 0 1 0 ] A \vec{x} \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} Ax ​010​ ​仅有一个解 (1)求 A A A的…

call的一点奇怪的使用

Object.prototype.hasOwnProperty.call(initModal, method) 解释&#xff1a; 在这个特定的代码中&#xff0c;它用于检查 initModal 对象是否具有名为 method 的属性。 Object.prototype.hasOwnProperty 是一个内置的 JavaScript 方法&#xff0c;它可以检查一个对象是否具有…

linux安装rabbitmq

文章目录 前言一、下载安装包二、erlang1.安装依赖2.解压3.安装4.环境变量5.验证 三、rabbitmq1.安装依赖2.解压3.新建目录4.rabbitmq.env.conf5.rabbitmq.conf6.环境变量7.启动8.验证9.停止 四、安装web1.安装插件2.访问控制台界面 五、开机启动1.编写脚本2.设置开机启动3.测试…

硬件安全模块 (HSM)、硬件安全引擎 (HSE) 和安全硬件扩展 (SHE)的区别

术语 硬件安全模块 (HSM) &#xff1a;Hardware Security Modules硬件安全引擎 (HSE) &#xff1a;Hardware Security Engines安全硬件扩展 (SHE) &#xff1a; Secure Hardware Extensions 介绍 在汽车行业中&#xff0c;硬件安全模块 (HSM)、硬件安全引擎 (HSE) 和安全硬件…

Android长按图标展示快捷方式

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {new Thread(() -> {// 获取ShortcutManager实例ShortcutManager shortcutManager getSystemService(ShortcutManager.class);// 创建要添加的快捷方式ShortcutInfo.Builder shortcutBuilder new ShortcutInfo.Bui…

Java中如何实现负载均衡策略

1. 引言 当在Java应用程序中需要处理负载均衡时&#xff0c;通常涉及到多个服务器或服务实例&#xff0c;以确保请求能够分散到这些实例上&#xff0c;从而提高系统性能、可用性和可伸缩性。实现负载均衡策略可以通过多种方法&#xff0c;包括基于权重、轮询、随机选择、最少连…

[蓝桥杯2020国赛]答疑

答疑 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序&#xff0c;同学们要依次进入老师办公室答疑。 一位同学答疑的过程如下&#xff1a; 首先进入办公室&#xff0c;编号为 i 的同学需要 si​ 毫秒的时间。然后同学问…

大语言模型训练数据集

大语言模型的数据集有很多&#xff0c;以下是一些常用的&#xff1a; - 中文维基百科&#xff1a;这是一个包含大量中文文本的数据集&#xff0c;可用于训练中文语言模型。 - 英文维基百科&#xff1a;这是一个包含大量英文文本的数据集&#xff0c;可用于训练英文语言模型。 …

python脚本实现一次提取多个文件下的图片

problem formulation 有时候下载的数据集如下&#xff0c;就很烦&#xff0c;一个里面就一张图片 code import os import shutil# 定义源目录和目标目录 source_dir ./dataset/data/Detection destination_dir ./dataset/data/img# 确保目标目录存在&#xff0c;如果不存…

css原子化的框架Tailwindcss的使用教程(原始html和vue项目的安装与配置)

安装教程 中文官网教程 原始的HTML里面使用 新建文件夹npm init -y 初始化项目 安装相关依赖 npm install -D tailwindcss postcss-cli autoprefixer初始化两个文件 npx tailwindcss init -p根目录下新建src/style.css tailwind base; tailwind components; tailwind ut…

图神经网络--GNN从入门到精通

图神经网络--GNN从入门到精通 一、图的基本表示和特征工程1.1 什么是图1.2 图的基本表示1.3 图的性质--度&#xff08;degree)1.4 连通图&#xff0c;连通分量1.5有向图连通性1.6图直径1.7度中心性1.7特征中心性&#xff08; Eigenvector Centrality&#xff09;1.8中介中心性 …

CentOS 7 实战指南:目录操作命令详解

写在前面 想要在 CentOS 7 系统下更高效地进行目录操作吗&#xff1f;不要犹豫&#xff0c;在这里我为你准备了一篇精彩的技术文章&#xff01;这篇文章将带您深入了解 CentOS 7 下目录操作相关命令的使用方法。无论您是新手还是有一定经验的用户&#xff0c;这篇文章都将为您…

EasyNTS端口穿透服务新版本发布 0.8.7 增加隧道流量总数记录,可以知晓设备哪个端口耗费流量了

EasyNTS上云平台可通过远程访问内网应用&#xff0c;包含网络桥接、云端运维、视频直播等功能&#xff0c;极大地解决了现场无固定IP、端口不开放、系统权限不开放等问题。平台可提供一站式上云服务&#xff0c;提供直播上云、设备上云、业务上云、运维上云服务&#xff0c;承上…

金蝶云星空其他出库单,审核中/审批流中可以选择序列号设置

文章目录 其他出库单&#xff0c;审核中&#xff0c;审批流中可以选择序列号设置 其他出库单&#xff0c;审核中&#xff0c;审批流中可以选择序列号设置

创建型设计模式 - 抽象工厂模式 - JAVA

创建型设计模式 - 抽象工厂设计模式 一. 简介二. 列子2.1 定义电脑的抽象类和子类2.2 定义抽象工厂类和其实现类2.3 测试 三. 抽象工厂设计模式的好处四. 抽象工厂模式的案例 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续…

如果xm_bmgys的长度大于3就每行五列,否则每行两列

如果需要根据xm_bmgys的长度动态调整表格的列数&#xff0c;可以使用Freemarker的条件判断语句进行处理。 下面是一个更新后的示例代码&#xff1a; <table><#if xm_bmgys?size > 3> <!-- 如果长度大于3&#xff0c;每行五列 --><#list xm_bmgys a…

【mysql】数据处理格式化、转换、判断

数据处理 判断是否超时&#xff0c;时间是否大于当前时间计算分钟数时间格式化处理如果数值类型进行转换字符类型字符拼接case-when代替if-else判断数据空&#xff08;特殊&#xff1a;含空数据、空字符处理&#xff09; select /*判断是否超时&#xff0c;时间是否大于当前…

2024任务驱动Hadoop应用讲课提纲

文章目录 为何采用任务驱动&#xff1f;任务驱动Hadoop应用课程概述项目一&#xff1a;搭建Hadoop集群任务1&#xff1a;搭建完全分布式Hadoop集群1. 思路解析2. 编程实现3. 知识点讲解4. 总结提高 任务2&#xff1a;搭建高可用Hadoop集群&#xff08;HA模式&#xff09;1. 思路…