笔者打家劫舍时碰见碰见了个问题,记录一下,leetcode上的
题目:213. 打家劫舍 II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。
1 | 输入:nums = [2,3,2] |
这题官方给出的解法如下:假设数组 nums 的长度为 n。如果不偷窃最后一间房屋,则偷窃房屋的下标范围是 [0, n-2] [0,n−2];如果不偷窃第一间房屋,则偷窃房屋的下标范围是 [1, n-1] [1,n−1]。在确定偷窃房屋的下标范围之后,即可用第 198 题的方法解决。对于两段下标范围分别计算可以偷窃到的最高总金额,其中的最大值即为在 n 间房屋中可以偷窃到的最高总金额。
评论区有个发言:感觉有点问题。如果把所有情况分为偷窃第一间房和偷窃最后一间房逻辑上有点说不过去。因为,当偷窃第一间房的时候,官方解答将问题转化为了[0, n-1]求最大收益的问题,这显然并没有保证第一间房被偷,和最开始的假设相矛盾。我觉得问题出在把所有情况分为偷窃第一间房和偷窃最后一间房这里。事实上,有可能存在两个房间都不偷的情况,如[1,10000,1]。更严谨地说,应该把问题分为可以偷第一件房和可以偷最后一件房这两种情况。不可能有这两种情况之外的第三种情况。当可以偷第一间房的时候,我们当然可以理直气壮地把问题转换为[0, n-1]求最大收益的问题。
一开始觉得很有道理,认为是官方这里出了些问题,后来发现俩好像在各说个的,所以都对。
首先题目的解肯定是第一间和最后一间至少有一个没偷,而官方给出的确实是这样,分为了不偷最后一间、不偷第一间,那这里得出的最优解肯定就是答案,当然也有人用集合的方式给出了补充证明。而评论的话似乎把官方误认为分为偷第一间、不偷第一间这种了,所以觉得官方少了第一间和最后一间都不偷。
好家伙,算法题我咋在这里分析语文了。行了,不说了,接着刷去了