分组
题目
Description
对于一个整数数列A[0], A[1], …, A[N-1]进行分组,要求每组1到2个数,并且同组之和不能大于w. 求最少可以分成多少组.
1 <= N <= 100000, 1 <= A[i] <= w <= 1000000000.
请实现下面Solution类中计算minPartition(A, w)的函数.
class Solution {
public:
int minPartition(vector<int> A, int w) {
}
};
例1:当A = {2, 5, 4, 3}, w = 5, minPartition(A, w)返回3. 将2和3放一组,4和5各自单独作为一组,共3组.
例2:当A = {2, 5, 4, 3}, w = 7, minPartition(A, w)返回2. 将2和5放一组,3和4一组,共2组.
解析
对给定的数组进行排序,然后有两个变量i = 0, j = array.size() - 1
,分别遍历数组。i
是从左到右遍历数组,j
是从右到左遍历数组。
分组数count初始化为0。
当i
或者j
每次变化的时候,判断array[i] + array[j]
和 w
:
- 若
array[i] + array[j] <= w
,则i++
。 - 若
array[i] + array[j] > w
,则count++
,j--
。
重复上面的变化直到i == j
。
解决
程序实现的时候,temp
相当于i
,i
相当于j
。
class Solution {
public:
int minPartition(vector<int> A, int w) {
int result = 0;
int temp = 0;
int num = A.size();
sort(A.begin(), A.end());
for (int i = num - 1; i > -1; i--) {
if (i == temp) {
result++;
} else if (i < temp) {
result++;
} else if (i > temp) {
if (A[temp] + A[i] <= w) {
temp++;
} else {
result++;
}
}
}
return result;
}
};