javascript - 生成以下结果的更好算法是什么?
问题描述
我们有一个具有n
数字(非零)的数组输入,即
input--> [a1, a2, a3, a4, a5, ...., aN] (not in order)
现在我们希望输出为
output--> Ai <= Aj >= Ak <= Al >= Am <= ....An.
我已经为这个问题编写了一个代码,如果我谈论时间和空间复杂度,它很好但没有优化,那么它一定不是好的解决方案。
function test(array){
if(array && array.length){
let newArray = [];
array = array.sort();
let m;
if(array.length % 2){
m = (array.length +1 )/2;
}else{
m = (array.length)/2;
}
newArray.push(array[m-1]);
for(let i=1;i<=m;i++){
if(array[m-1+i])
newArray.push(array[m-1+i]);
if(array[m-1-i])
newArray.push(array[m-1-i]);
}
console.log(newArray);
return newArray;
}else{
throw 'invalid argument';
}
}
test([1,2,3,4]);
如果您有任何想法像不使用其他变量一样进行优化,请帮助我(它将降低空间复杂度)。谢谢
解决方案
您不需要对数组进行排序。只需对数组进行一次传递,并且在每个步骤中仅修复 a[i]、a[i+1]。
假设 a[1] <= a[2] >= a[3]...<= a[i-1] >= a[i]
现在,如果 a[i] <= a[i+1],继续增加 i。
如果 a[i] > a[i+1],交换它们。
对称地,当 i 为偶数时,如果 a[i] < a[i+1] 交换 a[i],a[i+1]。
推荐阅读
- javascript - 如何访问当组件的某个状态为真时加载的 react native 中的元素?
- uwp - 通用 Windows 应用无法启动,“AppxDeploymentFailureBlue”
- c# - 无法访问主数据库的实体框架迁移
- java - 我的数据库应用程序已停止工作并且无法打开
- r - 无法将数据框导出到 xlsx 文件
- c - 运行时错误:C 中学生详细信息的结构
- javascript - javascript img src 路径 + 变量连接
- php - 如何将送货地址和帐单地址从 Bigcommerce 发送到 cloudcommercepro
- sql - 如何授予系统表权限并在redshift中查看
- debugging - 如何处理 vscode 调试扩展中的循环和行?