如何优化指定规则降序序列集合中目标数最优匹配的查找方法
高效实现思路
首先对序列规则做数学推导:每个步长x(取值范围1≤x≤13)对应的序列第k项(k≥0,k=0为起始项,k越小代表出现越早)可以简化为通项公式:(120 - x) - k*x = 120 - x*(k+1)
如果给定数字n属于该序列,等价于存在正整数m(m = k+1),满足n = 120 - x * m,变形后可得固定值S = 120 - n,上述等式等价于x * m = S。
我们的核心目标是让n出现最早,也就是m最小。S固定的前提下,m = S/x,因此x越大,m越小,n出现的位置越早。只要找到最大的、满足能整除S、且取值在1到13之间的x,就是所求的最优步长。
实现步骤
- 边界校验:如果n < 0 或者 n > 119,直接返回无结果,n不可能出现在任何序列中
- 计算固定值
S = 120 - n - 从13到1倒序遍历x,判断S是否能被x整除:
- 找到第一个满足条件的x,就是最优步长,对应的起始值为
120 - x,n在序列中的位置为k = (S/x) - 1 - 由于x=1一定能整除S,因此遍历必然会找到符合条件的结果
- 找到第一个满足条件的x,就是最优步长,对应的起始值为
代码示例(Python)
def find_optimal_sequence(n): if n < 0 or n > 119: return None S = 120 - n # 倒序找最大的符合条件的x for x in range(13, 0, -1): if S % x == 0: return { "最优步长": x, "序列起始值": 120 - x, "n在序列中的索引(从0开始)": (S // x) - 1 } return None # 测试用户示例n=104 print(find_optimal_sequence(104)) # 输出:{'最优步长': 8, '序列起始值': 112, 'n在序列中的索引(从0开始)': 1}
该实现最多仅需要遍历13次,时间复杂度为O(1),完全不需要生成任何序列,效率远高于暴力生成序列的方案。
内容的提问来源于stack exchange,提问作者NPKubley
相关产品推荐
相关产品推荐

