213. 打家劫舍 II

在这里插入图片描述
先说思路,既然首尾不能同时用,就把收尾分开,一个数组有头一个数组有尾,然后就是普通的打家劫舍进行两次,再比较这两个的大小。至于动态规划,就是比较两端和中间数的大小,将大的问题分解成小的问题。https://blog.csdn.net/weixin_48680010/article/details/116585115?spm=1001.2014.3001.5502 可以看下这个

class Solution {
    public int rob(int[] nums) {
       //边界情况
		        if(nums.length==0 || nums==null){
		            return 0; 
		        }
		        if(nums.length==1){
		            return nums[0]; 
		        }
		        if(nums.length<=2){
			           return Math.max(nums[0],nums[1]) ; 
			        }
		      //创建数组
		        int [] dp=new int [nums.length];
		        int [] dp2=new int [nums.length];
		      //去头去尾,留两个数组
		        //去尾
		        int[]nums1=new int [nums.length-1];
		        for(int i=0;i<nums1.length;i++) {
		        	nums1[i]=nums[i];}
		        
		        dp[0]=nums1[0];
		        dp[1]=Math.max(nums1[0],nums1[1]);
		        //去头
		        int[]nums2=new int [nums.length-1];
		        for(int ji=1;ji<=nums2.length;ji++) {
		        	nums2[ji-1]=nums[ji];
		        }
		        
		        dp2[0]=nums2[0];
		        dp2[1]=Math.max(nums2[0],nums2[1]);
		        
		        
		        for(int ki=2;ki<nums1.length;ki++){
		            dp[ki]=Math.max(dp[ki-2]+nums1[ki],dp[ki-1]);
		        }

		        for(int li=2;li<nums2.length;li++){
		            dp2[li]=Math.max(dp2[li-2]+nums2[li],dp2[li-1]);
		        }
		        int max=Math.max(dp[nums1.length-1],dp2[nums2.length-1]);
		        return max ;		
	}}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值