算法题 |
---|
算法题 |
---|
给定长度为 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
提示:
根据题意得知最终结果是最小值累加起来,但是我们的最大值永远只能被排除。
所以此题的核心就是将第二大的值累加起来得出结果即可~
代码:
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%的用户
思路解析 先进行排序,假设排完序的结果为a1<=b1<=a2<=b2<=…<=an<=bn
代码:
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)
C#
和 Java
两种编程语言进行解题