Go使用记忆化搜索的套路【以20240121力扣每日一题为例】

news2024/10/6 10:26:28

题目

在这里插入图片描述

分析

这道题很明显记忆化搜索,用py很容易写出来

Python

class Solution:
    def splitArray(self, nums: List[int], k: int) -> int:
        n = len(nums)
        # 寻找分割子数组中和的最小的最大值
        s = [0]
        for num in nums:
            s.append(s[-1] + num)
        #print(s)
        
        @cache
        def dfs(cur, tk): # 前cur个分成tk个的最小的最大值
            if cur == tk: # 需要保证cur >= tk
                if cur == 0:
                    return inf
                return max(nums[:cur])
            if tk == 1:
                return sum(nums[:cur])
            if tk > cur:
                return inf
            res = inf # 各自和的最大值的最小值
            for idx in range(tk - 1, cur):
                # idx到cur-1为最后一个子数组
                maxn = dfs(idx, tk - 1)
                if s[cur] - s[idx] > maxn:
                    maxn = s[cur] - s[idx]
                if maxn < res:
                    res = maxn
            #print(cur, tk, res)
            return res

            
        
        return dfs(n, k)

Go

func splitArray(nums []int, k int) int {
    n := len(nums)
    // 寻找分割子数组中和的最小的最大值
    s := make([]int, n+1)
    for i := 1; i <= n; i++ {
        s[i] = s[i-1] + nums[i-1]
    }
    //fmt.Println(s)

    // dfs外记忆化
    type args struct {
        cur, tk int
    }
    memo := map[args]int{} 
    // dfs外记忆化

    var dfs func(int, int) int
    dfs = func(cur, tk int) int { // 前cur个分成tk个的最小的最大值
        if cur == tk { // 需要保证cur >= tk
            if cur == 0 {
                return 1<<31 - 1
            }
            return max(nums[:cur]...)
        }
        if tk == 1 {
            return sum(nums[:cur]...)
        }
        if tk > cur {
            return 1<<31 - 1
        }
        res := 1<<31 - 1 // 各自和的最大值的最小值
        // dfs内记忆化
        a := args{cur, tk}
        if v, ok := memo[a]; ok {
            return v
        }
        defer func() {memo[a] = res} ()
        // dfs内记忆化
        
        for idx := tk - 1; idx < cur; idx++ {
            // idx到cur-1为最后一个子数组
            maxn := dfs(idx, tk-1)
            if s[cur]-s[idx] > maxn {
                maxn = s[cur] - s[idx]
            }
            if maxn < res {
                res = maxn
            }
        }
        //fmt.Println(cur, tk, res)
        return res
    }

    return dfs(n, k)
}

func max(nums ...int) int {
    res := nums[0]
    for _, num := range nums {
        if num > res {
            res = num
        }
    }
    return res
}

func sum(nums ...int) int {
    res := 0
    for _, num := range nums {
        res += num
    }
    return res
}

总结

go需要在外层先定义一个struct结构体,然后用一个mp丢进去
在内层,再构建会struct,去判断map有没有,没有的话defer赋值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1400508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跟着pink老师前端入门教程-day07

去掉li前面的项目符号&#xff08;小圆点&#xff09; 语法&#xff1a;list-style: none; 十五、圆角边框 在CSS3中&#xff0c;新增了圆角边框样式&#xff0c;这样盒子就可以变成圆角 border-radius属性用于设置元素的外边框圆角 语法&#xff1a;border-radius:length…

1.11马原

同一性是事物存在和发展的前提&#xff0c;一方的发展以另一方的发展为条件 同一性使矛盾双方相互吸收有利于自身的因素&#xff0c;在相互作用中各自得到发展 是事物发展根本规律&#xff0c;唯物辩证法的实质和核心 揭示了事物普遍联系的根本内容和变化发展的内在动力 是贯…

Vue3 在 history 模式下通过 vite 打包部署白屏

Vue3 在 history 模式下通过 vite 打包部署后白屏; 起因 hash 模式 url 后面跟个 # 强迫症犯了改成了 history,就此一波拉锯战开始了 ... 期间 nigix 和 router 各种反复排查尝试最终一波三折后可算是成功了 ... Vue官方文档 具体配置可供参考如下: 先简要介绍下,当前项目打包…

SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例

文章目录 SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例Dubbo定义其核心部分包含: 工作原理为什么要用dubbo各个节点角色说明&#xff1a;调用关系说明&#xff1a; dubbo为什么需要和zookeeper结合使用&#xff0c;zookeeper在dubbo体系中起到什么作用&…

0基础开发EtherNet/IP:协议格式,JAVA、C#、C++处理

经过一阵倒腾&#xff0c;把CIP、Ethernet/ip协议搞到手 协议的概念和理论就不提及了&#xff0c;上网随便一搜索EtherNet/IP遍地都是。 直接将协议关键点列举出来吧。 更多协议资料 www.jngbus.com 通讯软件群 30806722 这里讲解的是TCP和UDP协议的格式&#xff0c;EtherN…

【标准IO】fseek函数、ftell函数、fflush函数、getline函数

目录 fseekftellrewindfflushgetline 橙色 当你在文件中写入了10个字符后&#xff0c;又想把这10个字符读出来&#xff0c;该怎么做呢&#xff1f;因为有文件操作符指针的存在&#xff0c;此时该指针已经指在了这10个字符末尾&#xff0c;所以需要把该指针重定向&#xff0c;这…

RT-Thread Studio学习(十七)虚拟串口

RT-Thread Studio学习&#xff08;十七&#xff09;虚拟串口 一、简介二、新建RT-Thread项目并使用外部时钟三、启用USB设备功能四、测试 一、简介 本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下实现USB虚拟串口。 硬件及开发环境如下&#xff1a; OS WI…

油管公式(全)

原文&#xff1a;The Youtube Formula 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 每个人都应该有一个 YouTube 频道。真的每个人&#xff0c;尤其是品牌。当我看到没有在 YouTube 上存在的品牌时&#xff0c;我觉得他们疯了。任何人都不利用这个机会是难以想…

python-基础篇-变量

文章目录 变量的基本使用目标01. 变量定义1) 变量演练1 —— iPython2) 变量演练 2 —— PyCharm3) 变量演练 3 —— 超市买苹果思考题 02. 变量的类型2.1 变量类型的演练 —— 个人信息2.2 变量的类型2.3 不同类型变量之间的计算1) **数字型变量** 之间可以直接计算2) **字符串…

从零开始:直播电商APP开发全流程解析

本篇文章&#xff0c;小编将从零开始&#xff0c;全面解析直播电商APP的开发流程&#xff0c;涵盖了关键的技术要点和开发阶段的关键步骤。 第一阶段&#xff1a;需求分析与规划 此阶段的关键任务包括&#xff1a; 1.用户需求调研 2.功能规划 3.技术选型 第二阶段&#xf…

安卓平板局域网内远程控制工控机方法

安卓平板局域网内远程控制工控机方法 将所需要远程控制的工控机通过网线连接到具有WiFi功能的路由器上&#xff0c;将安卓平板连接上WiFi&#xff0c;如下图所示 下载NoMachine远程软件安装包&#xff0c;官网地址&#xff1a;https://www.nomachine.com/ 点击Download now按钮…

图论:最短路(dijkstra算法、bellman算法、spfa算法、floyd算法)详细版

终于是学完了&#xff0c;这个最短路我学了好几天&#xff0c;当然也学了别的算法啦&#xff0c;也是非常的累啊。 话不多说下面看看最短路问题吧。 最短路问题是有向图&#xff0c;要求的是图中一个点到起点的距离&#xff0c;其中我们要输入点和点之间的距离&#xff0c;来求…

【Docker】安装Nginx容器并部署前后端分离项目

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Docker实战》。&#x1f3af;&#x1f3af; &…

代码随想录算法训练营第十一天|● 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值

文章目录 20.有效的括号思路&#xff1a;代码&#xff1a; 1047. 删除字符串中的所有相邻重复项思路代码1:栈储存代码2&#xff1a;双指针 150. 逆波兰表达式求值思路&#xff1a;题外话代码 20.有效的括号 思路&#xff1a; 由于栈结构的特殊性&#xff0c;非常适合做对称匹配…

单体架构、微服务和无服务器架构

前言 在这篇文章中&#xff0c;我将演示在决定使用单体架构、微服务架构和无服务器架构时的权衡的简化心智模型。目标是突显每种风格的固有优势和缺陷&#xff0c;并提供关于何时选择哪种架构风格的指导。 单体架构 对于小团队或项目来说是理想的入门架构。它简单易上手&…

Python sleep函数用法:线程睡眠

如果需要让当前正在执行的线程暂停一段时间&#xff0c;并进入阻塞状态&#xff0c;则可以通过调用 time 模块的 sleep(secs) 函数来实现。该函数可指定一个 secs 参数&#xff0c;用于指定线程阻塞多少秒。 当前线程调用 sleep() 函数进入阻塞状态后&#xff0c;在其睡眠时间…

131. 分割回文串 - 力扣(LeetCode)

问题描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 输入示例 s "aab"输出示例 [["a","a","b"],["…

面试2024.1.20

简单介绍下你做的项目。 这个神领物流项目是一个前后端分离的项目&#xff0c;前段他有3个客户端&#xff08;用户端为微信小程序、司机端和快递员端为app&#xff09;一个管理端&#xff08;pc&#xff09;&#xff0c;后端用的技术栈用的是SpringAlibabaCloud、数据库用的是M…

《Aspect-Sentiment-Multiple-Opinion Triplet Extraction》论文阅读

文章目录 文章介绍文章模型encoder部分ATE任务TOWE任务ATSA任务 番外 文章地址&#xff1a; https://arxiv.org/abs/2110.07303v1 文章介绍 目前的关于ASTE三元组提取的方面级情感分析论文大多关注于简单的句式&#xff0c;比如一个方面实体仅有一个意见词加以修饰&#xff0c…

CCC数字钥匙设计【NFC基础】--LPCD相关介绍

关于NFC卡检测&#xff0c;主要可以分成两个步骤&#xff1a; 1、LPCD低功耗检测&#xff0c;唤醒NFC读卡器。 2、唤醒后&#xff0c;NFC读卡器或MCU控制器轮询Type A、Type B、Type F、Type V&#xff08;ISO15693&#xff09;等卡类型。 本文主要介绍LPCD相关功能&#xff…