Leetcode198-打家劫舍

Leetcode198-打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 :

输入:[1,2,3,1]

输出:4

解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。

偷窃到的最高金额 = 1 + 3 = 4

本题实际上是计算数组中多个不相邻元素组成的最大和。我们可以设置一个数组dp作为辅助数组,dp[i]表示小偷离开房屋i的时候所能偷窃到的最高金额。在计算dp[i]时,我们需要知道dp[0:i-1](JS中没有这种写法,这里是为了方便起见)中的最大值,这是因为两间相邻的房屋不能在同一晚被偷窃,因此要避开前一个相邻的房屋。然后将dp[0:i-1]中的最大值与nums[i]相加即可得到dp[i]。最后返回dp中的最大值作为结果。

 1 // Leetcode 198
 2 // Dynamic programming
 3 // 题目变种:计算数组中多个不相邻元素组成的最大和
 4 var maxElementOfArray = function (nums) {
 5     if (nums == 0) {
 6         return Number.MIN_SAFE_INTEGER;
 7     }
 8     max = 0;
 9     for (let i = 0; i < nums.length; i++) {
10         if (nums[i] > max) {
11             max = nums[i];
12         }
13     }
14     return max;
15 };
16 
17 var rob = function(nums) {
18     if (nums.length <= 0) {
19         return 0;
20     }
21 
22     if (nums.length == 1) {
23         return nums[0];
24     }
25 
26     if (nums.length == 2) {
27         return Math.max(nums[0], nums[1]);
28     }
29 
30     dp = []; dp[0] = nums[0]; dp[1] = nums[1];
31     for (let i = 2; i < nums.length; i++) {
32         dp[i] = maxElementOfArray(dp.slice(0, i-1)) + nums[i];
33     }
34 
35     return maxElementOfArray(dp);
36 };
37 
38 nums = [2,1,1,2];
39 res = rob(nums);
40 console.log(res);
posted @ 2021-04-12 20:48  曹冲字仓舒  阅读(74)  评论(0)    收藏  举报