ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 384|回复: 7

[讨论] 将数组nums拆分成k个连续子数组的一种递归公式写法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-1-12 13:26 | 显示全部楼层 |阅读模式
本帖最后由 shaowu459 于 2024-1-12 13:57 编辑

现在有一个数组nums,需要将nums拆分成k个连续子数组,返回拆分的方案中每组的和值的最大值中的最小值。

例如,数组nums=[7,2,5,10,8],k=2,拆分成两个连续子数组有以下几种方案:
图片.png

各种拆分方案中的最大值列示在最右侧,其中的最小值为18,即为所求。

题目数据源如下:

图片.png

拆分数组-超人(递归发帖).rar

15.28 KB, 下载次数: 12

评分

7

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-12 13:47 | 显示全部楼层
本帖最后由 shaowu459 于 2024-1-12 14:07 编辑

提供一种递归公式写法,其中递归部分公式完全引用LAMBDA函数递归:m选n所有组合问题帖子中9楼的方法。


以[7,2,5,10,8]这个数组为nums,k=3为例分析下公式思路。将数组想象成一块板子,上面每个小方块中包含一个数字,分割成3个连续的子数组,也就是在板子上切两刀,板子就分成了三块,每块是一个连续的子数组。


例如从第一个数字和第二个数字之间切一刀,第二个和第三个数字之间切一刀:
图片.png
通过上面的分析可知,将nums拆分为k个连续子数组需要切k-1刀,也就是我们只需要找到所有切分的位置就可以了。我们可以把所有的切分位置先编号:
图片.png
切分位置一共4个,编号从左到右分别是1、2、3、4,也就是原字符串中逗号的编号,可以把每个逗号看成拆分点。下面就简单了,我们只需要从所有逗号中挑选出切第几个逗号即可,也即从{1,2,3,4}这个数组中任意挑出2个的所有可能的组合。也就是在m选n里m=4,n=2。


定义的名称gx和另外帖子里的一样:
  1. =LAMBDA(m,n,IF(n=1,m,IF(ROWS(m)=n,TOROW(m),VSTACK(IFNA(HSTACK(@m,gx(DROP(m,1),n-1)),@m),gx(DROP(m,1),n)))))
复制代码
另m=4,n=2,返回结果如下:
图片.png

每一行的数字代表着第若干个逗号的编号,是几就代表着从第几个逗号的位置切一刀。例如第一行的{1,2},切分出来的结果就是{7},{2},{5,10,8}这三个数组。




TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-12 13:51 | 显示全部楼层
知道了切分位置,一种处理方式是可以把原字符串对应位置的逗号改成其他符号,例如“@”,然后再按“@”拆分即可。
图片.png

针对拆分出来的3个字符串,"7","2","5,10,8",再分别按照逗号拆分,然后求和,得到这一组的3个值:7、2、23,然后求得最大值23。

针对每一种切分方案都得到最大值后,再取最小值即可。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-12 13:53 | 显示全部楼层
工作表单元格中输入的公式如下:
  1. =MIN(BYROW(gx(SEQUENCE(ROWS(TEXTSPLIT(A2,,","))-1),B2-1),LAMBDA(x,MAX(BYROW(--TEXTSPLIT(REDUCE(A2,SORTBY(x,-x),LAMBDA(m,n,SUBSTITUTE(m,",","|",n))),",","|",,,0),LAMBDA(y,SUM(y)))))))
复制代码
图片.png


TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-12 13:56 | 显示全部楼层
公式简要说明如下:

=MIN(       取每组结果中的最小值
    BYROW(
        gx(SEQUENCE(ROWS(TEXTSPLIT(A2, , ",")) - 1), B2 - 1),  使用m选n递归公式获得所有切分方案的逗号编号
        LAMBDA(x,
            MAX(      求每个拆分方案中的每组结果最大值
                BYROW(       对每组拆分的结果求和
                    --TEXTSPLIT(         按|将字符串拆分为k-1组
                        REDUCE(
                            A2,
                            SORTBY(x, -x),    从最大编号的位置开始将逗号替换为其他字符,公式中使用的是|
                            LAMBDA(m, n, SUBSTITUTE(m, ",", "|", n))
                        ),
                        ",",
                        "|",
                        ,
                        ,
                        0
                    ),
                    LAMBDA(y, SUM(y))   对每个方案中的每组拆分结果求和
                )
            )
        )
    )
)

TA的精华主题

TA的得分主题

发表于 2024-1-12 14:33 | 显示全部楼层
本帖最后由 剑指E 于 2024-1-12 20:27 编辑

只能支持最多10个数字,最多分6组
  1. =LET(a,(LEN(A2)-1)/2,b,B2-1,MIN(REDUCE("",TOCOL(IF(SEARCH(TEXT(SEQUENCE(10^b)-1,REPT("!*0",b)),CONCAT(SEQUENCE(a))),SEQUENCE(10^b)-1),3),LAMBDA(x,y,VSTACK(x,MAX(MAP(TEXTSPLIT(REDUCE(A2,SORT(--MID(y,SEQUENCE(b),1),,-1),LAMBDA(m,n,SUBSTITUTE(m,",",";",n))),";"),LAMBDA(u,SUM(--TEXTSPLIT(u,","))))))))))
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-1-12 17:48 | 显示全部楼层
  1. =LET(b,REDUCE("",SEQUENCE(ROWS(TEXTSPLIT(A2,,","))),LAMBDA(x,y,VSTACK(x,x&y))),MIN(BYROW(DROP(REDUCE(0,FILTER(b,LEN(b)=B2-1),LAMBDA(x,y,VSTACK(x,TOROW(MID(y,ROW(INDIRECT("1:"&B2-1)),1))))),1),LAMBDA(s,MAX(BYROW(--TEXTSPLIT(REDUCE(A2,SORTBY(s,-s),LAMBDA(x,y,SUBSTITUTE(x,",","/",y))),",","/",,,0),SUM))))))
复制代码
学超人一招。用全子集倒插入。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-1-13 06:17 来自手机 | 显示全部楼层
shaowu459 发表于 2024-1-12 13:47
提供一种递归公式写法,其中递归部分公式完全引用LAMBDA函数递归:m选n所有组合问题帖子中9楼的方法。


...

感谢分享解题思路。
参与一下。
=webservice("https://e.anyoupin.cn/eh3/?getMinSum~7,2,5,10,8~2")

IMG_20240112_193021.jpg

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-28 14:07 , Processed in 0.044055 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表