今天是小浩算法“365刷题计划”第83天 昨天写了一篇感悟,没想到那么受欢迎。几百人转发,好几千人阅读,虚荣心得到了极大的满足。今天继续为大家分享一道经典面试题目。

01

PART

和为s的连续正数序列

咕咕咕...一道很简单的题目~

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

示例 1:

输入:target = 9

输出:[[2,3,4],[4,5]]

示例 2:

输入:target = 15

输出:[[1,2,3,4,5],[4,5,6],[7,8]]

02

PART

题目分析

特别提醒:这两天有人问我,说浩哥,为什么看了你那么多题解,但是我一旦上机写,便啥都不记得了。这个我想说。。。你真牛掰。普通人应该都做不到看看题解,就能真的掌握一个题目(不信你看书学学KMP,再试试看能不能一次写出来)。题解只是给你提供一个思路,真正的提高,取决于coding的过程。大量的练习,忍受难受的过程,才能真正的进步!

这个题目比较简单,典型的一道滑动窗口的题目。如果对滑动窗口陌生,可以先看下下面的题解:

漫画:滑动窗口 第一讲(滑动窗口最大值)

漫画:滑动窗口 第二讲(无重复字符的最长子串)

漫画:滑动窗口 第三讲(找到字符串中所有字母异位词)

假若我们输入的 target 为 9,大脑中应该有下面这么个玩意:

然后我们通过左右指针来维护一个滑动窗口,同时计算窗口内的值是否是目标值:

如果窗口的值过小,我们就移动右边界。

如果窗口的值过大,我们就移动左边界。

剩下的就是反复上面的操作就可以了。到这里分析过程看似结束了。但是我们可以观察出一丢丢规律,用来优化我们的算法。对于任意一个正整数,总是小于它的中值与中值+1的和。为了让大家直观,用下图举例:

比如这里的100,就一定小于50+51,换成其他数也一样。换句话说,一旦窗口左边界超过中值,窗口内的和一定会大于 target

根据分析,得到题解:(好久没给Go语言的示例了,刻意把代码写的比较简单,没有用啥骚操作哈)

 1//go2func findContinuousSequence(target int) [][]int {3    result := make([][]int, 0)4    i := 15    j := 16    win := 07    arr := make([]int, target)8    for i := range arr {9        arr[i] = i + 1
10    }
11    for i <= target/2 {
12        if win < target {
13            win += j
14            j++
15        } else if win > target {
16            win -= i
17            i++
18        }  else {
19            result = append(result, arr[i-1:j-1])
20            win -= i
21            i++
22        }
23    }
24    return result
25}

同时也给一个java版本的:

 1//java2class Solution {3    public int[][] findContinuousSequence(int target) {4        List<int[]> res = new ArrayList<>();5        int i = 1; 6        int j = 1; 7        int win = 0; 8        while (i <= target / 2) {9            if (win < target) {
10                win += j;
11                j++;
12            } else if (win > target) {
13                win -= i;
14                i++;
15            } else {
16                int[] arr = new int[j-i];
17                for (int k = i; k < j; k++) {
18                    arr[k-i] = k;
19                }
20                res.add(arr);
21                win -= i;
22                i++;
23            }
24        }
25        return res.toArray(new int[res.size()][]);
26    }
27}

郑重申明(读我的文章必看):

  • 本系列所有教程都不会用到复杂的语言特性,大家无须担心没有学过相关语法,算法思想才是最重要的!

  • 作为学术文章,虽然风格可以风趣,但严谨,我是认真的。本文所有代码均在leetcode进行过测试运行。

03

PART

继续优化

到这里你以为这个题目就结束了吗?...哈哈哈哈哈...其实真就结束了~囧!o(╯□╰)o

本题我使用滑动窗口进行求解,是期望给出一种通用解法。有很多基础差的同学,并不能每道题目都玩出来骚操作。但是本题除了常规的滑动窗口之外,其实还有数学法,递推法等多种解题思路。这里给出数学法的提示:等差数列求和公式,希望大家下去自行思考一番,评论区留下你的想法!咱们明天见!

今天的题目到这里就结束了,如果想看其他面试题相关内容的,可以看:

漫画:知乎面试题(旋转数组最小值Ⅰ - 基础版)

漫画:知乎面试题(旋转数组最小值Ⅱ - 进阶版)

漫画:美团面试题(TOPK:求第K个最大的元素)

漫画:腾讯面试题(面试官问我会不会修供暖器,我说没问题)

漫画:位运算技巧整理汇总+一道被嫌弃的题目

如果你问我对学习算法有什么建议,这篇文章是必看的:

漫画:呕心泣血算法指导篇(真正的干货,怒怼那些说算法没用的人)

 小浩算法,每日

关注领取《图解算法》高清版

进群的小伙伴请加右侧私人微信(备注:进群)

-----抽奖分隔线----

???????????? 扫码回复“红包”参与抽奖

金额:100元 | 个数:20个 | 中奖率:20%

漫画:滑动窗口入门题目,没有之一相关推荐

  1. Leetcode双指针滑动窗口相关题目

    滑动窗口 滑动窗口解决哪种问题? 滑动窗口解决给定两个字符串S和T,问你S中是否存在一个子串,包含T中的所有字符并且不含有其他字符. 窗口右指针向右移动,窗口增大,直到满足条件,这时候找到可行解. 窗 ...

  2. uiautomation遍历windows所有窗口_万字长文!滑动窗口看这篇就够了!

    大家好,我是小浩.今天是小浩算法 "365刷题计划" 滑动窗口系列 - 整合篇.之前给大家讲解过一些滑动窗口的题目,但未作系统整理. 所以我就出了这个整合合集,整合工作中除了保留原 ...

  3. 76. 最小覆盖子串(滑动窗口)

    给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" . 注意: 对于 t 中重复字符 ...

  4. 七十四、滑动窗口最值问题

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组 ...

  5. 滑动窗口算法_有点难度,几道和「滑动窗口」有关的算法面试题

    前言科普:什么是滑动窗口算法 滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合. 假设有数组 [a b c d e f g h ],一个大小为 3 的 **滑动窗 ...

  6. 有点难度,几道和「滑动窗口」有关的算法面试题

    前言科普:什么是滑动窗口算法 滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合. 假设有数组 [a b c d e f g h ],一个大小为 3 的 滑动窗口 ...

  7. LeetCode 683. K 个空花盆(set/滑动窗口)

    文章目录 1. 题目 2. 解题 2.1 set 有序 2.2 滑动窗口 1. 题目 花园里有 N 个花盆,每个花盆里都有一朵花. 这 N 朵花会在 N 天内依次开放,每天有且仅有一朵花会开放并且会一 ...

  8. LeetCode 76. 最小覆盖子串(滑动窗口)

    1. 题目 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = &quo ...

  9. 滑动窗口有关的算法面试题

    前言科普:什么是滑动窗口算法 滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合. 假设有数组 [a b c d e f g h ],一个大小为 3 的 滑动窗口 ...

最新文章

  1. Ubuntu中的root权限
  2. Nginx Kafka数据生产接口
  3. sqlserver存储过程入门之 游标
  4. 全美杰出的技术MBA专业
  5. 目录下文件过多无法删除
  6. 多线程中redistemplate不执行_在 Flink 算子中使用多线程如何保证不丢数据?
  7. linux c 获取终端输出到文件,LINUX C获取命令行输出结果
  8. [OS X軟件] 我一直在用的 司机会看的那种 免费资源又多
  9. 群晖J3455安装DS3617xs 6.2.3折腾教程
  10. SQL Server中的聚集索引与堆
  11. 解决打开xml文件没有代码
  12. mysql更改date为ym_关于日期格式设置及转换
  13. MAC M1大数据0-1成神篇-7 补充CAP模式
  14. 2021极术通讯-使用Arm-2D在Cortex-M芯片中实现图形界面
  15. Centos7重新配置网络后出现Restarting network (via systemctl): Job for network.service failed because the contr
  16. GPRS连接阿里云物联网平台一
  17. 微机原理之汇编语言程序设计
  18. hibernate中hbm.xmlmany-to-oneone-to-many中一些属性详解
  19. STM32学习笔记二:命令行工具安装
  20. mysql显示表的所有列车_MySQL命令行查看表信息 | 夕辞

热门文章

  1. 一句话木马、中国菜刀、图片一句话制作、过狗一句话
  2. 【ESD专题】2.ESD防护及保护器件(电介质和压敏电阻)
  3. vscode中 5k多个挂起的更改 怎么解决?
  4. 腾讯云IM REST API V4接口统一请求方法 PHP
  5. 微趣能Weiqn(微信源码下载)V1.5.0.2beta官方版
  6. Git 应用补丁报错 “sha1 information is lacking or useless”
  7. 测试工程师多年面试问题整理
  8. 对前端特效感兴趣的同学可以留意下这些例子,有点意思
  9. C++基础知识 —— 内存分区模型、引用、函数重载、类和继承、this指针、友元、多态、文件操作
  10. 秘密secret的几个应用场景