【发布时间】:2015-06-21 05:13:31
【问题描述】:
面试题:
给你一个数组中的 N 个数字。一个数字的组 是数组的非空连续段。组的大小是该组中数字的数量。
令A 为组中的最小数。任务是为每个x (1 x 组中A的最大值em>x.
例如,如果 N = 3 并且数组是 [1,2,3],那么答案将是 3 (x = 1), 2 (x = 2), 1 ( x = 3)。
数组中的数字可以重复(例如N = 7,数组可以是[1,2,3,4,5,4,6]。
为了解释,下面的 C 代码是一个幼稚的解决方案:
#include <stdio.h>
int main() {
int a[] = {6,1,3,2,5,4,7};
size_t N = sizeof a / sizeof *a;
for (size_t i=0; i<N; ++i) printf("%d ", a[i]); puts("\n");
size_t group_size, start, i;
int max, min;
for (group_size = 1; group_size <= N; ++group_size) {
max = 0;
for (start = 0; start <= N - group_size; ++start) {
min = a[start];
for (i = start + 1; i < start + group_size; ++i) {
if (a[i] < min)
min = a[i];
}
if (min > max)
max = min;
}
printf("%d ", max);
}
return 0;
}
输出:
6 1 3 2 5 4 7
7 4 4 2 2 1 1
【问题讨论】:
-
我多次阅读您的描述,但仍然无法找出您要指定的内容。您能否在示例答案中详细说明您是如何得出“3,2,1”的?
-
@SpecialSauce size =1 可能的连续子数组 - {1},{2},{3} ,现在最小值的最大值将为 3 ,size = 2 ,可能的连续子数组 {1,2 } {2,3} 。现在最小值的最大值将是 2 ,同样对于 size = 3 ,最小值的最大值将是 1,所以答案是 3,2,1
标签: algorithm dynamic-programming