剑指 Offer 57 - II. 和为s的连续正数序列 思考分析

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:

输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:

输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]

限制:

1 <= target <= 10^5

暴力解,通过

注意,子序列长度大于等于二,所以我们循环以二分之一个目标作为结束标志,当然也要注意一下要不要+1,以及循环结束条件是小于等于还是等于的问题。
AC代码:

class Solution {
public:vector<vector<int>> findContinuousSequence(int target) {int start = 1;vector<vector<int>>result;vector<int>smallresult;int half_target = (target*0.5) + 1;while (start <= half_target){int sum = 0;int flag = 0;smallresult.clear();for (int i = start;i <= half_target;i++){flag = 1;sum += i;smallresult.push_back(i);if (sum > target){break;}else if (sum == target){result.push_back(smallresult);break;}}if (flag == 1) start++;}return result;}
};

在这里插入图片描述

优化暴力解

优化之后的代码:仍然是暴力法,不过将push_back换成了emplace_back,然后将插入和清除操作放入了sum == target的逻辑块中,减少了插入以及删除元素带来的时间损失。

class Solution {
public:vector<vector<int>> findContinuousSequence(int target) {int start = 1;vector<vector<int>>result;vector<int>smallresult;int half_target = (target*0.5) + 1;while (start <= half_target){int sum = 0;int flag = 0;for (int i = start;i <= half_target;i++){flag = 1;sum += i;if (sum > target){break;}else if (sum == target){smallresult.clear();for(int j=start;j<=i;j++) smallresult.emplace_back(j);result.emplace_back(smallresult);break;}}if (flag == 1) start++;}return result;}
};

在这里插入图片描述

再次优化思路

一开始我列下了两个优化思路:
1、若只有一组结果,或者没有结果,能不能找到一种方法直接返回结果
2、如果已经完成一组结果,下一组的推断能不能用到上一组的信息。
接下来就是一大堆乱改步长的操作,也就是说,之前每完成一次子序列和没有完成子序列,下一次的起始点都是原起始点+1,此时我们不这样做,而是在完成一次子序列后,修改下一次的起始点。
修改思路:
此处的i是指完成一次子序列时的子序列的右边界
1、new_start=(i+start)0.5+1; (经过验证,是错误的)
2、new_start= i
0.5+1; (经过验证,是错误的)
3、new_start=start+2; 这个倒是可以。。。不过优化不是很多

双指针(滑动窗口)

我们用两个指针 L 和 R 表示当前枚举到的以 L 为起点到 R 的区间,sum 表示[L,R]的区间和,由求和公式可知;
在这里插入图片描述
也就是说,如果确定了一对L、R,就可以直接得到sum值,而不需要累加计算了(省时序)
如果sum<target 则说明指针R还可以向右拓展使得sum 增大,此时指针R向右移动,即 r+=1
如果sum>target 则说明以L为起点不存在一个R使得 sum=target,此时要枚举下一个起点,指针L向右移动,即l+=1
如果sum==target 则说明我们找到了以L为起点得合法解 [l,r],我们需要将 [l,r][l,r] 的序列放进答案数组,且我们知道以L为起点的合法解最多只有一个,所以需要枚举下一个起点,指针L向右移动,即 l+=1
(题外话,官方解的第三种方法讲解有问题。。。)
而且感觉这个方法也没有用到区间信息,只是高级在使用了公式。

class Solution {
public:vector<vector<int>> findContinuousSequence(int target) {vector<vector<int>>vec;vector<int> res;for (int l = 1, r = 2; l < r;){int sum = (l + r) * (r - l + 1) / 2;if (sum == target){res.clear();for (int i = l; i <= r; ++i) res.emplace_back(i);vec.emplace_back(res);l++;}else if (sum < target) r++;else l++;}return vec;}
};

在这里插入图片描述
另外还发现了一个C++语法的问题:
c++11 之emplace_back 与 push_back的区别
总结就是能用emplace_back就用emplace_back。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java uuid静态方法_Java UUID compareTo()方法与示例

java uuid静态方法UUID类compareTo()方法 (UUID Class compareTo() method) compareTo() method is available in java.util package. compareTo()方法在java.util包中可用。 compareTo() method is used to compare two UUID objects or in other words, it is used to compar…

hdu 1214

找规律的题目。如果不是圆环形状的话&#xff08;也就是n个人排成直线&#xff09;&#xff0c;完全调换顺序需要(n-1)*n/2次交换&#xff1b;为环形的时候&#xff0c;可能不需要这么多&#xff0c;因为调换有了两个方向。我们记直线时n个人需要的交换次数为g(n)(n-1)*n/2&…

六、规则组织的衍生组织——纬向破斜组织数学模型的建立

基础概念公式推到可参考该专栏下的前几篇博文。 纬向破斜组织图&#xff1a; 下半部分(从左往右)&#xff1a;&#xff0c;3上2下2上1下&#xff0c;右斜&#xff0c;飞数为1 上半部分(从下往上)&#xff1a;&#xff0c;2上2下1上3下。左斜&#xff0c;飞数为-1 通过分析可…

车牌识别与计算机编程,基于MATLAB的车牌识别程序详解.ppt

基于MATLAB的车牌识别程序详解自定义一个字符函数&#xff0c;用来从车牌区域中提取出7个字符&#xff0c;其中利用切割函数来进行切割。 程序&#xff1a;function [word,result]getword(d) word[];flag0;y18;y20.5; while flag0 [m,n]size(d);%将d的尺寸存入m n wide0; while…

数据结构与算法2——数组

数组是应用最广泛的数据存储结构。它被植入到大部分编程语言中。大部分数据结构都有最基本的四个操作&#xff1a;插入、删除、查找、修改。对于这四种操作每一种数据结构都有相应的算法。算法和数据结构因此就是非常紧密的相联系的。 1 数组例子 …

java treemap_Java TreeMap putAll()方法与示例

java treemapTreeMap类putAll()方法 (TreeMap Class putAll() method) putAll() method is available in java.util package. putAll()方法在java.util包中可用。 putAll() method is used to copy all the key-value pairs from the given map (m) and paste it into this map…

LeetCode 167. 两数之和 II - 输入有序数组 思考分析

目录1、暴力&#xff0c;超时2、双指针滑动窗口条件限制 AC3、观看题解&#xff08;吸取他人经验&#xff09;1、二分查找2、双指针3、双指针二分查找给定一个已按照升序排列 的有序数组&#xff0c;找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 …

敏捷开发用户故事系列之七:用户故事与MVC

这是用户故事系列的第七篇。&#xff08;之一&#xff0c;之二&#xff0c;之三&#xff0c;之四&#xff0c;之五&#xff0c;之六&#xff0c;之七&#xff0c;之八&#xff0c;之九&#xff09;用户故事和MVC没有关系&#xff0c;因为MVC是实现方法&#xff0c;因此在思考用…

七、规则组织的衍生组织——菱形斜纹组织数学模型的建立

基础概念公式推到可参考该专栏下的前几篇博文。 菱形斜纹组织图&#xff1a; 分析&#xff1a;首先3上2下2上1下&#xff0c;飞数为1&#xff0c;右斜。kw8表示从左下角开始往上数8格为纬峰所在位置&#xff1b;kj8表示从左上角开始往右数8格为经峰所在位置。 这样就将菱形斜…

显卡测试软件毛毛虫,超龙超龙,与众不同,顶流配备,散热一流,3070Ti超龙旗舰版评测...

可能大家都没想到此次显卡荒会持续近一年&#xff0c;还是出现国家级干涉才将这股“歪风”刹住了。而且也仅仅算是刹住了大陆的速度&#xff0c;主要踩死刹车的应该就是黄大厨。他从5月初推出的新核心就采取了出厂即锁算力的做法&#xff0c;但是即便如此&#xff0c;那些看着高…

poj 2513 Colored Sticks

// 判断图是否联通 在连通的基础上还要判断是否存在欧拉通路// 判断连通就并查集了 判断是否存在欧拉通路&#xff1a; 点度数为数的点 1 >3就是不存在的 其它是存在的// 我开始用 map 判重 然后就悲剧了一上午 好久没写 Trie树了 都忘了、#include <iostream> #in…

strictmath_Java StrictMath ulp()方法与示例

strictmathStrictMath类ulp()方法 (StrictMath Class ulp() method) Syntax: 句法&#xff1a; public static double ulp(double do);public static float ulp(float fl);ulp() Method is available in java.lang package. ulp()方法在java.lang包中可用。 ulp(double do) Me…

八、非规则组织分析及其数学模型——平纹变化组织

非规则组织顾名思义&#xff0c;无法通过一个数学模型来描述所有的非规则组织、对于每一个具体的非规则组织而言&#xff0c;其也有一定的规律性可循&#xff0c;即可通过分析每一个具体的非规则组织的组织点运动规律来建立相应的数学模型。 一、平纹变化组织 平纹变化组织即…

怎么看xp计算机是32位还是64位,教你查看XP系统的不同32位还是64位详细的步骤

电脑中使用的不同的版本如果安装一些大型的游戏的时候都是有技巧来实现的&#xff0c;那在XP电脑中想要知道的对于不同的32位还是64位的版本的文件操作的时候新手是怎么知道自己安装的软件的版本呢&#xff0c;今天小编就来跟大家分享一下教你查看XP系统的不同32位还是64位详细…

微软面试100题2010年版全部答案集锦(含下载地址)

微软等数据结构算法面试100题全部答案集锦作者&#xff1a;July、阿财。时间&#xff1a;二零一一年十月十三日。引言无私分享造就开源的辉煌。今是二零一一年十月十三日&#xff0c;明日14日即是本人刚好开博一周年。在一周年之际&#xff0c;特此分享出微软面试全部100题答案…

get post

1. get是从服务器上获取数据&#xff0c;post是向服务器传送数据。2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中&#xff0c;值和表单内各个字段一一对应&#xff0c;在URL中可以看到。post是通过HTTP post机制&#xff0c;将表单内各个字段与其内容放置在HTML …

LeetCode 27.移除元素 思考分析

题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长…

九、非规则组织分析及其数学模型——曲线斜纹组织

曲线斜纹组织图&#xff1a; 因为其形状酷似抛物线&#xff0c;抛物线又是曲线中的一种&#xff0c;故称为曲线斜纹组织。 特点&#xff1a;1&#xff0c;每一根经纱上的组织点运动规律不变 2&#xff0c;飞数是变化的&#xff0c;故也称为变飞数组织 飞数满足的两个条件&…

ulp通信_Java Math类ulp()方法及示例

ulp通信数学类ulp()方法 (Math class ulp() method) ulp() method is available in java.lang package. ulp()方法在java.lang包中可用。 ulp() method is used to return the size of a ulp of the given argument, where, a ulp of the given value is the positive distance…

计算机公式column,函数公式的左膀右臂:ROW、COLUMN函数知多少

一个公式生成乘法口诀表演示的公式中用到了两个函数&#xff1a;ROW和COLUMN&#xff0c;这两个函数的用途非常广泛&#xff0c;可以配合其他函数实现很多功能(尤其是和VLOOKUP函数)&#xff0c;另外和这两个函数相似的还有ROWS和COLUMNS函数&#xff0c;也顺便介绍下。函数说明…