Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), ..., (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large as possible.
Example 1:
Input: [1,4,3,2]
Output: 4
Explanation: n is 2, and the maximum sum of pairs is 4 = min(1, 2) + min(3, 4).
方法一、快速排序+算排序后的偶数序号的和
时间复杂度: O(nlogn) 空间复杂度:O(n)
class Solution {
public int arrayPairSum(int[] nums) {
Qsort(nums,0,nums.length-1);
int sum_tmp = 0;
for(int i=0; i<nums.length; i++){
if (i%2==0){
sum_tmp+=nums[i];
}
}
return sum_tmp;
}
public static void Qsort(int[] nums, int first, int last){
if (first>=last){
return;
}
int key = nums[first];
int first_index = first;
int last_index = last;
while(first_index < last_index){
while(first_index<last_index && nums[last_index] >= key){
last_index--;
}
nums[first_index] = nums[last_index];
while(first_index<last_index && nums[first_index] <= key){
first_index++;
}
nums[last_index] = nums[first_index];
}
nums[first_index] = key;
Qsort(nums,first,first_index);
Qsort(nums,first_index+1,last);
}
}
方法二、用空间换时间,不排序,而是把他们储存在数组里,就自动排序了。
时间复杂度O(n)
class Solution {
public int arrayPairSum(int[] nums) {
int[] sort_result = new int[20001];
int sum = 0;
for (int i=0; i<nums.length; i++){
sort_result[nums[i]+10000]++;
}
boolean flag = false;
for(int i=0; i<20001; i++){
while(sort_result[i]!=0){
if(!flag){
sum += i-10000;
flag = !flag;
}
sort_result[i]--;
flag = !flag;
}
}
return sum;
}
}