剑指offer——65和为S的连续正数序列
时间:2019-10-20
本文章向大家介绍剑指offer——65和为S的连续正数序列,主要包括剑指offer——65和为S的连续正数序列使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
题解:
第一种方法,找规律
第num开始,到num+n构成的序列和 == sum
么你会发现,则这些数全部减去(num-1)后构成序列 1,2,3,4,5,,,,n,而他们的和为n*(n+1)/2
以满足条件的序列必满足: n*(num-1) + n*(n+1)/2 == sum
第二种方法,滑动窗口
使用滑动窗口,和大了,则左指针右移,并吐出左数,和小了,则右指针右移,加上右数
1 //第一种方法,找规律 2 //第num开始,到num+n构成的序列和 == sum 3 //么你会发现,则这些数全部减去(num-1)后构成序列 1,2,3,4,5,,,,n,而他们的和为n*(n+1)/2 4 //以满足条件的序列必满足: n*(num-1) + n*(n+1)/2 == sum 5 class Solution01 { 6 public: 7 vector<vector<int> > FindContinuousSequence(int sum) { 8 vector<vector<int> >res; 9 for (int i = 1; i < sum; ++i) 10 { 11 int theta = (2 * i - 1)*(2 * i - 1) + 8 * sum; 12 int gen = sqrt(theta); 13 if (gen*gen != theta)continue; 14 int a = (1 - 2 * i) + gen; 15 if (a % 2 != 0)continue; 16 vector<int>temp; 17 for (int j = 0; j < a / 2; ++j) 18 temp.push_back(i + j); 19 res.push_back(temp); 20 } 21 return res; 22 } 23 }; 24 25 //第二种方法,滑动窗口 26 //使用滑动窗口,和大了,则左指针右移,并吐出左数,和小了,则右指针右移,加上右数 27 class Solution { 28 public: 29 vector<vector<int> > FindContinuousSequence(int sum) { 30 if (sum < 3)return{}; 31 vector<vector<int> >res; 32 int L = 1, R = 2, S = 1 + 2; 33 while (L < R && R < sum){ 34 if (S == sum){ 35 vector<int>temp; 36 for (int j = L; j <= R; ++j) 37 temp.push_back(j); 38 res.push_back(temp); 39 } 40 if (S >= sum) { 41 S -= L; 42 ++L; 43 } 44 else { 45 ++R; 46 S += R; 47 } 48 } 49 return res; 50 } 51 };
原文地址:https://www.cnblogs.com/zzw1024/p/11708038.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法