Create 561. Array Partition I.md

This commit is contained in:
唐树森 2018-09-09 17:52:25 +08:00 committed by GitHub
parent d1f8e2c6e6
commit e69d2aa92c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

50
561. Array Partition I.md Normal file
View File

@ -0,0 +1,50 @@
# [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;
}
};
```