一、题目
1、题目描述
2、接口描述
class Solution {
public:
long long minCost(vector<int>& nums, int x) {
}
};
3、原题链接
2735. 收集巧克力
二、解题报告
1、思路分析
题目的人话翻译每种巧克力有一个收回的成本,存于数组对应下标元素,就是你可以花费x令整个数组循环右移一个长度,这样原来第i种巧克力的成本就变成了i + 1种巧克力的成本,让你返回所有巧克力的最小成本和。
显然对于一个长度为n的数组最多移动n - 1次,我们开一个数组mi维护每种巧克力的最小成本,每移动一次都对最小成本进行维护,然后计算此时的实际成本即mi的元素和加上移动次数*x
2、复杂度
3、代码详解
class Solution {
public:
long long minCost(vector<int>& nums, long long x) {
vector<int> mi(nums);
long long ret = accumulate(mi.begin() , mi.end() , 0LL);
for(int i = 1 , n = nums.size() ; i < n ; i ++){
for(int j = 0; j < n ; j++)
mi[(j + i) % n] = min(mi[(j + i) % n] , nums[j]);
ret = min(ret , i * x + accumulate(mi.begin(), mi.end(), 0LL));
}
return ret;
}
};