递增数列中和为s的两个数字,和为s的连续正数序列
2016-07-29 17:04
344 查看
和为s的两个数,利用begin,end两个位置标志和为s前后两个元素,当和大于s,end前移,和小于s,begin后移 vector<int> FindNumbersWithSum(vector<int> array,int sum) { vector<int>res; if(array.size()==0) return res; bool found=false; int cursum=0; int begin=0; int end=array.size()-1; while(begin<end) { cursum=array[begin]+array[end]; if(cursum==sum) { res.push_back(array[begin]); res.push_back(array[end]); found=true; break; } else if(cursum<sum) begin++; else end--; } return res; }
和为s的连续正整数序列,让small初始为1,big初始为2,cursum初始为small+big,当smal小于(s+1)/2时,big递增,cursum+big;当cursum比当前s大时,cur-small,small前移,如果cursum和s相等,加入结果序列
void addtoresult(int small,int big,vector<int>&num,vector<vector<int>>&res) { num.clear();//每次记录新的序列前应该清除旧的序列 for(int i=small;i<=big;i++) { num.push_back(i); } res.push_back(num); } vector<vector<int> > FindContinuousSequence(int sum) { vector<vector<int>>res; vector<int>num; if(sum==1 ||sum==2) { return res; } int small=1; int big=2; int middle=(1+sum)/2; int cursum=small+big; while(small<middle) { if(cursum==sum) { addtoresult(small,big,num,res); } while(cursum>sum&&small<middle) { cursum-=small; small++; if(cursum==sum) addtoresult(small,big,num,res); } big++; cursum+=big; } return res; }
相关文章推荐
- 根据搜索关键字动态显示表格数据
- java 集合类 底层源码解析,慢速更新~偏新手
- Maven实战(五)-- 依赖管理
- JavaScript:事件流与事件处理程序
- 剑指offer——包含min函数的栈
- web数据采集核心技术分享系列(四)利用神经网络实现网页验证码破解
- 搜索引擎选择: Elasticsearch与Solr
- 承诺的功能
- Android之TextView控件的学习
- HDU 4686 Arc of 4000 Dream(矩阵快速幂!)
- python读取 txt转换成csv
- 【Android】炫酷的MaterialDesign Ripple 水波纹触摸动画
- 【JDK】Priority Queue 堆实现源码详解
- 例解 Linux 下 Make 命令
- android框架-final
- 源码搭建Lump环境
- Linux_Linux命令_wc_统计命令_Word Count
- 声明JavaScript函数的六种方法
- apns 总结心得,从小白到大白!后台,退出等情况
- H.264中整数DCT变换,量化,反量化,反DCT究竟是如何实现的?(无代码,无真相)