数组中最大尺寸为 2,并且其总和小于给定值的最小划分
问题陈述
给定一个正数数组 arr[],找出满足以下属性的数组中的最小集合数:
- 一个集合最多包含两个元素。这两个元素无需连续。
- 集合中元素之和应小于或等于给定的键值。可以假设给定的键值大于或等于数组中的最大元素。
示例
如果 arr[] = {1, 2, 3, 4},k = 5,则可以创建以下 2 对:
{1, 4} 和 {2, 3}
算法
- 对数组进行排序
- 从已排序数组的两端开始,如果两数之和小于或等于给定的键值,则将它们作为一个集合,否则仅考虑最后一个元素
示例
#include <iostream> #include <algorithm> using namespace std; int getMinSets(int *arr, int n, int key) { int i, j; sort (arr, arr + n); for (i = 0, j = n - 1; i <= j; ++i) { if (arr[i] + arr[j] <= key) { --j; } } return i; } int main() { int arr[] = {1, 2, 3, 4}; int key = 5; int n = sizeof(arr) / sizeof(arr[0]); cout << "Minimum set = " << getMinSets(arr, n, key) << endl; return 0; }
输出
编译并执行以上程序时,将生成以下输出:
Minimum set = 2
广告