是否有 "named" 算法用于按存储桶大小对数组进行分区
Is there a "named" algorithm for partitioning arrays by bucket sizes
我想获取一个输入数组和一组可能的大小,并将该数组划分为子数组,每个子数组的最大可能存储桶大小都小于剩余项数。
所以给定输入数组...
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
还有尺码...
[10, 5, 3, 2, 1]
它会 return 一个像...
这样的数组
[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [11, 12, 13], [14]]
先分区10再分区3再分区1
我可以使用 while 循环等以非常笨拙的方式做到这一点,但我想知道这种算法是否有某种名称,我可以研究一些更优雅的实现方式。
感谢@AnandUndavia,我解决了这个问题,不是作为数组分区练习,而是作为硬币找零问题。
我能够使用此函数解决此问题...(在 Swift 中)
func separate(numberOfItems n: Int, bucketSizes sizes: [Int]) -> [Int] {
var output = [Int]()
var remaining = n
for size in sizes {
while remaining >= size {
output.append(size)
remaining -= size
}
}
return output
}
现在有了我的大小数组,我可以轻松解决我正在处理的其余问题:D
您也可以在单循环中实现。像这样的是 JS:
var inputArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];
var sizeArray = [10, 3, 5, 2, 1];
var outputArray = [];
sizeArray.sort(function(a, b) { return b-a}); // Sort array in decreasing order
while(sizeArray.length > 0 && inputArray.length > 0){
var m = sizeArray[0];
sizeArray = sizeArray.slice(1); // Pop the first element from Size Array
if(m <= inputArray.length){
outputArray.push(inputArray.slice(0, m)); // Extract first m elements from inputArray if its size is greater than m
inputArray = inputArray.slice(m);
}
}
console.log(outputArray);
我想获取一个输入数组和一组可能的大小,并将该数组划分为子数组,每个子数组的最大可能存储桶大小都小于剩余项数。
所以给定输入数组...
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
还有尺码...
[10, 5, 3, 2, 1]
它会 return 一个像...
这样的数组[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [11, 12, 13], [14]]
先分区10再分区3再分区1
我可以使用 while 循环等以非常笨拙的方式做到这一点,但我想知道这种算法是否有某种名称,我可以研究一些更优雅的实现方式。
感谢@AnandUndavia,我解决了这个问题,不是作为数组分区练习,而是作为硬币找零问题。
我能够使用此函数解决此问题...(在 Swift 中)
func separate(numberOfItems n: Int, bucketSizes sizes: [Int]) -> [Int] {
var output = [Int]()
var remaining = n
for size in sizes {
while remaining >= size {
output.append(size)
remaining -= size
}
}
return output
}
现在有了我的大小数组,我可以轻松解决我正在处理的其余问题:D
您也可以在单循环中实现。像这样的是 JS:
var inputArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];
var sizeArray = [10, 3, 5, 2, 1];
var outputArray = [];
sizeArray.sort(function(a, b) { return b-a}); // Sort array in decreasing order
while(sizeArray.length > 0 && inputArray.length > 0){
var m = sizeArray[0];
sizeArray = sizeArray.slice(1); // Pop the first element from Size Array
if(m <= inputArray.length){
outputArray.push(inputArray.slice(0, m)); // Extract first m elements from inputArray if its size is greater than m
inputArray = inputArray.slice(m);
}
}
console.log(outputArray);