当前位置: 首页 > article >正文

【C++刷题】力扣-#561-数组拆分

题目描述

给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an,
bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。
返回该最大总和 。

示例

示例 1

输入:nums = [1,4,3,2]
输出:4
解释:所有可能的分法(忽略元素顺序)为:
1. (1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3
2. (1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 3
3. (1, 2), (3, 4) -> min(1, 2) + min(3, 4) = 1 + 3 = 4
所以最大总和为 4

示例 2

输入:nums = [6,2,6,5,1,2]
输出:9
解释:最优的分法为 (2, 1), (2, 5), (6, 6). min(2, 1) + min(2, 5) + min(6, 6) = 1 + 2 + 6 = 9

题解

  1. 排序:首先对数组 nums 进行排序。由于数组已经包含了从 1 到 2n 的所有整数,排序后数组将按升序排列。
  2. 计算总和:对排序后的数组进行遍历,每次跳过两个索引(即 i = i + 2),这样可以确保我们总是取每对中较小的数。将这些较小的数累加到 sum 变量中。
  3. 返回结果:返回计算出的 sum 值,即为所有对的和的最小总和。

代码实现

int arrayPairSum(vector<int>& nums) {
    sort(nums.begin(), nums.end());
    int sum = 0;
    for (int i = 0; i < nums.size(); i = i + 2) {
        sum += nums[i];
    }
    return sum;
}

复杂度分析

● 时间复杂度:O(n log n),其中 n 是数组 nums 的长度。主要时间消耗在排序上。
● 空间复杂度:O(1),除了输入数组外,我们只使用了常数个额外变量。
这个算法的优势在于它简单且高效,只需要一次排序和一次遍历即可找到所有对的和的最小总和。


http://www.kler.cn/a/374795.html

相关文章:

  • Mybatis分页插件的使用问题记录
  • Java 优化springboot jar 内存 年轻代和老年代的比例 减少垃圾清理耗时 如调整 -XX:NewRatio
  • 【数据科学导论】第一二章·大数据与数据表示与存储
  • 【C++读写.xlsx文件】OpenXLSX开源库在 Ubuntu 18.04 的编译、交叉编译与使用教程
  • Android 蓝牙Bluedroid线程池设计思路介绍
  • 在 Sanic 应用中使用内存缓存管理 IP 黑名单
  • 【Linux刷题练习】
  • 线上3D看车有何优势?
  • Linux 宝塔安装(各操作系统命令合集)
  • Zipkin使用指南分布式追踪核心概念与架构详解
  • vos3000外呼系统通话无法接续怎么解决?
  • CMake 生成器表达式介绍
  • 2024最新Twitter养号全面指南,品牌起号必看!
  • Windows部署rabbitmq
  • 基于Pyecharts的数据可视化开发(二)调用通义千问api分析爬虫数据
  • CATIA许可证管理工具
  • AI实践-PyTorch-CNN-手写数字识别
  • 防重方案-订单防重方案笔记
  • 使用华为云数字人可以做什么
  • Word试题快速转换制作excel题库
  • 设置电脑定时关机
  • 网络爬虫中的反爬虫技术:突破限制,获取数据
  • php怎么并发处理
  • MaskGCT: Zero-Shot Text-to-Speech with Masked Generative Codec Transformer
  • 【北京迅为】《STM32MP157开发板嵌入式开发指南》-第六十九章 linux内核移植
  • JVM整体结构和JMM内存模型