LeetCode-213. 打家劫舍 II

本是古典 何须时尚 2024-03-25 21:26 124阅读 0赞

目录

    • 题目思路
    • 递归
    • 动态规划

题目来源
213. 打家劫舍 II

题目思路

这道题目和198.打家劫舍是差不多的,唯一区别就是成环了。(基本和打家劫舍I类似,就是多写了几行代码)
https://donglin.blog.csdn.net/article/details/129648387
对于一个数组,成环的话主要有如下两种情况:
在这里插入图片描述

递归

  1. class Solution {
  2. public int rob(int[] nums) {
  3. if(nums == null || nums.length == 0){
  4. return 0;
  5. }
  6. if(nums.length ==1){
  7. return nums[0];
  8. }
  9. //求出第一种情况的答案,要首不要尾
  10. int ans1 = dfs(nums,0,nums.length-2);
  11. //求出第二种情况的答案,要尾不要首
  12. int ans2 = dfs(nums,1,nums.length-1);
  13. return Math.max(ans1,ans2);
  14. }
  15. private int dfs(int[] nums,int start,int end){
  16. //如果没有了,就返回0
  17. if(start > end){
  18. return 0;
  19. }
  20. //如果相等 说明只有一个 返回当前就好了
  21. if(start == end){
  22. return nums[start];
  23. }
  24. //偷
  25. int stealy = nums[start] + dfs(nums,start+2,end);
  26. //不偷
  27. int stealn = dfs(nums,start+1,end);
  28. return Math.max(stealy,stealn);
  29. }
  30. }

在这里插入图片描述

动态规划

  1. class Solution {
  2. public int rob(int[] nums) {
  3. if(nums == null || nums.length == 0){
  4. return 0;
  5. }
  6. if(nums.length ==1){
  7. return nums[0];
  8. }
  9. int left = allRob(nums,0,nums.length-2); //情况一
  10. int right = allRob(nums,1,nums.length-1); //情况二
  11. return Math.max(left,right);
  12. }
  13. // 198.打家劫舍的逻辑
  14. private int allRob(int[] nums,int start,int end){
  15. if(start == end){
  16. return nums[end];
  17. }
  18. int[] dp = new int[nums.length];
  19. dp[start] = nums[start];
  20. dp[start+1] = Math.max(nums[start],nums[start+1]);
  21. for(int i = start+2;i<=end;i++){
  22. dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);
  23. }
  24. return dp[end];
  25. }
  26. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,124人围观)

还没有评论,来说两句吧...

相关阅读

    相关 213. 打家劫舍 II

    > 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通

    相关 leetcode213打家劫舍II

    你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系