题目:
思路1:先排序,然后a[2n]的和最小
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int Mid(vector<int>& a,int low,int high){
int pivot = a[low];
while(low < high){
while(low < high && a[high] >= pivot)
high--;
a[low] = a[high];
while(low < high && a[low] <= pivot)
low++;
a[high] = a[low];
}
a[low] = pivot;
return low;
}
void QuickSort(vector<int>& a,int l,int r){
if(l < r){
int mid = Mid(a,l,r);
QuickSort(a,l,mid);
QuickSort(a,mid+1,r);
}
else if(l == r){
return;
}
}
int arrayPairSum(vector<int>& nums) {
QuickSort(nums,0,nums.size()-1);
int sum = 0;
for(int i = 0; i < nums.size(); i += 2)
sum += nums[i];
return sum;
}
};
int main(){
int m[4] = {3,5,1,0};
vector<int> a(m,m+4);
Solution so;
int res = so.arrayPairSum(a);
// for(int i = 0; i < 4; i++)
cout << res << endl;
/*int a = 0, b = 1;
cout << a << ' ' << b << endl;
swap(a, b);
cout << a << ' ' << b << endl;*/
system("pause");
return 0;
}
思路2:
这种思路挺新鲜的,利用数组来排序
class Solution {
public:
int arrayPairSum(vector<int>& nums) {
vector<int> count(20001,0);//题目中说,数的范围在[-10000,10000]
for(int i : nums)
count[i+10000]++;
int res = 0;
int flag = 0;
for(int i = 0; i < count.size(); ){
if(count[i] > 0 && flag == 0){
count[i]--;
res = res + i - 10000;
flag = 1;
}
else if(count[i] > 0 && flag == 1){
count[i]--;
flag = 0;//这里的flag是用来标志是否是第2i个数的标志位
}
else i++;//这里的i++千万不能写在for()中,否则出现有重复数字的情况就麻烦了
}
return res;
}
};