【发布时间】:2019-11-16 19:59:51
【问题描述】:
如何将数组中的元素分成最少数量的数组,使得每个形成的数组的元素值之差不超过1?
假设我们有一个数组:[4, 6, 8, 9, 10, 11, 14, 16, 17]。
数组元素已排序。
我想将数组的元素分成最少数量的数组,以使结果数组中的每个元素的差异不超过 1。
在这种情况下,分组将是:[4], [6], [8, 9, 10, 11], [14], [16, 17]。所以总共会有 5 个组。
我怎样才能为此编写程序?或者你也可以推荐算法。
我尝试了天真的方法: 获取数组的连续元素之间的差异,如果差异小于(或等于)1,我将这些元素添加到新向量中。然而,这种方法非常未优化,并且直接无法显示大量输入的任何结果。
实际代码实现:
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
int main() {
int num = 0, buff = 0, min_groups = 1; // min_groups should start from 1 to take into account the grouping of the starting array element(s)
cout << "Enter the number of elements in the array: " << endl;
cin >> num;
vector<int> ungrouped;
cout << "Please enter the elements of the array: " << endl;
for (int i = 0; i < num; i++)
{
cin >> buff;
ungrouped.push_back(buff);
}
for (int i = 1; i < ungrouped.size(); i++)
{
if ((ungrouped[i] - ungrouped[i - 1]) > 1)
{
min_groups++;
}
}
cout << "The elements of entered vector can be split into " << min_groups << " groups." << endl;
return 0;
}
【问题讨论】:
-
“但是,这种方法非常未经优化,直接无法针对大量输入进行编译。”。这没有意义,任何大小都应该编译。请在代码中展示您的尝试,这不是免费的代码编写服务。
-
另外,你的幼稚方法应该是 O(n) ,这是最优的。只需遍历差异,将元素添加到数组中,当遇到 >2 时,创建一个新数组并开始向其添加追加内容。
-
是什么让你说它未优化?
-
这个论点值得怀疑。
-
涉及这种过程的大多数算法都属于“未优化”的一般类别谁说的?