算法千题案例每日一练 LeetCode打卡——106.数组拆分 I
Posted 呆呆敲代码的小Y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法千题案例每日一练 LeetCode打卡——106.数组拆分 I相关的知识,希望对你有一定的参考价值。
📢前言
🚀 算法题 🚀 |
- 🌲 每天打卡一道算法题,既是一个学习过程,又是一个分享的过程😜
- 🌲 提示:本专栏解题 编程语言一律使用 C# 和 Java 两种进行解题
- 🌲 要保持一个每天都在学习的状态,让我们一起努力成为算法大神吧🧐!
- 🌲 今天是力扣算法题持续打卡第101天🎈!
🚀 算法题 🚀 |
🌲原题样例:数组拆分 I
给定长度为 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
示例3:
输入:name = "leelee", typed = "lleeelee"
输出:true
提示:
- 1 <= n <= 104
- nums.length == 2 * n
- -104 <= nums[i] <= 104
🌻C#方法:排序
根据题意得知最终结果是最小值累加起来,但是我们的最大值永远只能被排除。
所以此题的核心就是将第二大的值累加起来得出结果即可~
代码:
public class Solution
public int ArrayPairSum(int[] nums)
Array.Sort(nums);
int ret = 0;
for(int i =0;i<nums.Length;i=i+2)
ret += nums[i];
return ret;
执行结果
通过
执行用时:136 ms,在所有 C# 提交中击败了66.14%的用户
内存消耗:48.9 MB,在所有 C# 提交中击败了51.70%的用户
🌻Java 方法:排序
思路解析
先进行排序,假设排完序的结果为a1<=b1<=a2<=b2<=…<=an<=bn
-
a1作为全局最小值,无论跟谁一组a1都会被累加进答案,相反,a1的搭档会被永久排除。
-
既然如此,莫不如排除一个较小的数,即给a1找一个“最小的搭档”b1。
-
当a1、b1被处理之后,a2同理分析。
-
所以,最终选择a1,a2,…,an会得到最好的结果。
代码:
class Solution
public int arrayPairSum(int[] nums)
Arrays.sort(nums);
int ans = 0;
for (int i = 0; i < nums.length; i += 2)
ans += nums[i];
return ans;
执行结果
通过
执行用时:12 ms,在所有 Java 提交中击败了97.41%的用户
内存消耗:40.4 MB,在所有 Java 提交中击败了16.53%的用户
复杂度分析
时间复杂度:O( nlogn)
空间复杂度:O(logn)
💬总结
- 今天是力扣算法题打卡的第106天!
- 文章采用
C#
和Java
两种编程语言进行解题 - 一些方法也是参考力扣大神写的,也是边学习边分享,再次感谢算法大佬们
- 那今天的算法题分享到此结束啦,明天再见!
以上是关于算法千题案例每日一练 LeetCode打卡——106.数组拆分 I的主要内容,如果未能解决你的问题,请参考以下文章
算法千题案例每日一练LeetCode打卡——110.种花问题
算法千题案例每日一练LeetCode打卡——110.种花问题