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

news/2024/7/20 20:38:39 标签: leetcode, 深度优先, 算法

题目

在这里插入图片描述

分析

这道题很明显记忆化搜索,用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.niftyadmin.cn/n/5339981.html

相关文章

如何在conda中的创建查询删除虚拟环境等

最近发现conda环境中有太多的虚拟环境&#xff0c;想要删除&#xff0c;重新创建管理。因此&#xff0c;查找资料后&#xff0c;记录如下&#xff1a; 一.创建虚拟环境 打开终端或命令提示符&#xff0c;并执行以下命令&#xff1a; bash conda create --name your_environ…

开源图床LightPicture搭建本地图片管理系统并实现无公网IP远程访问

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进&#xff0c;功能也越来越多&#xff0c;而手机…

怎么做一个包含多图的二维码?图片怎么放到二维码中去?

二维码是现在数字化时代常见的一种技术手段&#xff0c;可以用来实现信息传递、图片展示、音视频播放等方面的用途&#xff0c;在生活中各个方面都有应用体现。那么一个放入多张图片的二维码如何制作呢&#xff1f; 想要快速在线生成二维码&#xff0c;一般会使用二维码生成器…

Java/Python/Go不同开发语言在进程、线程和协程的设计差异

Java/Python/Go不同开发语言在进程、线程和协程的设计差异 1. 进程、线程和协程上的差异1.1 进程、线程、协程的定义1.2 进程、线程、协程的差异1.3 进程、线程、协程的内存成本1.4 进程、线程、协程的切换成本 2. 线程、协程之间的通信和协作方式2.1 python如何实现线程通信&a…

规范文字实验、结果与讨论

图片转文字点头教育 ppt 内容 撰写实验、结果 实验&#xff08;Experimental&#xff09; 实验部分是科研论文的重要组成部分&#xff0c;其目的是验证论文提出的理论和方法的有效性和可行性。通过实验&#xff0c;可以展示研究成果的实际应用价值。 1.实验环境 2.实验条件 3.…

写给后端的Docker初级入门教程:基础篇

写给后端的Docker初级入门教程&#xff1a;基础篇 前言: 之前很早就对Docker有所耳闻&#xff0c;但是碍于时间(就是懒得学)的关系&#xff0c;就一直没有开始行动&#xff0c;直到最近这个学期课比较少&#xff0c;实在不知道该干啥了&#xff0c;算了&#xff0c;学习吧。所…

【GitHub项目推荐-开源的任务管理工具】【转载】

推荐一个开源的任务管理工具&#xff0c;该工具会提供各类文档协作功能、在线思维导图、在线流程图、项目管理、任务分发、即时 IM&#xff0c;文件管理等等。该开源项目使用到 Vue、Element-UI、ECharts 等技术栈。 开源地址&#xff1a;www.github.com/kuaifan/dootask 预览地…

第一章 FPGA开发环境安装

FPGA是什么 FPGA&#xff08;Field Programmable Gate Array&#xff0c;简称 FPGA&#xff09;&#xff0c;中文名&#xff1a;现场可编程门阵列&#xff0c;一种主要以数字电路为主的集成芯片。 现场&#xff1a;“现场”这个词指的是FPGA 可以在使用时进行编程&#xff0c…