JAVA练习268-打家劫舍
·
题目概览
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例 1:
输入:[1,2,3,1] 输出:4 解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。
示例 2:
输入:[2,7,9,3,1] 输出:12 解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。 偷窃到的最高金额 = 2 + 9 + 1 = 12 。
提示:
1 <= nums.length <= 1000 <= nums[i] <= 400
解题分析
方法:动态规划
如果偷第 n 个房子,那么小偷就不能偷第 n - 1 个房子,因此偷的最大值不是到 n - 1 个房子的所有金额 就是到 n - 2 个所有房子的金额 + 第 n 个房子的金额。由此可以得到状态转移方程,有 F(n) 表示到第 n 个房子的最大金额,可得:
F(n) = Max{ F(n-1), F(n-2) + nums[n] }
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> pre = new ArrayList<>();
pre.add(1);
result.add(pre);
for (int i = 1; i < numRows; i++) {
List<Integer> fn = buildFN(pre);
result.add(fn);
pre = fn;
}
return result;
}
public List<Integer> buildFN(List<Integer> list) {
List<Integer> fn = new ArrayList<>();
fn.add(1);
for (int i = 0; i < list.size() -1; i++) {
fn.add(list.get(i) + list.get(i+1));
}
fn.add(1);
return fn;
}
}
更多推荐

所有评论(0)