House Robber

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police. Can not break two adjacent houses,

  • Time: O(n)
  • Space: O(n)
public int rob(int[] nums) {
    if (nums == null || nums.length == 0)
        return 0;
    int[] dp = new int[nums.length + 1];
    dp[0] = 0;
    dp[1] = nums[0];
    for (int i = 2; i <= nums.length; i++) {
        dp[i] = Math.max(dp[i - 2] + nums[i - 1], dp[i - 1]);
    }
    return dp[nums.length];
}

House Robber II

All houses at this place are arranged in a circle.

  • Time: O(n)
  • Space: O(n)
public int rob(int[] nums) {
    if (nums == null || nums.length == 0)
        return 0;
    int n = nums.length;
    if (n == 1) {
        return nums[0];
    }
    if (n == 2) {
        return Math.max(nums[1], nums[0]);
    }
    int[] dp1 = new int[n], dp2 = new int[n];;
    dp1[0] = 0;
    dp1[1] = nums[0];
    for (int i = 2; i < n; i++) {
        dp1[i] = Math.max(dp1[i - 1], dp1[i - 2] + nums[i - 1]);
    }
    dp2[0] = 0;
    dp2[1] = nums[1];
    for (int i = 2; i < n; i++) {
        dp2[i] = Math.max(dp2[i - 1], dp2[i - 2] + nums[i]);
    }
    return Math.max(dp1[n - 1], dp2[n - 1]);
}

results matching ""

    No results matching ""