LeetCode 2735. 收集巧克力

一、题目

1、题目描述

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

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

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

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

2、接口描述

class Solution {
public:
    long long minCost(vector& nums, int x) {
        
    }
};

3、原题链接

2735. 收集巧克力


二、解题报告

1、思路分析

题目的人话翻译每种巧克力有一个收回的成本,存于数组对应下标元素,就是你可以花费x令整个数组循环右移一个长度,这样原来第i种巧克力的成本就变成了i + 1种巧克力的成本,让你返回所有巧克力的最小成本和。

显然对于一个长度为n的数组最多移动n - 1次,我们开一个数组mi维护每种巧克力的最小成本,每移动一次都对最小成本进行维护,然后计算此时的实际成本即mi的元素和加上移动次数*x

2、复杂度

时间复杂度: O(N^2) 空间复杂度:O(N)

3、代码详解

class Solution {
public:
    long long minCost(vector& nums, long long x) {
        vector 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;
    }
};

你可能感兴趣的:(leetcode每日一题,算法,c++,数据结构,leetcode,职场和发展,开发语言)