Every day a Leetcode
题目来源:3010. 将数组分成最小总代价的子数组 I
题目描述:
给你一个长度为 n 的整数数组 nums 。
一个数组的代价是它的第一个元素。比方说,[1,2,3] 的代价是 1 ,[3,4,1] 的代价是 3 。
你需要将 nums 分成 3 个连续且没有交集的子数组。
请你返回这些子数组的最小代价总和 。
解法1:排序
第一个代价一定是 nums[0],后面两个代价是 nums[1,…,n] 的最小值和次小值。
三个代价的和就是答案。
代码:
// 排序
class Solution
{
public:
int minimumCost(vector<int> &nums)
{
sort(nums.begin() + 1, nums.end());
return accumulate(nums.begin(), nums.begin() + 3, 0);
}
};
结果:
复杂度分析:
时间复杂度:O(nlogn),其中 n 是数组 nums 的元素个数。
空间复杂度:O(1)。
解法2:STL min_element
代码:
class Solution
{
public:
int minimumCost(vector<int> &nums)
{
// 特判
if (nums.size() == 3)
return accumulate(nums.begin(), nums.end(), 0);
int n = nums.size();
// 第一个代价一定是 nums[0]
int cost = *nums.begin();
nums.erase(nums.begin());
// 后面两个代价是 nums[1,...,n] 的最小值和次小值
auto it = min_element(nums.begin(), nums.end());
cost += *it;
nums.erase(it);
it = min_element(nums.begin(), nums.end());
cost += *it;
return cost;
}
};
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是数组 nums 的元素个数。
空间复杂度:O(1)。