给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。
输入: [1,4,3,2] , 输出: 4
解释: n 等于 2, 最大总和为 4 = min(1, 2) + min(3, 4).
提示:
n 是正整数,范围在 [1, 10000].
数组中的元素范围在 [-10000, 10000].
解法一:
先对数组排序,然后取偶数下标的总和
原因是拆分数组时,要把最小的数与第二小的数放一块,最大的数与第二大的数放在一块,这样 min() 取值 时拿到的数就会是第二大、第四大、第六大。。。
比如 [1,3,6,10]
min([1,10])+ min([6,3])=4 , min([1,3])+ min([6,10])=7
var arrayPairSum = function(nums) {
nums=quickSort(nums)
var sum=0 , len=nums.length
for(var i=0;i<len;i+=2){
sum+=nums[i]
}
return sum;
};
var quickSort = function(arr){
if(arr.length<=1) return arr;
var pivotIndex=Math.floor(arr.length/2);
var pivot=arr.splice(pivotIndex,1)[0];
var left=[];
var right=[];
for(var i=0;i<arr.length;i++){
if(arr[i]<=pivot){
left.push(arr[i]);
}
else{
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot],quickSort(right));
}
执行用时:204 ms
已经战胜 38.66 % 的 javascript 提交记录