var rob = (nums, i = 0) => {
const isBaseCase = nums <= i;
if (isBaseCase) return 0;
const [ next, nextNext ] = [ (i + 1), (i + 2) ];
const right = nums[i];
const mid = rob(nums, next);
const left = rob(nums, nextNext);
const house = left + right;
return Math.max(house, mid);
};
var rob = (nums, i = 0, memo = initMemo(nums)) => {
const isBaseCase = nums.length <= i;
if (isBaseCase) return 0;
const hasSeen = 0 <= memo[i];
if (hasSeen) return memo[i];
const [ next, nextNext ] = [ (i + 1), (i + 2) ];
const right = nums[i];
const mid = rob(nums, next, memo);
const left = rob(nums, nextNext, memo);
const house = left + right;
memo[i] = Math.max(mid, house);
return memo[i];
};
const initMemo = (nums) => Array(nums.length + 1).fill(-1);
var rob = (nums) => {
if (!nums.length) return 0;
const tabu = initTabu(nums);
for (let i = 1; i < nums.length; i++) {
const right = nums[i];
const mid = tabu[i];
const left = tabu[i - 1];
const house = left + right;
tabu[i + 1] = Math.max(mid, house);
}
return tabu[nums.length]
};
const initTabu = (nums) => {
const tabu = Array(nums.length + 1).fill(0);
tabu[1] = nums[0];
return tabu;
}
var rob = (nums) => {
if (!nums.length) return 0;
let [ left, mid ] = [ 0, 0 ];
for (const right of nums) {
const temp = mid;
const house = left + right;
mid = Math.max(mid, house);
left = temp;
}
return mid;
};