javascript - 数组中的序列
问题描述
我有一个算法练习要做,但我不知道该怎么做,因为要求是只使用基本的编程概念。所以 - 关键是在一个数组中找到最长的数字序列,这些数字正在增长或不改变值。
所以对于数组 [1,1,2,4,0,1,7,4],它将是 [1,1,2,4]。
它应该具有尽可能小的时间和内存复杂度。任何解决方案,提示?非常感谢您的任何建议或反馈。
这就是我在过去 10 分钟内设法做到的,但我觉得我正在以最复杂的方式做到这一点......
function idk(array) {
var current = 0;
var winner = 0;
var currentArray = [];
var winnerArray = [];
for (let i = 0; i <= array.length; i++) {
if (array[i + 1] >= array[i]) {
currentArray.push(array[i]);
current = currentArray.length;
} else {
currentArray.push(array[i]);
if (currentArray.length > best.length) {
// copy array and append it to the new array?
}
}
}
return winnerArray;
}
解决方案
为什么要遍历数组的末尾?
因为您可以利用这个优势来收集最后一个最长的序列,而无需在循环后检查是否找到了最长的序列。
但在部分:
为什么不是临时数组?因为没有必要使用它,如果您收集值。序列的 startignn 索引很重要,实际的 indec 决定序列是否长于先前找到的序列。
循环具有两个条件,一个用于继续循环,如果在序列中,另一个用于检查实际结束的序列是否更长。并用于存储实际索引。
检查未定义值的最后一个循环是false
,它不会继续循环,并且 nect 检查会显示新的最长序列或没有。
其他一些注释:
winnerArray
必须是一个空数组,因为稍后要检查length
- 序列检查取前一个元素,因为循环从第一个索引开始,并且给出了前一个元素。
- 大O是 O(n)。
function idk(array) {
let winnerArray = [],
index = 0;
for (let i = 1; i < array.length + 1; i++) {
if (array[i - 1] <= array[i]) continue;
if (i - index > winnerArray.length) winnerArray = array.slice(index, i);
index = i;
}
return winnerArray;
}
console.log(...idk([1, 1, 2, 4, 0, 1, 7, 4])); // [1, 1, 2, 4]
console.log(...idk([1, 8, 1, 1, 5, 7, 2, 2])); // [1, 1, 5, 7]
console.log(...idk([1, 8, 1, 1, 5, 7, 2, 2, 2, 2, 2]));
推荐阅读
- angular - 使用条纹支付按钮时无法关闭角度材质对话框
- java - java.lang.ClassCastException:java.util.LinkedHashMap 无法转换为 com.mx.model.usermgmt.UserDetails
- c++ - 面向对象编程 - 位域私有结构的公共参考
- python-3.x - 在 Python 中的列表中创建连续项目的矩阵
- r - R:从向量中复制某些元素并将它们粘贴到数据框中
- class - 重新定义模板专业化
- python - 如何打印从'startswith'到'endswith'的部分字符串
- python - 如何计算图像中非连续形状内的面积?
- visual-studio-code - 自动更新在 VSCode 中不起作用:无法创建临时目录:权限被拒绝
- javascript - 如果超时过期如何跳过一段代码