/**
* @param {number[]} gas
* @param {number[]} cost
* @return {number}
*/
var canCompleteCircuit = function(gas, cost) {
if (gas.length === 1) {
return gas[0] < cost[0] ? -1 : 0;
}
const search = (start) => {
let i = 0 ;
let current = 0;
while (i < gas.length) {
const next = start + i++;
current += gas[next % gas.length];
current -= cost[next % gas.length];
if (current < 0) {
return -1;
}
}
return current;
};
for (let i = 0; i < gas.length; i ++) {
if (gas[i] > cost[i]) {
if (search(i) >= 0) {
return i;
}
}
}
return -1;
};
/**
* @param {number[]} bills
* @return {boolean}
*/
var lemonadeChange = function(bills) {
let five = 0, ten = 0, twenty = 0;
for (let i = 0; i < bills.length; i++) {
if (bills[i] === 5) {
five += 1;
} else if (bills[i] === 10) {
if (five === 0) {
return false;
}
five -= 1;
ten += 1;
} else if (bills[i] === 20) {
if (ten === 0) {
if (five < 3) {
return false;
}
five -= 3;
} else if (ten > 0) {
if (five < 1) {
return false;
}
ten -= 1;
five -= 1;
twenty += 1;
}
}
}
return true;
};
/**
* @param {number[]} rowSum
* @param {number[]} colSum
* @return {number[][]}
*/
var restoreMatrix = function(rowSum, colSum) {
const r = rowSum.length;
const c = colSum.length;
const m = new Array(r);
for (let i = 0; i < r; i++) {
m[i] = new Array(c).fill(0);
for (let j = 0; j < c; j++) {
m[i][j] = Math.min(rowSum[i], colSum[j]);
rowSum[i] -= m[i][j];
colSum[j] -= m[i][j];
}
}
return m;
};
/**
* @param {string} s
* @return {string}
*/
var reorganizeString = function(s) {
if (s.length === 1) {
return s;
}
let counts = {};
for (let i = 0; i < s.length; i++) {
const c = s.charAt(i);
counts[c] = counts[c] || 0;
counts[c] += 1;
}
counts = Object.entries(counts);
counts.sort((a, b) => b[1] - a[1]);
let maxChar = counts.shift();
let ans = [], maxrow = maxChar[1];
if (maxrow > (( 1 + s.length) >> 1)) return '';
for (let i = 0; i < maxrow; i++) {
ans[i] = [maxChar[0]];
}
let row = 0;
while(counts.length) {
let [c, max] = counts.shift();
for (let j = 0; j < max; j++, row++) {
ans[row % maxrow].push(c);
}
}
// console.log(ans);
const r = ans.map(item => item.join('')).join('');
return r;
};