【LeetCode】剑指 Offer 57 - II. 和为s的连续正数序列
【LeetCode】剑指 Offer 57 - II. 和为s的连续正数序列
文章目录
- 【LeetCode】剑指 Offer 57 - II. 和为s的连续正数序列
- 一、求和公式
- 二、滑动窗口(双指针)
一、求和公式
设连续正整数序列的左边界 i 和右边界 j,则此序列的元素和 target 等于元素平均值 (i + j)/ 2 乘以元素数量(j - i + 1),即:
观察发现,当确定元素和 target 与左边界 i 时,可通过解一元二次方程,直接计算出右边界 j,公式推导如下:
整理上式得:
根据一元二次方程求根公式得:
由于 j > i 恒成立,因此直接舍去必为负数的解,即 j 的唯一解求取公式为:
因此,通过从小到大遍历左边界 i 来计算以 i 为起始数字的连续正整数序列。每轮中,由以上公式计算得到右边界 j,当 j 满足以下两个条件时记录结果:
- j 为整数:符合题目所求【连续正整数序列】
- i < j:满足题目要求【至少含有两个数】
class Solution{public int[][] findContinuousSequence(int target){int i = 1;double j = 2.0;ArrayList<int[]> res = new ArrayList<>();while(i < j){j = (-1 + Math.sqrt(1 + 4 * (2 * target + (long) i * i - i))) / 2;if(i < j && j == (int)j){int[] ans = new int[(int)j - i + 1];for(int k = i; k <= (int)j; k++)ans[k - i] = k;res.add(ans);}i++;}return res.toArray(new int[0][]);}
}
- 时间复杂度 O(n):其中 N = target。连续整数序列至少有两个数字,而 i < j 恒成立,因此至多循环 target / 2 次,使用 O(n) 时间。循环内,计算 j 使用 O(1) 时间。当 i = 1 时,达到最大序列长度,考虑到解的稀疏性,将列表构建时间简化考虑为 O(1)
- 空间复杂度 O(1) :变量 i,j 使用常数大小的额外空间
二、滑动窗口(双指针)
设连续正整数序列的左边界 i 和有边界 j,则可构建滑动窗口从左向右滑动。循环中,每轮判断滑动窗口内元素与目标值 target 的大小关系,若相等则记录结果,若大于 target 则移动左边界 i (以减小窗口内的元素和),若小于 target 则移动右边界 j(以增大窗口内的元素和)
算法流程:
- 初始化:左边界 i = 1,右边界 j = 2,元素和 s = 3,结果列表 res
- 循环:当 i ≥ j 时跳出
- 当 s > target 时:向右移动左边界 i = i + 1,并更新元素和 s
- 当 s < target 时:向右移动右边界 j = j + 1,并更新元素和 s
- 当 s = target 时:记录连续整数序列,并向右移动左边界 i = i + 1
- 返回值:返回结果列表 res
class Solution{public int[][] findContinuousSequence(int target){int i = 1;int j = 2;int s = 3;ArrayList<int[]> res = new ArrayList<>();while(i < j){if(s == target){int[] ans = new int[j - i + 1];for(int k = i; k <= j; k++)ans[k - i] = k;res.add(ans);}if(s >= target){s -= i;i++;}else{j++;s += j;}}return res.toArray(new int[0][]);}
}
- 时间复杂度 O(n):其中 N = target。连续整数序列至少有两个数字,而 i < j 恒成立,因此至多循环 target 次(i,j 都移动到 target / 2),使用 O(n) 时间。当 i = 1 时,达到最大序列长度,考虑到解的稀疏性,将列表构建时间简化考虑为 O(1)
- 空间复杂度 O(1):变量 i,j,s 使用常数大小的额外空间
【LeetCode】剑指 Offer 57 - II. 和为s的连续正数序列相关推荐
- Leetcode 剑指 Offer 57 - II. 和为s的连续正数序列 (每日一题 20210809)
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数).序列内的数字由小到大排列,不同序列按照首个数字从小到大排列.示例 1:输入:target = 9 输出: ...
- LeetCode Algorithm 剑指 Offer 57 - II. 和为s的连续正数序列
剑指 Offer 57 - II. 和为s的连续正数序列 Ideas 区间问题首先想到用双指针. 因为这题没有给定数组,其实相当于就是一个从1到target的数组,然后直接套双指针的模板就可以了. 双 ...
- 剑指 Offer 57 - II. 和为s的连续正数序列 思考分析
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数). 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列. 示例 1: 输入:target = 9 ...
- 2021-08-28剑指 Offer 57 - II. 和为s的连续正数序列
双指针 1)终止条件target = = sum: 2)target > sum 的时候,left++: 3)target < sum 的时候,right++: 5)sum = ([rig ...
- 【剑指offer{40-44}】和为S的连续正数序列、和为S的两个数字、左旋转字符串、翻转单词顺序列、扑克牌顺子
文章目录 和为S的连续正数序列 题目描述 C++代码 和为S的两个数字 题目描述 C++代码 左旋转字符串 题目描述 C++代码 翻转单词顺序列 题目描述 C++代码 扑克牌顺子 题目描述 C++代码 ...
- 面试题57 - II. 和为s的连续正数序列 golang
题目 面试题57 - II. 和为s的连续正数序列 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数). 序列内的数字由小到大排列,不同序列按照首个数字从小 ...
- 剑指Offer - 面试题57 - II. 和为s的连续正数序列(滑动窗口)
1. 题目 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数). 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列. 示例 1: 输入:targe ...
- Leetcode 剑指 Offer 58 - II. 左旋转字符串 (每日一题 20210830)
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结 ...
- leetcode剑指 Offer 53 - II. 0~n-1中缺失的数字(二分查找)
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字. 示例 1: 输入: [0,1,3 ...
最新文章
- Java项目:角色权限后台脚手架系统(java+Springboot+Maven+myBaits-Plus+Vue+Element-UI+Mysql)
- linux软件包管理-rpm
- dnf安徒恩服务器不稳定,DNF安图恩掉线怎么办 INS安图恩攻坚战不惧掉线
- HDOJ HDU 1709 The Balance ACM 1709 IN HDU
- Conda 安装本地包
- java foreach跳出本次循环_Java中提供三种常用的循环语句
- 宋浩 概率统计 笔记_推论统计分析学习笔记
- 苹果笔记本电脑好用吗_苹果这些让人超疑惑的配件,价格超贵而且真的好用吗?...
- matlab 平滑曲线连接_从零开始的matlab学习笔记——(16)函数绘图
- selenium+crop+chaojiying 之模拟登录超级鹰
- 中国月度、年度NDVI/植被覆盖空间分布数据分享(1986-2021)
- 关于springboot:Spring-ContentNegotiation内容协商之使用篇一
- 安装Aras Innovator12 sp9全过程
- 3DES加密,苹果、Java 、安卓 平台一致的加密工具
- 判断浏览器必须是IE10以上,低于IE10做出提示
- 使用WPF与C#实现鼠标画线
- WIN10版本安装JDK
- 粒子能量、量子波动方程、狄拉克方程、量子态【量子力学基础知识学习笔记_3】
- IDB数据桥提供方用oracle,WinCC与第三方系统数据交互IndustrialDataBridge(54页)-原创力文档...
- C++ Reference: Standard C++ Library reference: C Library: cstdio: vsnprintf
热门文章
- Java中反射主要应用在哪里_Java学习:反射的应用场景和解析方法
- php提供了什么来实现反射,php提供实现反射的方法和实例代码
- mysql for update缺点_有关mysql的for update以及 死锁问题
- 软件测试缺陷定义和管理
- linux 环境搭建Jenkins
- 题解-bzoj3901 棋盘游戏
- 洛谷P1852 奇怪的字符串
- matplotlib简单使用
- leetcode 144. Binary Tree Preorder Traversal ----- java
- 中大东校小米路由器mini实现inode上网,ipv6 wifi【中大】【东校】【inode】【ipv6】...