Rick is really fond of fruit juices, but he is bored of their traditional flavours. Therefore, he has decided to mix as many of them as possible to obtain something entirely new as a result.
He has N glasses, numbered from 0 to N-1, each containing a different kind of juice. The J-th glass has capacity[J] units of capacity and contains juice[J] units of juice. In each glass there is at least one unit of juice.
Rick want to create a multivitamin mix in one of the glasses. He is going to do it by pouring juice from several other glasses into the chosen one. Each of the used glasses must be empty at the end (all of the juice from each glass has to be poured out).
What is the maximum number of flavours that Rick can mix?
Write a function:
function solution(juice, capacity);
that, given arrays juice and capacity, both of size N, returns the maximum number of flavours that Rick can mix in a single glass.
Examples:
1. Given juice = [10, 2, 1, 1] and capacity = [10, 3, 2, 2], your function should return 2. Rick can pour juice from the 3rd glass into the 2nd one.
2. Given juice = [1, 2, 3, 4] and capacity = [3, 6, 4, 4], your function should return 3. Rick can pour juice from the 0th and 2nd glasses into the 1st one.
3. Given juice = [2, 3] and capacity = [3, 4], your function should return 1. No matter which glass he chooses, Rick cannot pour juice from the other one into it. The maximum number of flavours in the chosen glass is 1.
4. Given juice = [1, 1, 5] and capacity = [6, 5, 8], your function should return 3. Rick can mix all juices in the 2nd glass.
Write an efficient algorithm for the following assumptions:
- N is an integer within the range [2..100,000];
- each element of arrays juice and capacity is an integer within the range [1..1,000,000,000];
- arrays juice and capacity have the same length, equal to N;
- for each J juice[J] ≤ capacity[J].
function solution(juice, capacity) {
let maxJuiceFlavors = 1;// number of diferent flavors
let currJuiceInGlass = 0;// the sum of juice quantities
let targetGlass = -1;
let lastTestesGlass = -1;
let currCapacity = 0;
let glasses = [];
// Find the glass with the max empty space
for (let i = 0; i < juice.length; i++) {
let j = juice[i];
let c = capacity[i];
let e = c - j;
glasses.push([j, c]);
if(e > currCapacity){
currCapacity = e;
targetGlass = i;
}
}
if(currCapacity < 1) return maxJuiceFlavors;
currJuiceInGlass = glasses[targetGlass][0];
// Remove the targetGlass from the new glasses array
glasses.splice(targetGlass,1);
// Sort the remaining glasses
glasses.sort((g1, g2) => g1[0] == g2[0] ? g1[1] - g2[1] : g1[0] - g2[0]);
// Pour every other juice using the target glass capacity
for(let i = 0; i < glasses.length; i++){
currCapacity -= glasses[i][0];
lastTestesGlass = i;
if(currCapacity < 0) break;
currJuiceInGlass += glasses[i][0];
maxJuiceFlavors++;
if(i + 1 == glasses.length) lastTestesGlass = glasses.length;// Edge case where all glasses were added
}
// Find edge case where one other glass can fit more juice
for(let i = 0; i < glasses.length - lastTestesGlass; i++){
let currGlass = i + lastTestesGlass;
if(glasses[currGlass][1] - glasses[currGlass][0] >= currJuiceInGlass) {
return maxJuiceFlavors + 1;
}
}
return maxJuiceFlavors;
}
function solution(juice, capacity) {
let maxJuiceFlavors = 1;// number of diferent flavors
let currJuiceInGlass = 0;// the sum of juice quantities
let targetGlass = -1;
let lastTestesGlass = -1;
let currCapacity = 0;
let glasses = [];
// Find the glass with the max empty space
for (let i = 0; i < juice.length; i++) {
let j = juice[i];
let c = capacity[i];
let e = c - j;
glasses.push([j, c]);
if(e > currCapacity){
currCapacity = e;
targetGlass = i;
}
}
if(currCapacity < 1) return maxJuiceFlavors;
currJuiceInGlass = glasses[targetGlass][0];
// Remove the targetGlass from the new glasses array
glasses.splice(targetGlass,1);
// Sort the remaining glasses
glasses.sort((g1, g2) => g1[0] == g2[0] ? g1[1] - g2[1] : g1[0] - g2[0]);
// Pour every other juice using the target glass capacity
for(let i = 0; i < glasses.length; i++){
currCapacity -= glasses[i][0];
if(currCapacity < 0) break;
currJuiceInGlass += glasses[i][0];
maxJuiceFlavors++;
lastTestesGlass = i + 1;
}
// Find edge case where one other glass can fit more juice
for(let i = 0; i < glasses.length - lastTestesGlass; i++){
let currGlass = i + lastTestesGlass;
if(glasses[currGlass][1] - glasses[currGlass][0] >= currJuiceInGlass) {
return maxJuiceFlavors + 1;
}
}
return maxJuiceFlavors;
}
function solution(juice, capacity) {
let maxJuiceFlavors = 1;// number of diferent flavors
let currJuiceInGlass = 0;// the sum of juice quantities
let targetGlass = -1;
let lastTestesGlass = -1;
let currCapacity = 0;
let glasses = [];
// Find the glass with the max empty space
for (let i = 0; i < juice.length; i++) {
let j = juice[i];
let c = capacity[i];
let e = c - j;
glasses.push([j, c]);
if(e > currCapacity){
currCapacity = e;
targetGlass = i;
}
}
if(currCapacity < 1) return maxJuiceFlavors;
currJuiceInGlass = glasses[targetGlass][0];
// Remove the targetGlass from the new glasses array
glasses.splice(targetGlass,1);
// Sort the remaining glasses
glasses.sort((g1, g2) => g1[0] == g2[0] ? g1[1] - g2[1] : g1[0] - g2[0]);
// Pour every other juice using the target glass capacity
for(let i = 0; i < glasses.length; i++){
currCapacity -= glasses[i][0];
if(currCapacity < 0) break;
currJuiceInGlass += glasses[i][0];
maxJuiceFlavors++;
lastTestesGlass = i + 1;
}
// Find edge case where one other glass can fit more juice
for(let i = 0; i < glasses.length - lastTestesGlass; i++){
let currGlass = i + lastTestesGlass;
if(glasses[currGlass][1] - glasses[currGlass][0] >= currJuiceInGlass) {
return maxJuiceFlavors + 1;
}
}
return maxJuiceFlavors;
}
TypeError: Cannot read property '1' of undefined at solution (solution.js:45:28) at solutionWrapper (/tmp/exec.js:412:28) at Promise.resolve.then (/tmp/exec.js:438:24) at <anonymous> at process._tickCallback (internal/process/next_tick.js:188:7) at Function.Module.runMain (module.js:686:11) at startup (bootstrap_node.js:187:16) at bootstrap_node.js:608:3
function solution(juice, capacity) {
let maxJuiceFlavors = 1;// number of diferent flavors
let currJuiceInGlass = 0;// the sum of juice quantities
let targetGlass = -1;
let lastTestesGlass = 0;
let currCapacity = 0;
let glasses = [];
// Find the glass with the max empty space
for (let i = 0; i < juice.length; i++) {
let j = juice[i];
let c = capacity[i];
let e = c - j;
glasses.push([j, c]);
if(e > currCapacity){
currCapacity = e;
targetGlass = i;
}
}
if(currCapacity < 1) return maxJuiceFlavors;
currJuiceInGlass = glasses[targetGlass][0];
// Remove the targetGlass from the new glasses array
glasses.splice(targetGlass,1);
// Sort the remaining glasses
glasses.sort((g1, g2) => g1[0] == g2[0] ? g1[1] - g2[1] : g1[0] - g2[0]);
// Pour every other juice using the target glass capacity
for(let i = 0; i < glasses.length; i++){
currCapacity -= glasses[i][0];
if(currCapacity < 0) break;
currJuiceInGlass += glasses[i][0];
lastTestesGlass = i + 1;
maxJuiceFlavors++;
}
// Find edge case where one other glass can fit more juice
for(let i = 0; i < glasses.length - lastTestesGlass; i++){
let currGlass = i + lastTestesGlass;
if(glasses[currGlass][1] - glasses[currGlass][0] >= currJuiceInGlass) return maxJuiceFlavors + 1;
}
return maxJuiceFlavors;
}
function solution(juice, capacity) {
let maxJuiceFlavors = 1;// number of diferent flavors
let currJuiceInGlass = 0;// the sum of juice quantities
let targetGlass = -1;
let lastTestesGlass = 0;
let currCapacity = 0;
let glasses = [];
// Find the glass with the max empty space
for (let i = 0; i < juice.length; i++) {
let j = juice[i];
let c = capacity[i];
let e = c - j;
glasses.push([j, c]);
if(e > currCapacity){
currCapacity = e;
targetGlass = i;
}
}
if(currCapacity < 1) return maxJuiceFlavors;
currJuiceInGlass = glasses[targetGlass][0];
// Remove the targetGlass from the new glasses array
glasses.splice(targetGlass,1);
// Sort the remaining glasses
glasses.sort((g1, g2) => g1[0] == g2[0] ? g1[1] - g2[1] : g1[0] - g2[0]);
// Pour every other juice using the target glass capacity
for(let i = 0; i < glasses.length; i++){
currCapacity -= glasses[i][0];
if(currCapacity < 0) break;
currJuiceInGlass += glasses[i][0];
lastTestesGlass = i + 1;
maxJuiceFlavors++;
}
// Find edge case where one other glass can fit more juice
for(let i = 0; i < glasses.length - lastTestesGlass; i++){
let currGlass = i + lastTestesGlass;
if(glasses[currGlass][1] - glasses[currGlass][0] >= currJuiceInGlass) return maxJuiceFlavors + 1;
}
return maxJuiceFlavors;
}
function solution(juice, capacity) {
let maxJuiceFlavors = 1;// number of diferent flavors
let currJuiceInGlass = 0;// the sum of juice quantities
let targetGlass = -1;
let lastTestesGlass = 0;
let currCapacity = 0;
let glasses = [];
// Find the glass with the max empty space
for (let i = 0; i < juice.length; i++) {
let j = juice[i];
let c = capacity[i];
let e = c - j;
glasses.push([j, c]);
if(e > currCapacity){
currCapacity = e;
targetGlass = i;
}
}
if(currCapacity < 1) return maxJuiceFlavors;
currJuiceInGlass = glasses[targetGlass][0];
// Remove the targetGlass from the new glasses array
glasses.splice(targetGlass,1);
// Sort the remaining glasses
glasses.sort((g1, g2) => g1[0] == g2[0] ? g1[1] - g2[1] : g1[0] - g2[0]);
// Pour every other juice using the target glass capacity
for(let i = 0; i < glasses.length; i++){
currCapacity -= glasses[i][0];
if(currCapacity < 0) break;
currJuiceInGlass += glasses[i][0];
lastTestesGlass = i + 1;
maxJuiceFlavors++;
}
// Find edge case where one other glass can fit more juice
for(let i = 0; i < glasses.length - lastTestesGlass; i++){
let currGlass = i + lastTestesGlass;
if(glasses[currGlass][1] - glasses[currGlass][0] >= currJuiceInGlass) return maxJuiceFlavors + 1;
}
return maxJuiceFlavors;
}
function solution(juice, capacity) {
let maxJuiceFlavors = 1;// number of diferent flavors
let currJuiceInGlass = 0;// the sum of juice quantities
let targetGlass = -1;
let lastTestesGlass = 0;
let currCapacity = 0;
let glasses = [];
// Find the glass with the max empty space
for (let i = 0; i < juice.length; i++) {
let j = juice[i];
let c = capacity[i];
let e = c - j;
glasses.push([j, c]);
if(e > currCapacity){
currCapacity = e;
targetGlass = i;
}
}
if(currCapacity < 1) return maxJuiceFlavors;
currJuiceInGlass = glasses[targetGlass][0];
// Remove the targetGlass from the new glasses array
glasses.splice(targetGlass,1);
// Sort the remaining glasses
glasses.sort((g1, g2) => g1[0] == g2[0] ? g1[1] - g2[1] : g1[0] - g2[0]);
// Pour every other juice using the target glass capacity
for(let i = 0; i < glasses.length; i++){
currCapacity -= glasses[i][0];
if(currCapacity < 0) break;
currJuiceInGlass += glasses[i][0];
lastTestesGlass = i + 1;
maxJuiceFlavors++;
}
// Find edge case where one other glass can fit more juice
for(let i = 0; i < glasses.length - lastTestesGlass; i++){
let currGlass = i + lastTestesGlass;
if(glasses[currGlass][1] - glasses[currGlass][0] >= currJuiceInGlass) return maxJuiceFlavors + 1;
}
return maxJuiceFlavors;
}
The solution obtained perfect score.
Tests in which the glass with the biggest capacity is not the one that should be picked as the base.
Tests in which the glass with the largest empty space is not the picked as the base.