今天看到一道题目,当时不会,听了讲解之后,觉得很有意思,先记录下来。
原题如下:
20 个随机数字,放到 3 个数组中 arr1, arr2,arr3 保证 3 个数组 的和相差最小;
先来解释一下这个题目:
就是把20个随机数放在3个数组中,然后把每个数组中的值相加,最后再把每个数组中的和相减,得到差值是最小的。如果要想有这种效果,就得每个数组中的和都差距不大。
那么这要怎么做呢?
如果用过瀑布流的同学应该知道,传进来的图片大小是不一样的,所以每列的高度也不一样,不能让每列太长或者太短,所以,我们就看那列的高度最短,就把新的图片放在短的那一列上。
同样,这题原理和上面的瀑布流一样的,我们可以判断哪个数组里面的数值最小,然后把新的数值放在这个数组里面。
// 先得到20个随机数,放在arr数组
var length = 20;
var arr = [];
for(var i = 0; i < length; i++){
var index = Math.ceil(Math.random() * 20);
arr.push(index)
}
// 创建3个数组,将arr数组中的3个数分别放在三个数组中
var arr1 = [],
arr2 = [],
arr3 = [];
arr1.push(arr[0]);
arr2.push(arr[1]);
arr3.push(arr[2]);
// 在循环里把各个数组的和求出来,再比较,把新的值放在和小的数组内
for(var i = 3; i < arr.length; i++){
var arr1Size = add(arr1),
arr2Size = add(arr2),
arr3Size = add(arr3);
arr1Size > arr2Size ? (arr2Size > arr3Size ? arr3.push(arr[i]) : arr2.push(arr[i])) : (arr1Size > arr3Size ? arr3.push(arr[i]) : arr1.push(arr[i]))
}
// 然后创建求和的方法
function add(newArr){
var size = 0;
for(var i = 0; i < newArr.length; i++){
size += newArr[i]
}
return size;
}
// 此时这个时候的3个数组的和的差值就是最小的了
console.log(add(arr1));
console.log(add(arr2));
console.log(add(arr3));