在数组中找到总和等于给定值的最小元素

时间:2019-04-20 06:24:37

标签: javascript arrays sorting

我正在尝试找出总和等于的数组中的最小元素 给定的输入。我尝试输入的总和很少,但只能找到一个 在第一种情况下配对,而我需要实现的不仅仅是一对。

var arr = [10, 0, -1, 20, 25, 30];
var sum = 45;
var newArr = [];
console.log('before sorting = ' + arr);

arr.sort(function(a, b) {
  return a - b;
});
console.log('after sorting = ' + arr);

var l = 0;
var arrSize = arr.length - 1;

while (l < arrSize) {

  if (arr[l] + arr[arrSize] === sum) {
    var result = newArr.concat(arr[l], arr[arrSize]);
    console.log(result);
    break;
  } else if (arr[l] + arr[arrSize] > sum) {
    arrSize--;
  } else {
    l++;
  }
}

  

输入数组:[10,0,-1,20,25,30]

     

必填项:45

     

输出:[20,25]

我正在尝试

  

所需总和:59

     

输出:[10,-1、20、30]

4 个答案:

答案 0 :(得分:3)

一种选择是找到数组的all possible subsets,然后通过相加得出所需值的数组对其进行过滤,然后确定长度最小的数组:

const getMinElementsWhichSum = (arr, target) => {
  const subsets = getAllSubsetsOfArr(arr);
  const subsetsWhichSumToTarget = subsets.filter(subset => subset.reduce((a, b) => a + b, 0) === target);
  return subsetsWhichSumToTarget.reduce((a, b) => a.length < b.length ? a : b, { length: Infinity });
};
console.log(getMinElementsWhichSum([10, 0, -1, 20, 25, 30], 45));
console.log(getMinElementsWhichSum([10, 0, -1, 20, 25, 30], 59));

// https://stackoverflow.com/questions/5752002/find-all-possible-subset-combos-in-an-array
function getAllSubsetsOfArr(array) {
    return new Array(1 << array.length).fill().map(
        (e1,i) => array.filter((e2, j) => i & 1 << j));
}

答案 1 :(得分:2)

这可以看作是优化问题,非常适合dynamic programming

这意味着您可以将其分解为一个递归,该递归试图找到越来越小的数组的最小长度,并针对已删除的内容调整总和。如果您的数组是SELECT People.Name ,COUNT(tag_logs.tag_no) FROM `tag_logs` INNER JOIN People ON tag_logs.tag_no = People.nametag GROUP BY tag_logs.tag_no HAVING COUNT(tag_no) >= 1 ,且其总和为[10, 0, -1, 20, 25, 30],您可以将它看作最短的59

min

每次递归操作都会使数组变短,直到您剩下一个元素,然后问题就出在所有减法之后,该元素是否等于剩余的数量。

更容易在代码中显示:

[10, ... shortest([ 0, -1, 20, 25, 30], 49)
[0,  ... shortest([10, 20, 25, 30], 49), 59)
[-1, ... shortest([10, 0, 20, 25, 30], 60)
... continue recursively

这仍然是相当昂贵的计算,但是它比查找所有子集和总和要快得多。

答案 2 :(得分:0)

尝试一下

document.getElementById

答案 3 :(得分:0)

尝试BFS(呼吸优先搜索)algorithym https://en.wikipedia.org/wiki/Breadth-first_search