算法编程题-到达终点数字 & 将字符串翻转到单调递增 & 四因数 & 找出最具竞争力的子序列
摘要:本文将介绍四道LeetCode原题,分别是到达终点数字,将字符串翻转到单调递增,四因数和找出最具竞争力的子序列。首先会给出相关题目的描述,然后是思路分析,接着给出golang语言实现的且通过所有测试用例的代码,最后是相关的复杂度分析。
关键词:LeetCode,golang,面试,算法,数学,枚举,单调队列
到达终点数字
原题描述
LeetCode754 到达终点数字:在一个无限长的数轴上,从原地出发,每一步可以往左或者往右走,第i次必须走i步,问至少需要多少次才能到达给定的位置。
思路简述
这个问题可以转换为找一个k值,使得 ∑ i = 1 k ± i = t a r g e t \sum_{i=1}^k\pm i=target ∑i=1k±i=target。为了方便描述和处理,可以将target转换成一个正数。首先找到最小的k使得 ∑ i = 1 k i \sum_{i=1}^k i ∑i=1ki大于等于target,很容易证明,任何小于k的数都不可能满足题目的要求。如果上式恰好等于target,则k就是答案。否则计算 g a p = ∑ i = 1 k i − t a r g e t gap=\sum_{i=1}^k i-target gap=∑i=1ki−target,如果gap是偶数,那么k也能满足要求。为什么?因为现在往右一直走k步超过了target,也就是说前面的某些步需要往左走,且这些步的步数之和为gap/2,如果gap是奇数,显然不能满足要求。由于以下结论成立:若 s = ∑ i = 1 k i s=\sum_{i=1}^k i s=∑i=1k