# 561. Array Partition I

## 題目敘述

Given an integer array `nums` of `2n` integers, group these integers into `n` pairs `(a1, b1), (a2, b2), ..., (an, bn)` such that the sum of `min(ai, bi)` for all `i` is maximized. Return the maximized sum.

Example 1:

``````Input: nums = [1,4,3,2]
Output: 4
Explanation: All possible pairings (ignoring the ordering of elements) are:
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
So the maximum possible sum is 4.
``````

Example 2:

``````Input: nums = [6,2,6,5,1,2]
Output: 9
Explanation: The optimal pairing is (2, 1), (2, 5), (6, 6). min(2, 1) + min(2, 5) + min(6, 6) = 1 + 2 + 6 = 9.
``````

Constraints:

• `1 <= n <= 10**4`
• `nums.length == 2 * n`
• `-10**4 <= nums[i] <= 10**4`

Hint 1

Obviously, brute force won't help here. Think of something else, take some examples like 1,2,3,4.

Hint 2

How will you make pairs to get the result? There must be some pattern.

Hint 3

Did you observe that- Minimum element gets added to the result in a sacrifice of a maximum element?

Hint 4

Still won't be able to find pairs? Sort the array and try to find the pattern.

## 解法解析

### 解法範例

#### Go

``````func arrayPairSum(nums []int) int {
sort.Ints(nums)

sum := 0
for i := 0; i < len(nums); i += 2 {
sum += nums[i]
}
return sum
}
``````

#### JavaScript

``````/**
* @param {number[]} nums
* @return {number}
*/
var arrayPairSum = function (nums) {
return nums.sort((a, b) => a - b).reduce((sum, cur, i) => (i % 2 === 0 ? (sum += cur) : sum), 0);
};
``````

#### Kotlin

``````class Solution {
fun arrayPairSum(nums: IntArray): Int {
nums.sort()
return nums.filterIndexed { index, _ -> index % 2 == 0 }.sum()
}
}
``````

#### PHP

``````class Solution
{

/**
* @param Integer[] \$nums
* @return Integer
*/
function arrayPairSum(\$nums)
{
sort(\$nums);
\$sum = 0;
for (\$i = 0; \$i < count(\$nums); \$i += 2) {
\$sum += \$nums[\$i];
}
return \$sum;
}
}
``````

#### Python

``````class Solution:
def arrayPairSum(self, nums: List[int]) -> int:
return sum(sorted(nums)[::2])
``````

#### Rust

``````impl Solution {
pub fn array_pair_sum(nums: Vec<i32>) -> i32 {
let mut nums = nums;
nums.sort();
nums.iter().step_by(2).sum()
}
}
``````

#### Swift

``````class Solution {
func arrayPairSum(_ nums: [Int]) -> Int {
let nums: [Int] = nums.sorted()
var res: Int = 0
for i: Int in 0..<nums.count / 2 {
res += nums[i * 2]
}
return res
}
}
``````