我在现场面试的时候被问到了这个算法问题。由于没有要求我签署保密协议,我将其发布在这里寻求答案。
给定一个数组REAL不包含 0 的数字,找到产生最大乘积的连续元素。该算法应在线性时间内运行
我考虑过以下方法:
使用两个数组。第一个是利用DP思想记录当前max绝对值Product,第二个数组,记录到目前为止遇到的负元素的数量。最终结果应该是最大绝对值最大且负数个数为偶数。
我以为我的方法会起作用,但在编码过程中被打断说它不起作用。
请让我知道上述方法中缺少什么。
该算法确实是 O(n)。迭代数组时,使用一个变量存储到目前为止找到的最大值,一个变量存储以a[i]结尾的子数组的最大值,另一个变量存储以a[i]结尾的最小值来处理负值。
float find_maximum(float arr[], int n) {
if (n <= 0) return NAN;
float max_at = arr[0]; // Maximum value that ends at arr[i]
float min_at = arr[0]; // Minimum value that ends at arr[i]
float max_value = max_at;
for (int i = 1; i < n; i++) {
float prev_max_at = max_at, prev_min_at = min_at;
max_at = max(arr[i], arr[i] * prev_min_at, arr[i] * prev_max_at);
min_at = min(arr[i], arr[i] * prev_min_at, arr[i] * prev_max_at);
max_value = max(max_value, max_at);
}
return max_value;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)