Excel函数解决查找任意n个数字之和:分而治之
在上一次的文章中,我们介绍了一种可以查找任意多个数字,使其合计等于给定值x的方法。这个方法的本质就是将问题变为更小一些的问题:
原问题:从原来的50个数中查找n个元素,其合计等于x。
新问题:从49个数中查找n-1个元素,其合计等于x-a。
这个思路启发了我们,可以使用分而治之(或减而治之)的方法解决这个问题。
分支法
我们的问题是在一个数组arr中,找到n个元素,使得它们的合计等于x
假设存在这样一个函数的话,这个问题可以这么记:
=FIND_ANY_NUMBER(arr, n, x)
我们可以将这个数组分为左右两部分:
左半部分只有一个元素,右半部分有n-1个元素。
原问题可以分为两种情况。
所有的n个元素都在右半部分:
即:
FIND_ANY_NUMBER(arr, n, x) = FIND_ANY_NUMBER(arr_right, n, x)
2. 左半部分是其中的一个元素,其余n-1个元素在右半部分中,这时右边的n-1个元素合计为 :x - 左半部分元素
即:
FIND_ANY_NUMBER(arr, n, x) = HSTACK(arr_left, FIND_ANY_NUMBER(arr_right, n - 1, x arr_left)
这样,我们就可以使用递归了。
一直到在一个数组中查找1个元素,问题可以用MATCH函数简单解决,递归结束。
自定义函数
这样,就可以创建下面的自定义函数:
FIND_ANY_NUMBER = LAMBDA(arr, n, x,
IF(
n > COUNTA(arr), //如果要找的元素个数n大于数组元素个数,则无解
-1,
IF(
n = 1, //如果要找一个元素,
LET(
i, IFERROR(MATCH(x, arr, 1), -1),
IF(
i = -1, //没有找到
-1,
IF(
INDEX(arr, i) <> x, //找到的不是目标值
-1,
INDEX(arr, i)//k i
)
)
),
//否则的话,分为两种情况
LET(
result, FIND_ANY_NUMBER(DROP(arr, 1), n, x),
IF(
SUM(--(result = -1)) = 0, //成功了
result,
//HSTACK(k 1, FIND_ANY_NUMBER(DROP(arr, 1), n - 1, x - INDEX(arr, k 1), k 1))
HSTACK(INDEX(arr, 1), FIND_ANY_NUMBER(DROP(arr, 1), n - 1, x - INDEX(arr, 1)))
)
)
)
));
解释一下:
函数的输入参数是一个数组arr,要查找的元素个数n,以及要查找的元素x。函数使用IF语句进行条件分支:如果要查找的元素个数n大于数组元素个数,则无解,返回-1。如果要查找的元素个数n等于1,则查找一个元素。在这种情况下,如果找到了目标值,则返回其索引,否则返回-1。如果要查找的元素个数n大于1,则查找多个元素。在这种情况下,函数会对数组进行递归调用,将数组中的第一个元素删除,并将查找数量减少1。如果递归调用返回-1,则表示没有找到目标值,函数将返回-1。否则,如果递归调用返回非-1的结果,则将其返回。如果递归调用返回多个结果,则将它们与数组中的第一个元素的索引组合成一个水平堆栈(HSTACK),并将其返回。
详细解释请看视频
加入E学会,学习更多Excel应用技巧
/portal/learn/class_list
详情咨询客服(底部菜单-知识库-客服)
Excel Power Query Power Pivot Power BI
Power Excel 知识库
按照以下方式进入知识库学习Excel函数 底部菜单:知识库->Excel函数
自定义函数 底部菜单:知识库->自定义函数
Excel如何做 底部菜单:知识库->Excel如何做
面授培训 底部菜单:培训学习->面授培训
Excel企业应用 底部菜单:企业应用
也可以在历史文章中学习Excel,Power Query,Power Pivot,Power BI,Power Automate各种技巧。
被夸一万次的filter函数泰裤辣!这样筛选更高级……
今天是七月的第一天。愿大家下半年所有的努力都有收获!下面的Excel表格,A列展示了上月销售的产品,B列是本月销售的产品。需要在D列统计相比上月,本月新增了哪些产品?思考一分钟,您会怎么解决此问题?↓我们的答案:第一,如果您的Excel版本是office2021以上的版本,可以用下面的公式来统计:=FILTER(B2:B10,COUNTIF(A2:A7,B2:B10)=0)站长网2023-07-30 08:30:240000电脑版剪映教程(011)歌词动画的批量制作
先请看演示视频,然后再详细看文字内容,文字内容和演示视频结合起来学习,一定能事半功倍:在上几讲中,我们对文字的基础知识和基本编辑操作,进行了介绍。这一讲,重点讲一下,如何批量制作歌词动画。在(008)讲中,我稍微提了一下,不知大家能否注意到,这一次,详细讲一讲歌词的动画设置,字幕的动画和所有文本的设置,和歌词完全一样。我还是以歌词为例,详细说明批量设置动画的操作过程和注意事项。站长网2023-07-30 14:01:370003PPT演示文稿设计:如何用WPS制作轮播图?
编按:在《用平滑切换快速制作PPT图片轮播效果》一文中,我们为大家详细介绍了用平滑切换快速制作轮播图的方法。但是,依然有读者表示没学会。因此,今天为大家分享一个更简单的方法:用WPS演示文稿中的多图轮播一键制作轮播图。事情要从一位同学发来的“求助”说起:因此,今天为大家分享用WPS演示文稿一键制作轮播图的方法。1.新建一个WPS演示文稿,插入准备好的图片素材。站长网2023-07-28 08:20:410000在ps中为路径应用前景色的填充效果的方法及用前景色的填充效果的用途?
在PS中为路径应用前景色的填充效果的方法:首先,需要创建一个路径,可以使用钢笔工具或形状工具创建。选择路径,然后在路径面板中选择路径填充选项。在填充选项中选择前景色,并设置透明度、混合模式等属性。单击“填充路径”按钮,即可将前景色应用到路径上。前景色的填充效果的用途:为路径添加颜色或纹理,以实现图形的填充效果。在制作海报、广告等宣传材料时,可以使用填充效果为图形添加视觉效果。0000iis10安装URLRewrite模块问题(若要安装 IIS URL 重写模块 2,需要 IIS 7.0 版或更高版本。)
IIS10安装URLRewrite模块出错提示“若要安装iisURL重新模块2,需要iis7.2版或更高版本。”。站长网2023-02-24 16:47:13000145