首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LeetCode:房屋抢劫犯II C#

LeetCode:房屋抢劫犯II C#
EN

Code Review用户
提问于 2019-09-20 19:45:33
回答 1查看 225关注 0票数 2

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

你是一个职业抢劫犯,打算抢劫街道上的房屋。每间房子都藏着一定数量的钱。这个地方的所有房屋都被围成一圈。这意味着第一栋房子是最后一栋房子的邻居。同时,相邻的房屋都有安全系统连接,如果两个相邻的房屋在同一晚被闯入,它将自动与警方联系。给出一张代表每所房子的金额的非负整数的清单,确定你今晚可以抢劫的最高金额,而无需报警。例1:输入:2,3,2输出:3解释:你不能抢劫房子1(货币= 2),然后抢劫房子3(货币= 2),因为它们是相邻的房屋。示例2:输入:1,2,3,1输出:4解释: Rob 1 (money = 1),然后rob 3 (money = 3)。你可以抢劫的总数=1+3= 4。

代码语言:javascript
复制
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace CirucularArray
{
    /// <summary>
    /// google interview
    /// https://www.geeksforgeeks.org/maximum-sum-in-circular-array-such-that-no-two-elements-are-adjacent/
    /// https://leetcode.com/problems/house-robber-ii/
    /// </summary>
    [TestClass]
    public class MaximumSumCircularArrayNo2ElementsAreAdjacent
    {
        [TestMethod]
        public void RobberTestEvenArray()
        {
            int[] arr = {1, 2, 3, 4, 5, 1};
            int result = Rob(arr);
            Assert.AreEqual(9, result);

        }
        [TestMethod]
        public void RobberTestOddArray()
        {
            int[] arr = { 5, 1, 2, 10 ,5 };
            int result = Rob(arr);
            Assert.AreEqual(15, result);

        }

        [TestMethod]
        public void TestMethodOneItem()
        {
            int[] arr = {1 };
            int result = Rob(arr);
            Assert.AreEqual(1, result);
        }

        public int Rob(int[] nums)
        {
            if (nums == null || nums.Length == 0)
            {
                return 0;
            }

            if (nums.Length == 1)
            {
                return nums[0];
            }

            return Math.Max(Helper(0, nums.Length - 2,nums), Helper(1, nums.Length - 1,nums));
        }

        private int Helper(int start, int end, int[] nums)
        {
            int prevMax = 0;
            int currMax = 0;
            for (int i = start; i <= end; i++)
            {
                int temp = currMax;
                currMax = Math.Max(prevMax + nums[i], currMax);
                prevMax = temp;
            }

            return currMax;
        }
    }
}
EN

回答 1

Code Review用户

发布于 2022-05-02 07:32:38

以下是解决方案的另一个版本

代码语言:javascript
复制
 public int Rob(int[] nums)
        {
            int n = nums.Length;
            if (n == 0)
            {
                return 0;
            }
            if (n == 1)
            {
                return nums[0];
            }
            int[] dp = new int[n];
            int[] dp2 = new int[n];
            dp[0] = nums[0];
            dp[1] = Math.Max(nums[0], nums[1]);

            dp2[0] = 0; //we "SKIP" nums[0]
            dp2[1] = nums[1];

            for (int i = 2; i < n; i++)
            {
                dp[i] = Math.Max(nums[i] + dp[i - 2], dp[i - 1]);
                dp2[i] = Math.Max(nums[i] + dp2[i - 2], dp2[i - 1]);
            }
            //for dp we can't use n-1 since it is next to nums[0] so we only use n-2
            return Math.Max(dp[n - 2], dp2[n - 1]);

        }
票数 -1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/229400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档