LeetCode/561. Array Partition I.md
2018-09-09 17:52:25 +08:00

51 lines
1.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# [561. Array Partition I](https://leetcode.com/problems/array-partition-i/description/)
# 思路
## 思路一
仔细分析题目先进行一个min(ai, bi)的操作再进行sum而且要求和尽可能大。
min(ai, bi)操作可以看做是去掉一个二者之间较大的数即我们要使每次min(ai, bi)去掉的值不太大最好很容易想到当ai、bi最接近时最好。
例如若a < b < c < d, 那么应该分成ab, cd这样sum就为a+c若分为acbd那么sum就为a+b
即如果将数组排序那么结果就是偶数位置的元素和
## 思路二
由于元素范围已知所以排序时可考虑用hash进行O(n)的排序
# C++
## 思路一
```
class Solution {
public:
int arrayPairSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
int sum = 0;
for(int i = 0; i < nums.size()/2; i++)
sum += nums[i * 2];
return sum;
}
};
```
## 思路二
```
class Solution {
public:
int arrayPairSum(vector<int>& nums) {
vector<int> hashtable(20001,0);
for(size_t i=0;i<nums.size();i++)
{
hashtable[nums[i]+10000]++;
}
int ret=0;
int flag=0;
for(size_t i=0;i<20001;){
if((hashtable[i]>0)&&(flag==0)){
ret=ret+i-10000;
flag=1;
hashtable[i]--;
}else if((hashtable[i]>0)&&(flag==1)){
hashtable[i]--;
flag=0;
}else i++;
}
return ret;
}
};
```