mirror of
https://github.com/ShusenTang/LeetCode.git
synced 2024-09-02 14:20:01 +00:00
Create 561. Array Partition I.md
This commit is contained in:
parent
d1f8e2c6e6
commit
e69d2aa92c
50
561. Array Partition I.md
Normal file
50
561. Array Partition I.md
Normal 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, 那么应该分成a、b, c、d,这样sum就为a+c,若分为a、c,b、d,那么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;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
Loading…
Reference in New Issue
Block a user