给你一个长度为?
n
?、下标从?0?开始的整数数组?nums
?,表示收集不同巧克力的成本。每个巧克力都对应一个不同的类型,最初,位于下标?i
?的巧克力就对应第?i
?个类型。在一步操作中,你可以用成本?
x
?执行下述行为:
- 同时修改所有巧克力的类型,将巧克力的类型?
ith
?修改为类型?((i + 1) mod n)th
。假设你可以执行任意次操作,请返回收集所有类型巧克力所需的最小成本。
class Solution {
public:
long long minCost(vector<int>& nums, int x) {
}
};
题目的人话翻译每种巧克力有一个收回的成本,存于数组对应下标元素,就是你可以花费x令整个数组循环右移一个长度,这样原来第i种巧克力的成本就变成了i + 1种巧克力的成本,让你返回所有巧克力的最小成本和。
显然对于一个长度为n的数组最多移动n - 1次,我们开一个数组mi维护每种巧克力的最小成本,每移动一次都对最小成本进行维护,然后计算此时的实际成本即mi的元素和加上移动次数*x
时间复杂度: O(N^2) 空间复杂度:O(N)
?
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;
}
};