代码随想录算法训练营第四十七天|198.打家劫舍|213.打家劫舍II|337.打家劫舍III

一、198.打家劫舍

思路:其实拿到这题我想的是有点像背包问题,问你背包最大能够装多少价值的物品,但是这题又有一点不一样,就是有限制,你不能偷了一个房间不能偷其相邻的房间,所以其递归公式的推导很重要,但是推出来之后又发现不是很难,其实自己第一次只是知道偷0到j个房间会受到偷0到(j-1)个房间的影响,但是自己当时的理解不是很好。首先对于j房间,有两种情况你个是你偷这个房间,一个是你不偷这个房间。你偷这个房间说明j-1个房间肯定不能偷,你不偷这个房间不代表你一定偷j-1这个房间,只是有可能偷,j-1偷不偷还要看前面的影响。

代码随想录算法训练营第四十七天|198.打家劫舍|213.打家劫舍II|337.打家劫舍III_第1张图片

 二、213.打家劫舍II

思路:其实拿到这题很多人可能跟我一样是十分懵逼的状态,因为这个是一个环了不知道该怎么处理,从哪儿处理也不是。甚至不知道怎么和打家劫舍Ⅰ联系到一起。这题的分析思路主要是三种思路,对于所有的0-j个房间 。一,首尾同时不偷,你的最大金额就在1到(j-1)里面打劫。二、不偷首,那么你可以在1到j号房间里面打劫 。三、不偷尾,那么你可以在0-j-1个房间进行打劫。又因为二、三包含了一这种情况,所以只需要算后面两种情况取一个最大值即可。这题非常巧妙的思路。

代码随想录算法训练营第四十七天|198.打家劫舍|213.打家劫舍II|337.打家劫舍III_第2张图片

三、 337.打家劫舍III

思路:自己第一遍写这题的时候一点思路没有,因为这道题和二叉树结合到了一起。整体思路就是首先要有二叉树的思路,即递归的思路,因为这题需要有返回值,所以我们采用后序遍历的方式,及左右中的思路,然后就是五步曲,首先确定dp的含义,因为很明显,节点有两个选择,偷它或者不偷它,所以我们这里用一个二维的dp来记录这个偷这个节点或者不偷这个节点的最大值,便于我们记录。然后就是递归公式,偷它 :它的值+不偷它的左孩子的值+不偷它的右孩子的值

不偷它 :你可以偷左孩子也可以不偷,所以你取它们两个之间的最大值,然后你也可以偷右孩子也可以不偷有孩子,所以相同的你也可以在它们两个取一个最大值。整体思路就是这样,还有一个小细节就是递归的中止条件,当时自己有点蠢,直接返回None,然后又改成0,发现一直报错还不知道发生了什么。

代码随想录算法训练营第四十七天|198.打家劫舍|213.打家劫舍II|337.打家劫舍III_第3张图片

 

你可能感兴趣的:(算法)