【发布时间】:2014-11-17 06:42:34
【问题描述】:
我对 C++ 非常陌生,我正在尝试做一些 HackerRank 挑战,以此来解决这个问题。
现在我正在尝试解决愤怒的孩子问题:https://www.hackerrank.com/challenges/angry-children
基本上,它要求创建一个程序,给定一组 N 个整数,找到该集合的 K 长度子集的最小可能“不公平”。不公平定义为 K 长度子集的最大值和最小值之差。
我现在的方法是找到所有 K 长度的子集并计算它们的不公平性,跟踪最小的不公平性。
我编写了以下似乎正确解决问题的 C++ 程序:
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
int unfairness = -1;
int N, K, minc, maxc, ufair;
int *candies, *subset;
void check() {
ufair = 0;
minc = subset[0];
maxc = subset[0];
for (int i = 0; i < K; i++) {
minc = min(minc,subset[i]);
maxc = max(maxc, subset[i]);
}
ufair = maxc - minc;
if (ufair < unfairness || unfairness == -1) {
unfairness = ufair;
}
}
void process(int subsetSize, int nextIndex) {
if (subsetSize == K) {
check();
} else {
for (int j = nextIndex; j < N; j++) {
subset[subsetSize] = candies[j];
process(subsetSize + 1, j + 1);
}
}
}
int main() {
cin >> N >> K;
candies = new int[N];
subset = new int[K];
for (int i = 0; i < N; i++)
cin >> candies[i];
process(0, 0);
cout << unfairness << endl;
return 0;
}
问题在于 HackerRank 要求程序在 3 秒内提出解决方案,而我的程序需要更长的时间才能找到 12/16 的测试用例的解决方案。例如,其中一个测试用例有 N = 50 和 K = 8;该程序需要 8 秒才能在我的机器上找到解决方案。我可以做些什么来优化我的算法?我对 C++ 不是很有经验。
【问题讨论】:
-
你有没有想过对数组进行排序?比数字是间隔的,你只需要看一次 N 的数组。您也可以跳 K 步以使算法更快。假设你在 O(nlog n) 中排序并在 O(n) 中迭代,你将在 O(nlogn) 中完成这项工作,而不考虑所有 N^K 可能的组合。
标签: c++ algorithm optimization