leetcode_3010 将数组分成最小总代价的子数组 I

1. 题意

将一个数组分成三个子数组,

并且让每个子数组的代价为其首元素,

问最小的代价是多少?

2. 分析

第一个元素肯定会被计入代价之中去,

而在剩下的元素之中,我们可以任意的

选取位置作为子数组的开头,也就是子数组的代价。

因此这个题目变成了求:

首元素和剩下数组的最小值和次小值。

2.1 排序

时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)

空间复杂度 O ( 1 ) O(1) O(1)

cpp 复制代码
class Solution {
public:
    int minimumCost(vector<int>& nums) {
        sort(nums.begin() + 1, nums.end());

        return nums[0] + nums[1] + nums[2];
    }
};
2.2 维护最小值次小值

时间复杂度 O ( n ) O(n) O(n)

空间复杂度 O ( 1 ) O(1) O(1)

cpp 复制代码
class Solution {
public:
    int minimumCost(vector<int>& nums) {
        
        int f2 = nums[1];
        int f3 = nums[2];

        if ( f2 > f3)
            swap( f2, f3);

        int N = nums.size();
        for ( int i = 3; i < N; ++i) {
            
            if ( nums[i] < f2) {
                f3 = f2;
                f2 = nums[i];
            }
            else if ( nums[i] < f3) {
                f3 = nums[i];   
            }

        }

        return nums[0] + f2 + f3;
    }
};

参考

0x3f

相关推荐
流云鹤21 小时前
每日一题0316
算法
leonkay21 小时前
Golang语言闭包完全指南
开发语言·数据结构·后端·算法·架构·golang
颜酱1 天前
BFS 与并查集实战总结:从基础框架到刷题落地
javascript·后端·算法
casual~1 天前
第?个质数(埃氏筛算法)
数据结构·c++·算法
仰泳的熊猫1 天前
题目2308:蓝桥杯2019年第十届省赛真题-旋转
数据结构·c++·算法·蓝桥杯
hssfscv1 天前
力扣练习训练2(java)——二叉树的中序遍历、对称二叉树、二叉树的最大深度、买卖股票的最佳时机
java·数据结构·算法
victory04311 天前
Agent 面试知识树 + 高频追问答案库
网络·面试·职场和发展
y = xⁿ1 天前
【LeetCodehot100】二叉树大合集 T94:二叉树的中序遍历 T104:二叉树的最大深度 T226:翻转二叉树 T101:对称二叉树
后端·算法·深度优先
不想看见4041 天前
Search a 2D Matrix II数组--力扣101算法题解笔记
数据结构·算法