算法-基础算法
一、枚举算法
也称为穷举算法,指的是按照问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,将它们逐一与目标状态进行比较以得出满足问题要求的解。在列举的过程中,既不能遗漏也不能重复
1. 问题
公鸡一只五块钱,母鸡一只三块钱,小鸡三只一块钱。现在我们用 100 块钱买了 100 只鸡,问公鸡、母鸡、小鸡各买了多少只。
2. 思路
- 确定枚举对象:枚举对象为公鸡、母鸡、小鸡的只数,那么我们可以用变量 x、y、z 分别来代表公鸡、母鸡、小鸡的只数。
- 确定枚举范围:因为总共买了 100 只鸡,所以 0 ≤ x, y ,z ≤ 100,则 x、y、z 的枚举范围为 [0,100]。
- 确定判断条件:根据题意,我们可以列出两个方程式:5*× + 3*y + 3/z=100 =100,x+y+z=100。在枚举 x、y、z 的过程中,我们可以根据这两个方程式来判断是否当前状态是否满足题意.
3. 代码
function buyChicken() {for (let x = 0; x <= 20; x++) { // 遍历公鸡数量,最多 20 只for (let y = 0; y <= 33; y++) { // 遍历母鸡数量,最多 33 只const z = 100 - x - y; // 计算小鸡数量// 检查条件:总数为 100 只鸡,价格为 100 元if (z % 3 === 0 && 5 * x + 3 * y + z / 3 === 100) {console.log(`公鸡 ${x} 只,母鸡 ${y} 只,小鸡 ${z} 只`);}}}
}// 调用函数解决鸡的购买问题
buyChicken();
二、递归算法
指的是一种通过重复将原问题分解为同类的子问题而解决的方法。在绝大数编程语言中,可以通过在函数中再次调用函数自身的方式来实现递归。
1. 问题
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
示例 1:
输入:n = 2 输出:1 解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 2:
输入:n = 3 输出:2 解释:F(3) = F(2) + F(1) = 1 + 1 = 2
示例 3:
输入:n = 4 输出:3 解释:F(4) = F(3) + F(2) = 2 + 1 = 3
2. 代码
function fib(n) {if (n === 0) {return 0; // 基本情况:第 0 项为 0}if (n === 1) {return 1; // 基本情况:第 1 项为 1}return fib(n - 1) + fib(n - 2); // 递归调用,计算第 n 项
}// 示例用法
const n = 10; // 要计算的斐波那契数列的项数
const result = fib(n); // 计算第 n 项的值
console.log(`斐波那契数列的第 ${n} 项是 ${result}`);
三、分治算法
字面上的解释是「分而治之」,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并
1. 问题
给你一个整数数组 nums,请你将该数组升序排列。
示例 1:
输入:nums = [5,2,3,1] 输出:[1,2,3,5]
示例 2:
输入:nums = [5,1,1,2,0,0] 输出:[0,0,1,1,2,5]
2. 代码
class Solution {// 合并两个已排序的数组merge(leftArr, rightArr) {const arr = [];while (leftArr.length && rightArr.length) {if (leftArr[0] <= rightArr[0]) {arr.push(leftArr.shift()); // 将左数组的第一个元素移入结果数组} else {arr.push(rightArr.shift()); // 将右数组的第一个元素移入结果数组}}return arr.concat(leftArr, rightArr); // 合并左右数组并返回}// 递归实现归并排序mergeSort(arr) {if (arr.length <= 1) {return arr; // 基本情况:如果数组长度小于等于 1,直接返回}const middle = Math.floor(arr.length / 2);const leftArr = arr.slice(0, middle); // 分成左半部分const rightArr = arr.slice(middle); // 分成右半部分// 递归调用排序左右部分,然后合并结果return this.merge(this.mergeSort(leftArr), this.mergeSort(rightArr));}// 入口点,用于对给定数组进行排序sortArray(nums) {return this.mergeSort(nums);}
}// 示例用法
const solution = new Solution();
const nums = [38, 27, 43, 3, 9, 82, 10];
const sortedArray = solution.sortArray(nums);
console.log(sortedArray);
四、回溯算法
一种能避免不必要搜索的穷举式的搜索算法。采用试错的思想,在搜索尝试过程中寻找问题的解,当探索到某一步时,发现原先的选择并不满足求解条件,或者还需要满足更多求解条件时,就退回一步(回溯)重新选择,这种走不通就退回再走的技术称为「回溯法」,而满足回溯条件的某个状态的点称为「回溯点」
1. 问题
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0] 输出:[[],[0]]
2. 思路
明确所有选择:根据数组中每个位置上的元素选与不选两种选择,画出决策树,如下图所示
明确终止条件:
- 当遍历到决策树的叶子节点时,就终止了。即当前路径搜索到末尾时,递归终止
3. 代码
class Solution {subsets(nums) {const res = []; // 存放所有符合条件的结果集合const path = []; // 存放当前符合条件的结果function backtracking(index) {res.push([...path]); // 将当前符合条件的结果放入集合中for (let i = index; i < nums.length; i++) {path.push(nums[i]); // 选择元素backtracking(i + 1); // 递归搜索path.pop(); // 撤销选择}}backtracking(0);return res;}
}// 示例用法
const solution = new Solution();
const nums = [1, 2, 3];
const result = solution.subsets(nums);
console.log(result);
五、贪心算法
一种在每次决策时,总是采取在当前状态下的最好选择,从而希望导致结果是最好或最优的算法
贪心算法是一种改进的「分步解决算法」,其核心思想是:将求解过程分成「若干个步骤」,然后根据题意选择一种「度量标准」,每个步骤都应用「贪心原则」,选取当前状态下「最好 / 最优选择(局部最优解)」,并以此希望最后得出的结果也是「最好 / 最优结果(全局最优解)」。
换句话说,贪心算法不从整体最优上加以考虑,而是一步一步进行,每一步只以当前情况为基础,根据某个优化测度做出局部最优选择,从而省去了为找到最优解要穷举所有可能所必须耗费的大量时间
1. 问题
一位很棒的家长为孩子们分发饼干。对于每个孩子 i,都有一个胃口值 g[i],即每个小孩希望得到饼干的最小尺寸值。对于每块饼干 j,都有一个尺寸值 s[j]。只有当 s[j] > g[i] 时,我们才能将饼干 j 分配给孩子 i。每个孩子最多只能给一块饼干。
现在给定代表所有孩子胃口值的数组 g 和代表所有饼干尺寸的数组 j。
要求:尽可能满足越多数量的孩子,并求出这个最大数值。
2. 思路
- 转换问题:将原问题转变为,当胃口最小的孩子选择完满足这个孩子的胃口且尺寸最小的饼干之后,再解决剩下孩子的选择问题(子问题)。
- 贪心选择性质:对于当前孩子,用尺寸尽可能小的饼干满足这个孩子的胃口。
- 最优子结构性质:在上面的贪心策略下,当前孩子的贪心选择 + 剩下孩子的子问题最优解,就是全局最优解。也就是说在贪心选择的方案下,能够使得满足胃口的孩子数量达到最大
3. 代码
class Solution {// 解决分发饼干问题的方法findContentChildren(g, s) {// 对孩子的贪心因子列表和饼干的贪心因子列表进行排序g.sort((a, b) => a - b);s.sort((a, b) => a - b);let indexG = 0; // 孩子列表的指针let indexS = 0; // 饼干列表的指针let res = 0; // 用于存放满足条件的孩子数量// 使用双指针法,遍历孩子和饼干列表while (indexG < g.length && indexS < s.length) {if (g[indexG] <= s[indexS]) {res++; // 如果当前饼干满足当前孩子的贪心因子,将孩子数量加 1indexG++; // 孩子指针向后移动indexS++; // 饼干指针向后移动} else {indexS++; // 如果当前饼干不满足当前孩子的贪心因子,尝试下一个饼干}}return res; // 返回满足条件的孩子数量}
}// 示例用法
const solution = new Solution();
const g = [1, 2, 3];
const s = [1, 1];
const contentChildren = solution.findContentChildren(g, s);
console.log(contentChildren);
——未完待续——
相关文章:

算法-基础算法
一、枚举算法 也称为穷举算法,指的是按照问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,将它们逐一与目标状态进行比较以得出满足问题要求的解。在列举的过程中,既不能遗漏也不能重复 1. 问题 …...
特种设备作业人员-G3锅炉水处理如何备考学习?
备考特种设备作业人员 - G3 锅炉水处理可以从了解考试信息、掌握基础知识、选择学习资料、制定学习计划等多个方面入手,以下是具体的建议: 1.了解考试信息 *明确考试大纲:详细了解 G3 锅炉水处理考试大纲的要求,明确考试的…...

Reactor模式详解:高并发场景下的事件驱动架构
文章目录 前言一、Reactor模式核心思想二、工作流程详解2.1 服务初始化阶段2.2 主事件循环2.3 子Reactor注册流程2.4 IO事件处理时序2.5 关键设计要点 三、关键实现技术四、实际应用案例总结 前言 在现代高性能服务器开发中,如何高效处理成千上万的并发连接是一个关…...
UniApp 生产批次管理模块技术文档
UniApp 生产批次管理模块技术文档 1. 运行卡入站页面 (RunCardIn) 1.1 页面结构 <template><!-- 页面容器 --><view class"runCardIn" :style"{ paddingTop: padding }"><!-- 页头组件 --><pageHeader :title"$t(MENU:…...

项目日记 -Qt音乐播放器 -设置任务栏图标与托盘图标
博客主页:【夜泉_ly】 本文专栏:【Qt音乐播放器】 欢迎点赞👍收藏⭐关注❤️ 代码仓库:MusicPlayer v1.0版视频展示:Qt -音乐播放器(仿网易云)V1.0 前言 本文的目标: 一是设置任务栏的图标, 二…...

国产 BIM 软件万翼斗拱的技术突破与现实差距 —— 在创新与迭代中寻找破局之路
万翼斗拱在国产BIM领域迈出重要一步,凭借二三维一体化、参数化建模及AI辅助设计等功能形成差异化竞争力,在住宅设计场景中展现效率优势,但与国际主流软件相比,在功能完整性、性能稳定性和生态成熟度上仍有显著差距,需通…...
记录算法笔记(2025.5.29)最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int get…...
Android SurfaceFlinger核心工作机制
SurfaceFlinger 核心工作机制解析 1. 启动入口与初始化流程 (1) 进程启动入口 二进制文件:/system/bin/surfaceflinger 源码路径:frameworks/native/services/surfaceflinger/main_surfaceflinger.cppint main(int, char**) {// 1. 初始化进程配置sig…...

Golang|etcd服务注册与发现 策略模式
etcd 是一个开源的 分布式键值存储系统(Key-Value Store),主要用于配置共享和服务发现。 ETCD是一个键值(KV)数据库,类似于Redis,支持分布式集群。ETCD也可以看作是一个分布式文件系统ÿ…...
深度解析UniApp盲盒系统开发:从源码架构到多端部署全流程
一、正版盲盒系统的技术选型与源码设计 跨平台开发框架的核心配置 UniApp多端适配方案 环境搭建:全局安装vue/cli与npm install -g dcloudio/uni-cli,通过uni -V验证版本(需≥3.0)。多端编译命令: # 编译微…...
STM32的OLED显示程序亲测可用:适用于多种场景的稳定显示解决方案
STM32的OLED显示程序亲测可用:适用于多种场景的稳定显示解决方案 【下载地址】STM32的OLED显示程序亲测可用 这是一套专为STM32设计的OLED显示程序,经过实际测试,运行稳定可靠。支持多种OLED屏幕尺寸和类型,提供丰富的显示效果&am…...

【AI News | 20250529】每日AI进展
AI Repos 1、WebAgent 阿里巴巴通义实验室近日发布了WebDancer,一款旨在实现自主信息搜索的原生智能体搜索推理模型。WebDancer采用ReAct框架,通过分阶段训练范式,包括浏览数据构建、轨迹采样、监督微调和强化学习,赋予智能体自主…...

Day12 - 计算机网络 - HTTP
HTTP常用状态码及含义? 301和302区别? 301:永久性移动,请求的资源已被永久移动到新位置。服务器返回此响应时,会返回新的资源地址。302:临时性性移动,服务器从另外的地址响应资源,但…...

Linux驱动学习笔记(十)
热插拔 1.热插拔:就是带电插拔,即允许用户在不关闭系统,不切断电源的情况下拆卸或安装硬盘,板卡等设备。热插拔是内核和用户空间之间,通过调用用户空间程序实现交互来实现的,当内核发生了某种热拔插事件时…...
如何优化Elasticsearch的搜索性能?
优化 Elasticsearch 的搜索性能需要从索引设计、查询优化、硬件配置和集群调优等多方面入手。以下是系统化的优化策略和实操建议: 一、索引设计优化 1. 合理设置分片数 分片大小:单个分片建议 10-50GB(超过50GB会影响查询性能)。分片数量: 总分片数 ≤ 节点数 1000(避免…...

TI dsp FSI (快速串行接口)
简介 快速串行接口(FSI - Fast Serial Interface )模块是一种串行通信外设,能够在隔离设备之间实现可靠的高速通信。在两个没有共同电源和接地连接的电子电路必须交换信息的情况下,电气隔离设备被使用。 虽然隔离设备促进了信号通…...

责任链模式:构建灵活可扩展的请求处理体系(Java 实现详解)
一、责任链模式核心概念解析 (一)模式定义与本质 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,其核心思想是将多个处理者对象连成一条链,并沿着这条链传递请求,直到有某…...
nlp中的频率就是权重吗
🔢 一、“频率”是什么? 在 NLP 中,**词频(frequency)**通常指的是: 某个单词或 token 在语料库中出现的次数(或比例) 举例: "The cat sat on the mat. The cat i…...
融智学“新五常”框架:五维方式的重构与协同
融智学“新五常”框架:五维方式的重构与协同 一、理论基底:从传统老五常到当代新五常的范式跃迁 邹晓辉教授提出的新五常(生活方式DBA、学习方式DBA、工作方式DBA、旅行方式DBA、娱乐方式DBA),本质是将融智学的核心原…...

wechat-003-学习笔记
1.路由跳转页面:携带的参数会出现在onlaod中的options中。 注意:原生小程序对路由传参的长度也有限制,过长会被截掉。 2.wx.setNavigationBarTitle(Object object) 动态设置当前页面的标题 3.在根目录中的app.json文件中配置 后台播放音乐的能…...

【大模型微调】魔搭社区GPU进行LLaMA-Factory微调大模型自我认知
文章概要: 本文是一篇详细的技术教程,介绍如何使用魔搭社区(ModelScope)的GPU资源来进行LLaMA-Factory的模型微调。文章分为11个主要步骤,从环境准备到最终的模型测试,系统地介绍了整个微调流程。主要内容包…...
基于MATLAB编程针对NCV检测数据去漂移任务的完整解决方案
以下为针对NCV检测数据去漂移任务的完整解决方案,基于MATLAB编程实现,结构清晰,内容详实,满足技术深度。 NCV信号尾部漂移处理与分析 1. 任务背景与目标 神经传导速度(NCV)检测信号易受环境干扰与设备漂移…...

【数据结构】哈希表的实现
文章目录 1. 哈希的介绍1.1 直接定址法1.2 哈希冲突1.3 负载因子1.4 哈希函数1.4.1 除法散列法/除留余数法1.4.2 乘法散列法1.4.3 全域散列法 1.5 处理哈希冲突1.5.1 开放地址法1.5.1.1 线性探测1.5.1.2 二次探测1.5.1.3 双重探测1.5.1.4 三种探测方法对比 1.6.3 链地址法 2. 哈…...

永磁同步电机控制算法--基于电磁转矩反馈补偿的新型IP调节器
一、基本原理 先给出IP速度控制器还是PI速度控制器的传递函数: PI调节器 IP调节器 从IP速度控制器还是PI速度控制器的传递函数可以看出,系统的抗负载转矩扰动能力相同,因此虽然采用IP速度控制器改善了转速环的超调问题,但仍然需要通过其他途…...

RabbitMQ 应用 - SpringBoot
以下介绍的是基于 SpringBoot 的 RabbitMQ 开发介绍 Spring Spring AMQP RabbitMQ RabbitMQ tutorial - "Hello World!" | RabbitMQ 工程搭建步骤: 1.引入依赖 2.编写 yml 配置,配置基本信息 3.编写生产者代码 4.编写消费者代码 定义监听类,使用 RabbitListener…...

基于递归思想的系统架构图自动化生成实践
文章目录 一、核心思想解析二、关键技术实现1. 动态布局算法2. 样式规范集成3. MCP服务封装三、典型应用场景四、最佳实践建议五、扩展方向一、核心思想解析 本系统通过递归算法实现了Markdown层级结构到PPTX架构图的自动转换,其核心设计思想包含两个维度: 数据结构递归:将…...

OpenGL Chan视频学习-9 Index Buffers inOpenGL
bilibili视频链接: 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函数网站: docs.gl 说明: 1.之后就不再单独整理网站具体函数了,网站直接翻译会…...
《基于AIGC的智能化多栈开发新模式》研究报告重磅发布! ——AI重塑软件工程,多栈开发引领未来
在人工智能技术迅猛发展的浪潮下,软件开发领域正经历一场前所未有的范式革命。在此背景下,由贝壳找房(北京)科技有限公司、中国信息通信研究院云计算与大数据研究所联合编写,阿里、腾讯、北京大学、南京大学、同济大学…...
热门大型语言模型(LLM)应用开发框架
我们来深入探索这些强大的大型语言模型(LLM)应用开发框架,并且我会尝试用文本形式描述一些核心的流程图,帮助您更好地理解它们的工作机制。由于我无法直接生成图片,我会用文字清晰地描述流程图的各个步骤和连接。 Lang…...

Nginx安全防护与HTTPS部署实战
目录 前言一. 核心安全配置1. 隐藏版本号2. 限制危险请求方法3. 请求限制(CC攻击防御)(1)使用nginx的limit_req模块限制请求速率(2)压力测试验证 4. 防盗链 二. 高级防护1. 动态黑名单(1&#x…...