您的位置:首页 > 编程语言 > C语言/C++

561. Array Partition I

2017-09-21 21:30 489 查看

题目

561. Array Partition I

解题思路

给一串数字然后对其两两组合保证其组合的最小数字之和最大。

很明显最后的sum受到组合的min数字的影响,因此要对这串数字进行排序,保证按序组合才能保证获得的数字之和最大。

具体代码

class Solution {
public:
void swap(vector<int>& nums, int a, int b) {
int t = nums[a];
nums[a] = nums[b];
nums[b] = t;
}

int partition(vector<int>& nums, int left, int right) {
int pivot = nums[right];
int low = left, high = right - 1;

while (low < high) {
while (low < high && nums[low] <= pivot)
++low;
while (low < high && nums[high] > pivot)
--high;
if (low < high)
swap(nums, low, high);
}

if (nums[high] <= pivot)
++high;

swap(nums, high, right);
return high;

}

void quicksort(vector<int>& nums, int left, int right) {
if (left < right) {
int index = partition(nums, left, right);
quicksort(nums, left, index-1);
quicksort(nums, index+1, right);
}
}

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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ leetcode leetcode-java