当前位置: 首页 > 知识库问答 >
问题:

如何使用递归正确退出对房子强盗实现?

姬成荫
2023-03-14

我在做抢屋者挑战。

class Solution {
    func rob(_ nums: [Int]) -> Int {
        var mostMoneyRobbed = 0

        func rob(neighborUnits: [Int], startfromUnit unit: Int, didRobAdjacentUnit: Bool, totalMoneyRobbed total: Int){

            if total > mostMoneyRobbed{
                mostMoneyRobbed = total
            }
            for i in unit...neighborUnits.count - 1{
                if i == neighborUnits.count - 1{
                    if !didRobAdjacentUnit{
                        if total + nums[i] > mostMoneyRobbed{                                
                            mostMoneyRobbed = total + nums[i]                                
                        }
                    }
                    return
                }

                if didRobAdjacentUnit{
                    rob(neighborUnits: nums, startfromUnit: unit + 1, didRobAdjacentUnit: false, totalMoneyRobbed: total)
                }else{
                    rob(neighborUnits: nums, startfromUnit: unit + 1, didRobAdjacentUnit: true, totalMoneyRobbed: total + nums[i])
                    rob(neighborUnits: nums, startfromUnit: unit + 1, didRobAdjacentUnit: false, totalMoneyRobbed: total)
                }
            }            
        }
        guard nums.count > 0 else {
            return 0
        }

        rob(neighborUnits: nums, startfromUnit: 0, didRobAdjacentUnit: true, totalMoneyRobbed: 0)
        rob(neighborUnits: nums, startfromUnit: 0, didRobAdjacentUnit: false, totalMoneyRobbed: 0)

        return mostMoneyRobbed
    }
}

用法:

let s = Solution()
print(s.rob([1,2,3])) // returns 5 instead of 4 

我的迭代策略是:

  • 如果上一个已经被抢了,那么我只能在下一个迭代中不抢了。
  • 如果前一个没有被抢,那么我可以在下一个迭代中抢或不抢。显然,为了找到所有有效的抢劫案,我两者都做!
if i == neighborUnits.count - 1{

共有1个答案

谢裕
2023-03-14

问题是我通过两种方法迭代。一个“for循环”和单元+1。我在递归的核心部分搞砸了。不使用'for循环',只使用单元+1就是所需要的。

class Solution {
    func rob(_ nums: [Int]) -> Int {
        var mostMoneyRobbed = 0

        func rob(neighborUnits: [Int], startfromUnit unit: Int, didRobAdjacentUnit: Bool, totalMoneyRobbed total: Int){

            if total > mostMoneyRobbed{
                mostMoneyRobbed = total
            }
            if unit == neighborUnits.count - 1{
                if !didRobAdjacentUnit{
                    if total + nums[unit] > mostMoneyRobbed{
                        mostMoneyRobbed = total + nums[unit]
                    }
                }
                return
            }

            if didRobAdjacentUnit{
                rob(neighborUnits: nums, startfromUnit: unit + 1, didRobAdjacentUnit: false, totalMoneyRobbed: total)
            }else{
                rob(neighborUnits: nums, startfromUnit: unit + 1, didRobAdjacentUnit: true, totalMoneyRobbed: total + nums[unit])
                rob(neighborUnits: nums, startfromUnit: unit + 1, didRobAdjacentUnit: false, totalMoneyRobbed: total)
            }
        }
        guard nums.count > 1 else{
            if nums.count == 0{
                return 0
            }else{
                return nums[0]
            }
        }

        rob(neighborUnits: nums, startfromUnit: 0, didRobAdjacentUnit: true, totalMoneyRobbed: 0)
        rob(neighborUnits: nums, startfromUnit: 0, didRobAdjacentUnit: false, totalMoneyRobbed: 0)

        return mostMoneyRobbed
    }
}

到目前为止,这与预期的一样有效。在LeetCode上,我在第49个测试用例上得到了一个超过时间限制的错误!:d

 类似资料:
  • 问题内容: 我想定义一个包含和方法的类,可以按如下方式调用该类: 为了不使用隔行扫描类,我的想法是覆盖和方法并检查给定名称是否将return重定向到。但是我遇到了无限递归的问题。示例代码如下: 正如在代码中尝试创建新属性一样,它调用,再次调用,依此类推。我怎么需要更改此代码,即,在这种情况下,一个新的属性的创建,持有的价值? 还是有更好的方法来处理“映射”到的呼叫? 总是有关于为什么的问题:我需要

  • 本文向大家介绍Java递归如何正确输出树形菜单,包括了Java递归如何正确输出树形菜单的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java递归输出树形菜单的具体代码,供大家参考,具体内容如下 首先我们要建立树节点的类: 输出树形菜单类: 然后我们来测试一下: 输出的结果: 浏览器效果: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 2-我在FlatList中实现分页,所以当用户到达数据列表的末尾时,我调用一个函数来增加当前页,并根据当前页更新的情况,再次提取,因为我将to useEffect传递给依赖项数组 所以这里的问题是应该将以前的数据与新数据联系起来,所以我使用方法, 它工作得很好,但有时我收到一个警告,告诉我有一个重复的数据,当我使用扩展时不工作,我得到一个很大的错误,因为Flatlist keyExtractor问

  • 问题内容: 我正在努力在程序中实现一个对话框。主程序不使用阶段。但是,当用户的生存时间为0时,我想弹出一个对话框,以重新启动游戏或退出游戏。 我使用以下代码为对话框创建了一个单独的类。 游戏主屏幕不使用舞台。在更新方法中,如果肝脏为0,则创建GameOver类 在render方法中,我绘制了舞台 第一次创建对话框时,这可以完美地工作。当点击重新启动时,游戏将重新启动(或实际上重置比分并生效)。但是

  • 我试图熟悉JavaScript中的函数式编程。我刚读到指针函子是: 具有of函数的对象,可将任何单个值放入其中。 ES2015添加了一个rray.of使数组成为一个指向的仿函数。 我的问题是“单一价值”到底是什么意思? 我想做一个函数/容器(像https://drboolean.gitbooks.io/mostly-adequate-guide/content/ch8.html),它持有给定维度(

  • 问题内容: 我面临一种奇怪的情况,即我编写的​​批处理文件报告了错误的退出状态。这是重现该问题的最小示例: 如果我运行此脚本(使用Python,但是当以其他方式启动时实际上也会出现问题),这是我得到的: 注意如何报告,即使应该如此。 现在很奇怪的是,如果我删除了inner子句(这没关系,因为之后的所有内容都不应该执行),然后尝试启动它: 我再次启动它: 现在正确地报告为。 我不知道是什么原因造成的