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

Offer_57_2

题目描述

方法一:暴力枚举

  1. package com.walegarrett.offer;
  2. /**
  3. * @Author WaleGarrett
  4. * @Date 2021/2/12 16:42
  5. */
  6. /**
  7. * 题目描述:输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
  8. * 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
  9. */
  10. import java.util.ArrayList;
  11. import java.util.Arrays;
  12. import java.util.List;
  13. /**
  14. * 方法一:暴力枚举
  15. */
  16. public class Offer_57_2 {
  17. public int[][] findContinuousSequence(int target) {
  18. List<int[]> list = new ArrayList<>();
  19. int sum = 0, upp = (target - 1) / 2;
  20. for(int i=1; i<= upp; i++){
  21. for(int j=i;;j++){
  22. sum+=j;
  23. if(sum > target) {
  24. sum = 0;
  25. break;
  26. }
  27. else if(sum == target){
  28. int[] ans = new int[j-i+1];
  29. for(int k=i;k<=j;k++){
  30. ans[k-i] = k;
  31. }
  32. list.add(ans);
  33. sum = 0;
  34. break;
  35. }
  36. }
  37. }
  38. return list.toArray(new int[list.size()][]);
  39. }
  40. }

方法二:枚举+数学优化

  1. /**
  2. * 方法二:枚举+递增序列的求和公式
  3. */
  4. class Offer_57_2_2 {
  5. public int[][] findContinuousSequence(int target) {
  6. List<int[]> list = new ArrayList<>();
  7. int sum = 0, upp = (target - 1) / 2;
  8. for(int x=1; x<= upp; x++){
  9. long delta = 1 - 4 * (x - (long) x * x - 2 * target);
  10. if(delta<0)//无解
  11. continue;
  12. int delta_sqrt = (int)Math.sqrt(delta + 0.5);
  13. if((long)delta_sqrt * delta_sqrt == delta && (delta_sqrt-1)%2 == 0){
  14. int y = (-1 + delta_sqrt) / 2;
  15. if(x<y){
  16. int[] ans = new int[y-x+1];
  17. for(int k=x;k<=y;k++){
  18. ans[k-x]=k;
  19. }
  20. list.add(ans);
  21. }
  22. }
  23. }
  24. return list.toArray(new int[list.size()][]);
  25. }
  26. }

方法三:双指针法

  1. /**
  2. * 方法三:双指针法
  3. */
  4. class Offer_57_2_3 {
  5. public int[][] findContinuousSequence(int target) {
  6. List<int[]> list = new ArrayList<>();
  7. for(int l=1,r=2;l<r;){
  8. int sum = (l+r) *(r-l+1) /2;
  9. if(sum == target){
  10. int[] ans = new int[r-l+1];
  11. for(int k=l;k<=r;k++)
  12. ans[k-l] = k;
  13. list.add(ans);
  14. l++;
  15. }else if(sum<target)
  16. r++;
  17. else if(sum>target)
  18. l++;
  19. }
  20. return list.toArray(new int[list.size()][]);
  21. }
  22. }

参考题解:和为s的连续正数序列

剑指 Offer 57 - II. 和为s的连续正数序列 + 双指针 + 数论的更多相关文章

  1. 力扣 - 剑指 Offer 57 - II. 和为s的连续正数序列

    题目 剑指 Offer 57 - II. 和为s的连续正数序列 思路1(双指针/滑动窗口) 所谓滑动窗口,就是需要我们从一个序列中找到某些连续的子序列,我们可以使用两个for循环来遍历查找,但是未免效 ...

  2. 剑指 Offer 57 - II. 和为s的连续正数序列

    本题 题目链接 题目描述 我的题解 方法三双100%, 方法一 适合范围广 方法一:双指针(也叫 滑动窗口) 思路分析 用两个指针i和表示当前枚举到的以i为起点,j为终点的区间,sum表示[i,j]的 ...

  3. 剑指offer四十一之和为S的连续正数序列

    一.题目   题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数 ...

  4. LeetCode 题解 | 面试题57 - II. 和为s的连续正数序列

    题目描述 面试题57 - II. 和为s的连续正数序列 难度简单37收藏分享切换为英文关注反馈 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数). 序列内 ...

  5. 剑指 Offer 57. 和为s的两个数字 + 二分法 + 双指针

    剑指 Offer 57. 和为s的两个数字 Offer_57 题目详情 使用二分法 package com.walegarrett.offer; /** * @Author WaleGarrett * ...

  6. 《剑指offer》面试题57 - II. 和为s的连续正数序列

    问题描述 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数). 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列. 示例 1: 输入:target ...

  7. 剑指offer41:所有和为S的连续正数序列,例如,有多少种连续的正数序列的和为100

    1 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久 ...

  8. [简单-剑指 Offer 53 - II. 0~n-1中缺失的数字]

    [简单-剑指 Offer 53 - II. 0-n-1中缺失的数字] 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一 ...

  9. 剑指 Offer 68 - II. 二叉树的最近公共祖先 + 最近公共祖先(LCA)

    剑指 Offer 68 - II. 二叉树的最近公共祖先 Offer_68_2 题目详情 题解分析 java代码 package com.walegarrett.offer; /** * @Autho ...

随机推荐

  1. poj3580 SuperMemo (Splay+区间内向一个方向移动)

    Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 13550   Accepted: 4248 Case Time Limit: ...

  2. 【poj 1988】Cube Stacking(图论--带权并查集)

    题意:有N个方块,M个操作{"C x":查询方块x上的方块数:"M x y":移动方块x所在的整个方块堆到方块y所在的整个方块堆之上}.输出相应的答案. 解法: ...

  3. Codeforces Round #304 (Div. 2) C. Basketball Exercise (DP)

    题意:给你两个长度相同的数组,每次从两个数组中选数(也可以不选),但是不可以在同一个数组中连续选两次,问能选的最大值是多少? 题解:dp,\(dp[i][0]\)表示第\(i\)个位置不选,\(dp[ ...

  4. Codeforces Round #521 (Div. 3) E. Thematic Contests (离散化,二分)

    题意:有\(n\)个话题,每次都必须选取不同的话题,且话题数必须是上次的两倍,第一次的话题数可以任意,问最多能选取多少话题数. 题解:我们首先用桶来记录不同话题的数量,因为只要求话题的数量,与话题是多 ...

  5. Python——Django框架——邮件

    #引用EMAIL服务 EMAIL_BACKEND = 'django.cpre.mail.backends.smtp.EmailBackend' #EMAIL发送服务器 EMAIL_HOST = 's ...

  6. 1076D Edge Deletion 【最短路】

    题目:戳这里 题意:求出1到所有点的最短路径后,把边减到小于等于k条,问保留哪些边可以使仍存在的最短路径最多. 解题思路:这题就是考求最短路的原理.比如dijkstra,用优先队列优化后存在队列中的前 ...

  7. codeforces 6D

    D. Lizards and Basements 2 time limit per test 2 seconds memory limit per test 64 megabytes input st ...

  8. gradle中的build script详解

    目录 简介 project和task 一个例子 task详细讲解 task脚本 task依赖 动态task 默认task build script的外部依赖 gradle中的build script详 ...

  9. MDN All In One

    MDN All In One https://github.com/mdn/ https://wiki.mozilla.org/MDN MDN 要凉了 https://developer.mozill ...

  10. document.URL vs window.location.href All In One

    document.URL vs window.location.href All In One document.URL 与 window.location.href 两者有啥区别 document. ...