【LeetCode 每日一题】3010. 将数组分成最小总代价的子数组 I——(解法二)排序

Problem: 3010. 将数组分成最小总代价的子数组 I

文章目录

  • [1. 整体思路](#1. 整体思路)
  • [2. 完整代码](#2. 完整代码)
  • [3. 时空复杂度](#3. 时空复杂度)
      • [时间复杂度: O ( N log ⁡ N ) O(N \log N) O(NlogN)](#时间复杂度: O ( N log ⁡ N ) O(N \log N) O(NlogN))
      • [空间复杂度: O ( log ⁡ N ) O(\log N) O(logN)](#空间复杂度: O ( log ⁡ N ) O(\log N) O(logN))

1. 整体思路

核心问题

我们需要将数组 nums 分成 3 个连续子数组,总代价是这 3 个子数组首元素的和。

算法逻辑

  1. 必选元素 :第一个子数组必须以 nums[0] 开头,因此 nums[0] 必定计入总代价。
  2. 贪心选择 :为了使总代价最小,剩下的两个子数组的头元素必须是 nums 剩余部分(即索引 1 到结尾)中最小的两个数。
  3. 局部排序 :
    • 我们不需要对整个数组排序(因为 nums[0] 的位置不能动)。
    • 我们只需要对 nums 从索引 1 开始的后缀进行排序。
    • Java 的 Arrays.sort(array, fromIndex, toIndex) 方法允许我们只对指定范围进行排序。
  4. 计算结果 :排序后,剩余部分的最小值变成了 nums[1],第二小变成了 nums[2]。结果即为 nums[0] + nums[1] + nums[2]。

2. 完整代码

java 复制代码
import java.util.Arrays;

class Solution {
    public int minimumCost(int[] nums) {
        // 1. 局部排序
        // Arrays.sort(array, fromIndex, toIndex) 对数组的特定范围进行排序
        // fromIndex (包括): 1
        // toIndex (不包括): nums.length
        // 这一步操作后,nums[0] 保持原位不动,而 nums[1] 到最后的部分变成了升序排列
        Arrays.sort(nums, 1, nums.length);
        
        // 2. 计算最小代价
        // nums[0]: 原数组的第一个元素 (固定必选)
        // nums[1]: 剩下所有元素中的最小值
        // nums[2]: 剩下所有元素中的第二小值
        return nums[0] + nums[1] + nums[2];
    }
}

3. 时空复杂度

假设数组 nums 的长度为 N N N。

时间复杂度: O ( N log ⁡ N ) O(N \log N) O(NlogN)

  • 计算依据 :
    • 代码核心是对长度为 N − 1 N-1 N−1 的子区间进行排序。
    • Arrays.sort 对于基本数据类型使用的是双轴快速排序(Dual-Pivot Quicksort),平均时间复杂度为 O ( N log ⁡ N ) O(N \log N) O(NlogN)。
  • 结论 : O ( N log ⁡ N ) O(N \log N) O(NlogN)。

空间复杂度: O ( log ⁡ N ) O(\log N) O(logN)

  • 计算依据 :
    • 相比上一版,这里没有使用 Arrays.copyOfRange 创建新数组,节省了 O ( N ) O(N) O(N) 的堆空间。
    • 但是,快速排序是递归实现的,需要消耗栈空间来存储递归调用的上下文。栈深度为 O ( log ⁡ N ) O(\log N) O(logN)。
  • 结论 : O ( log ⁡ N ) O(\log N) O(logN)。
相关推荐
用户979984807182 小时前
200 行代码写一个能跑的 AI Agent:不依赖任何框架,只靠 tool-calling 原理
算法
threerocks2 小时前
【Muse实战】X 流量作战室搭建保姆级教程 - 拥有你自己的运营团队
算法
GreenTea2 小时前
深度拆解 ScienceBuddy:如何用“双层递归自进化”构建高可靠科研 Agent Harness
前端·后端·算法
花椒技术3 小时前
2.46 秒生成 5 秒视频:拆解 H3 Max 的模型、推理栈与硬件协同
算法·音视频开发·视频编码
vivo互联网技术3 小时前
ART:妆容迁移框架,重新定义高保真妆容迁移 | ECCV 2026
人工智能·算法·图像识别
用户0441440924493 小时前
卫星信号模拟器里的四个坐标转换公式
算法
橘和柠3 小时前
阿里 open-code-review (AI代码审查工具)实战:安装、四层规则链、自定义规则格式与实测避坑
算法·面试
得物技术3 小时前
别再只卷向量检索了,得物交易搜索如何用“生成式”实现召回范式跃迁?
人工智能·算法·llm
罗西的思考3 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(4)--- Rollout实现细节
人工智能·算法
罗西的思考3 小时前
机器人 / 物理 Agent Harness 综合分析与对比:从「更强的模型」到「更好的系统」
人工智能·算法·机器学习