繁体   English   中英

Javascript 找到有条件的最大子数组

[英]Javascript find max subarray with condition


我试图弄清楚如何使我的代码的性能更好一些。
挑战是,给定一个随机度数数组(可能是从 0 到 360)和一个 alpah(度数),我想找到 alpah 值中的最大子数组。
例如:给定 alpah = 30 和数组 = [18,36,10,25,300,318,350]
答案将是 5,因为 18,36,10,25,350 都在 alpah 的距离内(如果您从 18 开始检查)

我当前的代码:

 function countDegrees(alpah, degrees) { let maxSoFar = 0; let maxEndingHere = 1; for(let i = 0; i < degrees.length; i++) { for(let j = 1; j < degrees.length; j++) { if(getDistanceBetweenDegrees(degrees[i],degrees[j]) <= alpah) { maxEndingHere++; } } if(maxSoFar < maxEndingHere) { maxSoFar = maxEndingHere; } maxEndingHere = 1; } return maxSoFar; }

目前,它以 O(N^2) 运行,我听说有一种方法可以使它成为 O(N),有什么想法吗?

我能想到的唯一O(n)方法是使用单个循环并检查当前项目是否在先前使用的项目的“alpah”内:

 function countDegrees(maxDiff, degrees) { let count = 0; let current = degrees[0]; for (const num of degrees) { const naiveDiff = Math.abs(num - current); const diff = Math.min(naiveDiff, 360 - naiveDiff); if (diff <= maxDiff) { count++; current = num; } } return count; } console.log(countDegrees(30, [18, 36, 10, 25, 300, 318, 350]))

25 -> 350 不包括在内,因为相差 35,大于 30。

如果您必须考虑不同的可能分支(即不要贪心并取范围内的第一个可用数字),我认为 O(n) 是不可能的,但我可能是错的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM