提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
2月16日练习内容
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目-打家劫舍
1.题目描述
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例 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 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/house-robber
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.思路与代码
2.1 思路
1.定义两个变量,res0表示第i+1家没有被偷可以获得的最大金额,res1表示第i+1家被偷了可以获得的最大金额
2.通过递归公式:Math.max(res0,res1)表示如果第i+1
家没偷,那么第i
家有没有偷都是可以的,我们取最大值即可;nums[i] + res0表示的是如果第i+1
家偷了,那么第i
家必须没偷,这里nums[i]
表示的是第i+1
家偷的金额。
3。递归遍历,得出res0与res1的结果
4.输出res0与res1中的最大值
2.2 代码
代码如下(示例):
class Solution {
public int rob(int[] nums) {
//数组长度
int length = nums.length;
//偷的钱
int res0 = 0; //第一家没偷
int res1 = nums[0]; //第一家偷了
for(int i = 1;i < length;i ++){
//临时来选择当前价偷不偷
//如果第一家偷了,那下一家不能偷
//如果第一家没偷,那下一家可偷或者不偷
int temp = Math.max(res0,res1);
//下一家偷获得的金额
res1 = res0 + nums[i];
res0 = temp;
}
return Math.max(res0,res1);
}
}
总结
提示:这里对文章进行总结: