求和对的独特排列:Javascript算法
Unique Permutations of Summing Pairs: Javascript Algorithm
我已经完成了一个效率低下但有效的算法,用于计算数组中的哪对数字(arr1)
加起来的总和。我面临这两个问题:
1)它给了我"每个"对(例如,当总和为12时,1+11和11+1),
和
(2)我不希望它给自己添加一个数字(例如 findArrSum([1, 3, 4, 8, 9, 11, 6, ], 12)
我不希望它返回 (6+6))。我可以通过我的 if 语句使它忽略 6,但在这种情况下,它也会忽略解决方案(此示例中的 6+6 findArrSum([1, 3, 4, 8, 9, 11, 6, 6], 12)
.
function findArrSum(arr1, sum) {
var i = 0;
for (i in arr1) {
arr1.map(function(num) {
var answerSum = (num + arr1[i]);
if (answerSum == sum && num != arr1[i]) {
console.log(num +"+" +arr1[i] +"=" +sum);
}
});
}
}
console.log('Enter an array and a sum that you want a pair to add to: ')
一个朴素的算法将是
function findArrSum(arr, sum) {
for(var i=0; i<arr.length; ++i)
for(var j=i+1; j<arr.length; ++j)
if(arr[i] + arr[j] === sum)
console.log(arr[i] + ' + ' + arr[j] + ' = ' + sum);
}
但这要付出n^2
.我们可以通过先排序,然后使用二分搜索来做得更好
function dicSearch(arr, item, from, to) {
if(from === to) return -1;
var mid = Math.floor((from + to) / 2);
if(arr[mid] > item) return dicSearch(arr, item, from, mid);
if(arr[mid] < item) return dicSearch(arr, item, mid+1, to);
return mid;
}
function findArrSum(arr, sum) {
arr.sort(function(a,b) {
return a-b;
});
for(var i=0; i<arr.length; ++i) {
var j = dicSearch(arr, sum-arr[i], i+1, arr.length);
if(j >= 0)
console.log(arr[i] + ' + ' + arr[j] + ' = ' + sum);
}
}
那应该只需要n log n
.您甚至可以通过在达到最小j
时停止迭代来加快速度,而不是达到arr.length
。
但是我们可以通过使用哈希来更快地做到这一点。
function findArrSum(arr, sum) {
var hash = Object.create(null); // Also consider ES6 map
for(var i=0; i<arr.length; ++i) {
var j = hash[arr[i]];
if(j != null)
console.log(arr[i] + ' + ' + arr[j] + ' = ' + sum);
hash[sum-arr[i]] = i;
}
}
平均而言,这仅花费n
。
您的两个问题都可以通过进行一些小的更改来解决,例如
function findArrSum(arr1, sum) {
var i = 0;
var usedSumArray = []; //new array introduced to store already done sums
for (i in arr1) {
arr1.map(function(num) {
var thisSum = num +"+" +arr1[i]; //storing sum string
if ( num != arr1[i] && usedSumArray.indexOf( thisSum ) == -1 ) //checking if the number is same or sum already done
{
usedSumArray.push( thisSum );
var answerSum = (num + arr1[i]);
if (answerSum == sum && num != arr1[i])
{
console.log(num +"+" +arr1[i] +"=" +sum);
}
}
});
}
}
相关文章:
- javascript扫雷器floodfill算法不能正常工作
- Vanilla Javascript算法,如何做和解释
- JavaScript算法,提供每种可能的项目组合,并将它们存储在数组中
- 用于查找基于时间的事件的最佳Javascript算法
- 反转JavaScript算法
- 用于创建数学减法方程的简单JavaScript算法
- JavaScript 算法性能 - 计算可被 k 整除的范围内的数字数
- 求和对的独特排列:Javascript算法
- 函数式 Javascript 算法不从过滤器返回预期结果
- 有效的javascript算法,用于从数组中选择项目,其中每个条目具有不同的权重
- 在javascript算法中使用私有MD5密钥的安全方式
- 从字符串javascript算法中删除字符
- 过滤联系人详细信息的Javascript算法
- 谁可以帮助解释这个JavaScript算法[].filter.call()
- 返回语句在递归javascript算法,如何返回所有的方式堆栈
- 简单的Javascript算法
- 获取类似excel的列名的Javascript算法
- 路径查找javascript算法无法正常工作'他应该这样做
- JavaScript算法转换为罗马数字
- Javascript算法添加数字到文本框