DP #190 House Robber

Link: https://leetcode.com/problems/house-robber

class Solution {
    public int rob(int[] nums) {
        int n = nums.length - 1;
        int cache[] = new int[n + 1];
        Arrays.fill(cache, -1);

        // recur(n, cache, nums);
        // tab(n, cache, nums);
        // return cache[n];
        return tabOpt(n, cache, nums);
    }

    // Recursion Memoization Solution
    private int recur(int n, int[] cache, int[] nums) {
        if (n == 0)
            return cache[n] = nums[0];
        if (n < 0)
            return 0;
        if (cache[n] != -1)
            return cache[n];

        int take = nums[n] + recur(n - 2, cache, nums);
        int ntake = recur(n - 1, cache, nums);
        cache[n] = Math.max(take, ntake);
        return cache[n];
    }

    // Tabulation Solution
    private int tab(int n, int[] cache, int[] nums) {
        cache[0] = nums[0];
        for (int i = 1; i <= n; i++) {
            int take = nums[i] + ((i - 2 >= 0) ? cache[i - 2] : 0);
            int ntake = cache[i - 1];
            cache[i] = Math.max(take, ntake);
        }
        return cache[n];
    }

    // Tabulation Space Optimised Solution 
    private int tabOpt(int n, int[] cache, int[] nums) {
        int prev = nums[0], prev2 = 0;
        for (int i = 1; i <= n; i++) {
            int take = nums[i] + prev2;
            int ntake = prev;
            prev2 = prev;
            prev = Math.max(take, ntake);
        }
        return prev;
    }

}