From e69d2aa92c63a90dd98cf71a8f079d8c16316183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E6=A0=91=E6=A3=AE?= <14021051@buaa.edu.cn> Date: Sun, 9 Sep 2018 17:52:25 +0800 Subject: [PATCH] Create 561. Array Partition I.md --- 561. Array Partition I.md | 50 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 561. Array Partition I.md diff --git a/561. Array Partition I.md b/561. Array Partition I.md new file mode 100644 index 0000000..6e81f64 --- /dev/null +++ b/561. Array Partition I.md @@ -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& 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& nums) { + vector hashtable(20001,0); + for(size_t i=0;i0)&&(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; + } +}; +```