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

题目

在这里插入图片描述

分析

这道题很明显记忆化搜索,用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赋值

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WampServer

开发笔记 推荐链接php无法保存SESSION问题部署SSL时候产生的问题 推荐链接 链接目录 php无法保存SESSION问题 php.ini文件和phpForApache.ini 文件 里面都有 对路径的控制&#xff0c;相关路径问题可能也需要进行修改&#xff0c;打开文件搜索wamp64或wamp 就可以看到了&…

火山引擎ByteHouse:“专用向量数据库”与“数据库+向量扩展”,怎么选?

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 背景 随着LLM&#xff08;Large Language Model&#xff09;的不断发展&#xff0c;向量检索也逐渐成为关注的焦点。LLM通过处理大量的文本数据&#xff0c;获取丰…

第9章-网络设备基本调试

1. 网络连通性测试 ping命令 定义&#xff1a;基于ICMP协议开发的应用程序&#xff0c;检测网络连通性&#xff1b; 功能&#xff1a; ① 检测网络连接的状态&#xff1b; ② 检测目标计算机是否在线&#xff1b; ③ 定位故障排除&#xff1b; ④ 检测网络延迟和丢包情况&#…

c++QT文件IO

1、QFileDialog文件对话框 与QMessageBox一样&#xff0c;QFileDialog也继承了QDialog类&#xff0c;直接使用静态成员函数弹窗。弹出的结果&#xff08;选择文件的路径&#xff09;通过返回值获取。 1&#xff09;获取一个打开或保存的文件路径 // 获取一个打开或保存的文件路…

Linux:动静态库的概念制作和底层工作原理

文章目录 动静态库基础认知动静态库基本概念静态库的制作库的概念包的概念 静态库的使用第三方库小结 动态库的制作动态库的使用动态库如何找到内容&#xff1f;小结 动态库加载库和程序都要加载可执行程序的地址问题地址问题逻辑地址和平坦模式绝对编址和相对编址与位置无关码…

esxi配置NTP自动对时与手动对时

目录 背景解法配置NTP服务器立即与NTP服务器同步时间 附&#xff1a;几个常用的NTP服务器列表 背景 VMware ESXi 6.7运行了一段时间后偶然发现系统时间与标准时间有5分钟左右的差异&#xff0c;于是研究了下如何自动对时以及用命令行立即对时。 解法 配置NTP服务器 首先在管…

啥,ui叫我做一个移动端好看的轮播--异形的Slide

先看效果,得实现两边的缩放和无线滚动 实现方法 我的基础架构是 next.jsswiper 下载swiper包 yarn add swiper下载后在页面中引用 import { useEffect, useState } from "react"; import styles from "./index.module.css"; import Image from "n…

DataStream API(源算子)

目录 源算子 1&#xff0c;从集合中读取数据 2&#xff0c;从文件读取数据 3&#xff0c;从 Socket 读取数据 4&#xff0c;从 Kafka 读取数据 5&#xff0c;自定义源算子 6&#xff0c;Flink 支持的数据类型 6.1 Flink 支持多种数据类型&#xff0c;包括但不限于&…

一、认识 JVM 规范(JVM 概述、字节码指令集、Class文件解析、ASM)

1. JVM 概述 JVM&#xff1a;Java Virtual Machine&#xff0c;也就是 Java 虚拟机 所谓虚拟机是指&#xff1a;通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统。 即&#xff1a;虚拟机是一个计算机系统。这种计算机系统运行在完全隔离的环境中…

Linux Centos7环境下安装Redis5

Centos7环境下安装Redis5 使用 yum 安装创建符号链接针对可执⾏程序设置符号链接针对配置⽂件设置符号链接 修改配置文件启动Redis停止Redis 一般情况下我们在 linux 系统中想要安装一些程序首先会想到使用 yum 源来安装, 但是在下图中我们可以看到 Redis 版本还是3.X的版本, 所…

优化用户体验测试应用领域:提升产品质量与用户满意度

在当今数字化时代&#xff0c;用户体验测试应用已经成为确保产品质量、提升用户满意度的关键工具。随着技术的不断发展&#xff0c;用户的期望也在不断演变&#xff0c;因此&#xff0c;为了保持竞争力&#xff0c;企业必须将用户体验置于产品开发的核心位置。本文将探讨用户体…

vcruntime140_1.dll文件丢失有什么办法可以解决

vcruntime140_1.dll文件丢失是电脑中常见的事情&#xff0c;解决vcruntime140_1.dll丢失的办法也有很多种&#xff0c;今天我们就来聊聊为什么要修复vcruntime140_1.dll文件&#xff0c;vcruntime140_1.dll在电脑中的重要性&#xff0c;以及详细的解决vcruntime140_1.dll丢失的…

GPT-5不叫GPT-5?下一代模型会有哪些新功能?

OpenAI首席执行官奥特曼在上周三达沃斯论坛接受媒体采访时表示&#xff0c;他现在的首要任务就是推出下一代大模型&#xff0c;这款模型不一定会命名GPT-5。虽然GPT-5的商标早已经注册。 如果GPT-4目前解决了人类任务的10%&#xff0c;GPT-5应该是15%或者20%。 OpenAI从去年开…

使用DockerFile构建镜像与镜像上传

目录 前言&#xff1a;为什么要使用Dockerfile &#xff1f; DockerFile构建镜像 1、构建基础对象 2、Dockerfile文件结构 3、构建Dockerfile文件镜像 二、镜像上传&#xff08;阿里云&#xff09; 前言&#xff1a;为什么要使用Dockerfile &#xff1f; 首先Dockerfile …

Element组件完整引入、按需引入、样式修改(全局、局部)、简单安装less以及npm命令证书过期等

目录 一、npm 安装二、完整引入三、按需引入四、样式修改1.按需加载的全局样式修改2. 局部样式修改1. 在 css 预处理器如 less scss 等直接使用::v-deep2. 只能用在原生 CSS 语法中:/deep/ 或者 >>> 五、 拓展&#xff1a;npm 安装less报错&#xff0c;提示证书过期六…

Java Web(二)--HTML

基本介绍 官网文档地址: HTML 教程 HTML&#xff08;HyperText Mark-up Language&#xff09;即超文本标签语言&#xff1b;HTML 文本是由 HTML 标签组成的文本&#xff0c;可以包括文字、图形、动画、声音、表格、链接等&#xff1b;HTML 的结构包括头部&#xff08;Head&…

CWE、CVE

文章目录 前言一、CVE是什么&#xff1f;二、官网浏览主页词汇 三、CWE 前言 一、CVE是什么&#xff1f; 关于CVE是什么&#xff0c;前辈已经阐述得很详细通透&#xff0c;这里不再赘述或生产一些垃圾信息&#xff0c;CVE公共漏洞和暴露的学习 总结&#xff1a; 标识某个漏洞…

不就业,纯兴趣,应该自学C#还是JAVA?

不就业&#xff0c;纯兴趣&#xff0c;应该自学C#还是JAVA? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「JAVA的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff…

测试老司机聊聊测试设计都包含什么?

一、数据组合测试设计 数据组合测试设计&#xff08;Combinatorial Test Design&#xff0c;CTD&#xff09;是一种优化测试用例的方法&#xff0c;它通过系统地组合不同的测试数据输入&#xff0c;以确保全面覆盖各种可能的测试情况。这种方法主要应用于软件测试领域&#xff…

Aria2 WebUI控制台 任意文件读取漏洞复现(CVE-2023-39141)

0x01 产品简介 Aria2 WebUI控制台是用于下载文件的实用程序。它支持 HTTP(S)/FTP/SFTP/BitTorrent 和 Metalink 协议。aria2可以从多个来源/协议下载文件,并尝试利用您的最大下载带宽。它支持同时从HTTP(S)/FTP/SFTP和BitTorrent下载文件,而从HTTP(S)/FTP/SFTP下载的数据上…