和为S的连续正数序列
和为S的连续正数序列
http://www.nowcoder.com/questionTerminal/c451a3fd84b64cb19485dad758a55ebe
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
第一种解法是小生直接上手的,代码有点丑。剩下两种是吸收大家的灵感而来。
1.穷举法a
function FindContinuousSequence(sum) { const result = [] for (let n = 2; n <= Math.ceil((Math.sqrt(8 * sum + 1) - 1) / 2); n++) { let arr = [] let [arr_sum, start, len] = [0, 1, n] while (len--) { arr_sum += start arr.push(start++) } for (let i = start; i <= sum; i++) { if (arr_sum === sum) result.unshift(JSON.parse(JSON.stringify(arr))) arr_sum = arr_sum + i - arr.shift() arr.push(i) } } return result }
2.穷举法b
function FindContinuousSequence(sum) { if(sum===1)return []; const result = [] for (let n = 1; n <sum-1 ; n++) { let [num,buf] = [0,n] while (num <sum){ num+=buf buf++ } if(num === sum){ let arr = [] while (--buf>=n) arr.unshift(buf) result.push(arr) } } return result }
3.双指针法
function FindContinuousSequence(sum) { const result = [] let [start, end] = [1, 2] while (start < end) { let count = (start + end) * (end - start + 1) / 2; if (count < sum) end++ else if (count > sum) start++ else { let arr = [] for (let i = start; i <= end; i++) arr.push(i) result.push(arr) start++ } } return result }