https://leetcode-cn.com/problems/array-partition-i/
思路:贪心,结论很简单,从小到大排序后取奇数位置的和即为答案,证明略去。
class Solution {
public:
int arrayPairSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n=nums.size(),ans=0;
for(int i=0;i<n;i+=2)
ans+=nums[i];
return ans;
}
};
计数排序也是不错的选择:
class Solution {
public:
vector<int> countSort(vector<int> &nums)
{
int base=1e4,n=nums.size(),MIN=2e4,MAX=-2e4;
vector<int> cnt(base<<1|1);
vector<int> sorted(n);
for(int i=0;i<n;i++)
{
++cnt[nums[i]+base];
if(nums[i]>MAX)
MAX=nums[i];
if(nums[i]<MIN)
MIN=nums[i];
}
for(int i=MIN+base+1;i<=MAX+base;i++)
cnt[i]+=cnt[i-1];
for(int i=0;i<n;i++)
{
sorted[cnt[nums[i]+base]-1]=nums[i];
--cnt[nums[i]+base];
}
return move(sorted);
}
int arrayPairSum(vector<int>& nums) {
nums=countSort(nums);
int n=nums.size(),ans=0;
for(int i=0;i<n;i+=2)
ans+=nums[i];
return ans;
}
};