# LeetCode Solution, Easy, 561. Array Partition I

# [561. Array Partition I](https://leetcode.com/problems/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.

### 題目翻譯

有一個參數 `nums` 是一個整數陣列，其中的元素有 `2n` 個。今天要拆分這個陣列，元素兩兩一對。在這樣的分配之下，有許多種組合。要找出各種組合中，兩兩配對後其中的最小值的總是最大的。

## 解法解析

此題的解題邏輯是，要是配對中的最小值。那其實就從小到大排序後，取索引是 `2n` 的值即可。

### 解法範例

#### Go

```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

```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

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

#### PHP

```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

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

#### Rust

```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

```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
    }
}
```

