【优选算法】Sliding-Chakra:滑动窗口的算法流(上)
概念解析🚩什么是滑动窗口算法? 把一个较长的序列(比如数组、字符串等),划分成一个个固定长度或者动态长度的 “子序列”,这个子序列就被称作窗口 。好比通过一个固定大小的窗框在一幅长画卷上逐步移动,每次窗框圈定的部分就是一个窗口内容,窗口会按照特定的规则在序列上 “滑动”,常见的是每次移动一个元素的位置,新元素进入窗口,同时最靠前的旧元素移出窗口,借此不断更新窗口内的数据集合 长度最小的子数组✏️题目描述: ✏️示例: 传送门:长度最小的子数组 题解:💻第一步: 以示例1为例子,如果使用暴力枚举,那么从 2 开始一直向后扩展区间找子集,然后再从开始以此往复,所有的子数组和都枚举一遍显然十分冗余,时间复杂度为O(n²) 说明我们要减少不必要的子数组来优化,如果使用双指针那样异侧指针的话,从两侧缩小来找子集会漏掉一些情况,所以可以考虑同侧指针结合单调性来解决问题 💻第二步: 还是 left 和 right ,都从索引为 0 开始,right 一直向右移动直到该区间的和大于 target 停止,然后 left 一直向右移动寻找是否还有能满足大于 target...
【优选算法】Pointer-Slice:双指针的算法切片(下)
有效三角形的个数✏️题目描述: ✏️示例: 传送门:有效三角形的个数 题解:💻第一步: 一般针对三元的变量,优先想到的是三层 for 循环暴力枚举所有的组合,此时的时间复杂度为O(n³),明显是超时了。争取遍历一遍就能找出所有组合,那么就要减少无效的枚举 根据数学知识可知,假设三角形最大边为c,那么其余两边a、b之和大于c,就能确定一个三角形 为了减少无效的枚举,通常需要利用数列的单调性,就用sort函数迭代器对数组升序排序 💻第二步: 由于是三元,且依据数学知识,我们先固定其中一个数(从最大的开始),剩下两个数就可以利用双指针求组合 假设两数之和大于c,那么可以减小和,寻找是否还有符合要求的组合,即right--;假设两数之和小于c,那么需要增加和,寻找有符合要求的组合,即left++;和相等时就返回组合,然后继续left++,因为减小和仍然有可能找到符合大于c的组合。每判断一次和,就要执行一次移动,当left >=...
【优选算法】Pointer-Slice:双指针的算法切片(上)
概念解析🚩什么是双指针算法? 双指针算法使用两个索引来遍历数据结构,可以根据问题的要求,以不同的方式移动,如同向移动、相向移动或快慢不同的速度移动 移动零✏️题目描述: ✏️示例: 传送门:移动零 题解:💻第一步: 有两个索引 dest 和 cur• dest 表示在已处理的区间内,非零元素的最后一个位置• cur 表示从左往右扫描数组遍历数组 把整个区间划分为三个部分,从前往后分别是非零区间,0区间,待处理区间 💻第二步: 根据题意我们要把 0 都移到数组末尾,所以是要注意是移动,而不是覆盖 刚开始dest 指向 -1的位置,表示非0区间还不存在,然后 cur 先向右移动,如果为 0 就继续向后;如果为非0,就让 dest 向后一位,然后和 cur 交换(因为 cur 遇到 0 不会改变其位置,所以在 dest 后面必定至少有一个 0 ,通过交换就能一直把 0 向后移) 总结后的代码如下: 💻代码实现: 123456789101112131415161718#include <vector>#include...
【优选算法】Prefix-Kage:前缀和的算法影(下)
前缀和+后缀和寻找数组的中心下标✏️题目描述: ✏️示例: 传送门:寻找数组的中心下标 题解:💻第一步: 要计算前后和相等的数的下标(不包括该数),显然要计算前后缀和 假设符合题意的数的下标为 i ,那么其前后数的下标就很容易推导出来了。我们小学的时候就学过函数,那么前后和是不是也可以用一个函数表示,只要有符合的 i 直接代入即可 f:前缀和数组 → f[i] 表示:[0,i-1] 区间所有元素的和g:后缀和数组 → g[i] 表示:[i+1,n-1] 区间所有元素的和 所以根据一维前缀和模版的公式可得 f[i] = f[i - 1] + nums[i - 1] 、g[i] = g[i + 1] + nums[i + 1],注意这个后缀和是从后往前加推导的 💻第二步: 接着遍历题目的数组,枚举出符合 f[i] == g[i] 情况的下标就行了 💻细节问题: 根据我们写的两个公式,当 i = 0 ,i = n - 1 时,即第一个数和最后一个数的下标,发现会出现 f[-1] 、g[n]...
C++天使的灵动心跳代码:类和对象(下)
构造函数补充构造函数赋值一般把成员变量放在私有,通常只是声明或给了缺省值,所以要给他们定义 直接赋值直接给个直观的例子,之前也使用过 1234567891011121314class Date{public: Date(int year, int month, int day) { _year = year; _month = month; _day = day; }private: int _year; int _month; int _day;}; 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值 初始化列表什么是初始化列表? 以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个”成员变量”后面跟一个放在括号中的初始值或表达式 举个例子: 1234567891011121314class Date{ public: Date(int...
【优选算法】Prefix-Kage:前缀和的算法影(上)
概念解析🚩什么是前缀和算法?前缀和算法是一种用于高效计算数组区间和的算法。对于一个给定的数组 nums,我们可以预先计算出它的前缀和数组 prefixSum ,其中 prefixSum[i] 表示 nums[0] 到 nums[i] 的元素之和 比如: 数组:nums [ 1,2,3,4,5,6]前缀和数组 :prefixSum [1, 1 + 2, 1 + 2 + 3, 1 + 2 + 3 + 4, 1 + 2 + 3 + 4 + 5]即[1, 3, 6, 10, 15] 🚩为什么要使用前缀和算法?假设我们要对数组的一块区间进行检查,元素个数为 n ,检查次数为 q ,那么如果使用传统的暴力解法,即模拟算法,每次检查就要遍历一次数组,那么时间复杂度为 O(n∗q),即 O(n²);使用了前缀和算法可以让时间复杂度降级,即O(n) + O(q) ,是一种空间换时间的算法。此时如果 n 和 q...
Microi吾码低代码平台:前端源码的本地运行探索
传送门:Microi吾码官网 前端源码运行环境要求操作系统• Windows、macOS 或 Linux 都可以作为开发环境 • 对于某些依赖特定工具链或包的项目,可能有不同的要求,但大多数前端项目都可以跨平台运行 必备软件工具在开始之前,确保本地环境中已经安装了以下工具: • Node.js 和 npm/yarn:Node.js 是前端开发中不可或缺的环境,npm 和 yarn 是常用的包管理工具,可以从 Node.js 官网下载并安装 • 代码编辑器:如 Visual Studio Code、Sublime Text 或 WebStorm,用于编写和调试代码 • Git:用于克隆代码库和版本控制,Git 也可以从 Git 官网下载安装 项目源码依赖• 项目可能依赖于一些特定版本的库或框架,如 React、Vue、Angular 等,确保提前阅读项目文档,了解是否有其他依赖项 从Git仓库克隆前端源码 打开终端(Terminal),选择合适的工作目录 使用 git clone 命令将项目源码克隆到本地: 12git clone...
C++天使的灵动心跳代码:类和对象(中下)
拷贝构造函数 拷贝构造函数是一种特殊的构造函数,它用于创建一个新对象,这个新对象是另一个同类型对象的副本,只有单个形参,该形参是对本类类型对象的引用(一般常用 const 修饰),在用已存在的类类型对象创建新对象时由编译器自动调用 其语法形式为: 12类名 (const 类名& 对象名) {} 🤔为什么一定要引用传参呢? 当实参把对象传给形参的时候,如果不使用引用传参,那就是一个传值的过程,那么传值的时候要把实参传给一个中间变量,然后再由中间变量传给形参,这中间又涉及了对象的拷贝,然后以此类推,又要传值,又要拷贝,所以使用传值方式编译器直接报错,因为会引发无穷递归调用 🔥值得注意的是: 已存在的对象初始化一个新对象时叫做拷贝,已存在的对象初始化一个已存在的对象时叫做赋值 const...
C++天使的灵动心跳代码:类和对象(中上)
类的六大默认成员函数一个类里面如果什么都没有,就被叫做空类,但是空类里并不是真的什么都没有,而是存在默认构造函数。这个默认构造函数虽然没有做任何具体的初始化操作(因为类中没有成员变量),但它满足了创建对象的基本需求 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数 • 构造函数:主要完成初始化工作 • 析构函数:主要完成清理工作 • 拷贝构造函数:使用同类对象初始化创建对象 • 赋值运算符重载函数:将一个对象的值赋值给另一个同类型的对象 • 取地址运算符重载函数:返回对象的地址或返回const对象的地址 • const 取地址运算符重载函数:返回 const 对象在内存中的地址 构造函数 构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象 其语法形式为: 12类名 ()...
Microi吾码低代码平台:高效便捷的生成与管理全能助手
什么是 Microi 吾码?Microi 吾码是一个专为开发者设计的代码编辑平台,专注于提升开发者的编码效率和工作体验。它以简洁的设计和强大的功能著称,为开发者提供了一个高效、灵活且高度可定制的编程环境 核心理念 Microi 吾码的设计初衷是平衡轻量与强大,让用户无需庞大的集成开发环境(IDE),也能享受到快速、流畅的编码体验。它适用于从日常脚本编写到大型项目开发的各种场景 功能亮点 🚩多语言支持 • Microi 吾码支持多种主流编程语言,如 Python、Java、JavaScript、C++、Go、Ruby 等• 提供语法高亮、代码补全、错误提示、重构等实用功能,帮助开发者更高效地编写代码 🚩轻量级但功能全面 • Microi 吾码启动速度快,占用内存少,但提供了类似 IDE 的功能,如调试工具、终端集成、任务管理等• 特别适合需要在性能有限的设备上编程的用户 🚩插件生态系统 • Microi 吾码内置插件市场,用户可以按需安装插件,扩展功能,比如代码片段管理器、Git 版本控制、数据库工具等• 开发者还能根据需求自行开发插件 🚩多平台支持 • 无论是...