学习笔记 算法

OMP算法学习笔记 OMP算法 阅读详情

一、 双指针

  1. 普通双指针:两个指针往同一个方向移动(有时不是同一个方向)
  2. 对撞双指针:两个指针面对面移动
  3. 快慢双指针:慢指针+快指针
  4. 例:a = [1,4,5,7,9](有序数组) 两个数相加等于12,且两个数不能相同。
    对撞双指针:

例:检测是否为环形链表
快慢双指针:慢指针每次循环移动一格,快指针移动两格,最终是否相遇。

在这里插入图片描述

public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head == null){
            return false;
        }   
        else{
            ListNode slow = head;
            ListNode fast = head;
            while(fast != null && fast.next != null){
                slow = slow.next;
                fast = fast.next.next;
                if (slow == fast){
                    return true;
                }
            }
            return false;
        }
    }
}
class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        if head == None:
            return False
        else:
            slow = head
            fast = head
            while(fast != None and fast.next != None):
                slow = slow.next
                fast = fast.next.next
                if slow == fast:
                    return True
            return False

在这里插入图片描述

class Solution {
    public int numRescueBoats(int[] people, int limit) {
        Arrays.sort(people);
        int low = 0,high = people.length-1,count = 0;
        while(low<=high){
            if(people[low]+people[high]>limit){
                count += 1;
                high -= 1;
            }
            else{
                count += 1;
                low += 1;
                high -= 1;
            }
        }
        return count;
    }
}
class Solution:
    def numRescueBoats(self, people: List[int], limit: int) -> int:
        people.sort()
        low = 0
        high = len(people)-1
        count = 0
        while(low<=high):
            if people[low]+people[high]>limit:
                count += 1
                high -= 1
            else:
                low += 1
                high -= 1
                count += 1
        return count

二、 二分查找法

  1. 特点:一定要有序(数组元素单调增或单调减)

  2. 例题
    在这里插入图片描述

class Solution {
    public int search(int[] nums, int target) {
        int low = 0,high = nums.length-1,mod;
        while(low<=high){
            mod = (low+high)/2;
            if(nums[mod]== target) {
                return mod;
            }
            else if(nums[mod]>target){
                high = mod - 1;
            }
            else {
                low = mod + 1;
            }
        }
        return -1;
    }
}
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        low = 0
        high = len(nums)-1
        while(low<=high):
            mod = (low+high)//2
            if nums[mod] == target:
                return mod
            elif nums[mod]>target:
                high = mod-1
            else:
                low = mod+1
        return -1

在这里插入图片描述

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if(matrix == null || matrix.length == 0){
            return false;
        }
        else{
            int row = matrix.length;
            int col = matrix[0].length;
            int l = 0;
            int r = row*col-1;
            while(l<=r){
                int m = l+(r-l)/2;
                int element = matrix[m/col][m%col];
                if(element == target){
                    return true;
                }
                else if(element>target){
                    r = m-1;
                }
                else{
                    l = m+1;
                }
            }
            return false;
        }       
    }
}
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        if matrix == None or len(matrix) == 0:
            return False
        else:
            row = len(matrix)
            col = len(matrix[0])
            l = 0
            r = row*col-1
            while(l<=r):
                m = l + (r-l)//2
                element = matrix[m//col][m%col]
                if element == target:
                    return True
                elif element > target:
                    r = m-1
                else:
                    l = m+1
            return False

三、滑动窗口

  1. 目的:减少while循环

  2. 应用:数组中的定长问题

  3. 例题:
    在这里插入图片描述

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int res = nums.length+1;
        int i = 0,j = 0,total = 0;
        while(j<nums.length){
            total += nums[j];
            while(total>=target){
                res = Math.min(res, j - i + 1);
                total -= nums[i];
                i += 1;
            }
            j++;
        }
        if (res == nums.length+1){
            return 0;
        }
        else{
            return res;
        }
    }
}
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        res = len(nums)+1
        count = 0
        i = 0
        j = 0
        while(j<len(nums)):
            count = count+nums[j]
            while(count>=target):
                res = min(res,j-i+1)
                count = count - nums[i]
                i = i+1
            j+=1
        if res == len(nums)+1:
            return 0
        else:
            return res

在这里插入图片描述

class Solution {
    public int maxVowels(String s, int k) {
        int i,count = 0,res = 0;
        char[] ch = s.toCharArray();
        String str = "aeiou";        
        for (i = 0;i<k;i++){
            if (str.indexOf(ch[i])!=-1){
                count+=1;
            }
                }
        res = Math.max(res,count);
        for (i = k;i<s.length();i++){
            if (str.indexOf(ch[i-k])!=-1){
                count -= 1;
            }
            if (str.indexOf(ch[i])!=-1){
                count += 1 ;
            }
            res = Math.max(res,count);
        }
        return res;
    }
}
class Solution:
    def maxVowels(self, s: str, k: int) -> int:
        i = 0
        count = 0
        res = 0
        for i in range(k):
            if s[i] in "aeiou":
                count+=1
        res = max(res,count)
        for i in range(k,len(s)):
            if s[i-k] in "aeiou":
                count -= 1
            if s[i] in "aeiou":
                count += 1 
            res = max(res,count)
        return res

四、递归

  1. 定义:函数直接或者间接调用自己

  2. 四个要素:

  • 接受的参数
  • 返回值
  • 终止条件
  • 递归拆解:如何递归下一层
recursion(int n):	#参数
	if n == 0:		#终止条件
		return 0	
	m = recursion(n-1)	#拆解
	return m		#返回的值
  1. 例题
    在这里插入图片描述
class Solution {
    public int fib(int n) {
        if(n<2){
            return n;
        }
        else{
            return fib(n-1)+fib(n-2);
        }
    }
}
class Solution:
    def fib(self, n: int) -> int:
        if n<2:
            return n
        else:
            sum = self.fib(n-1)+self.fib(n-2)
            return sum

在这里插入图片描述

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        while(head != null && head.next != null){
            ListNode dnext = dummy.next;
            ListNode hnext = head.next;
            dummy.next = head.next;
            head.next = hnext.next;
            hnext.next = dnext;
        }
        return dummy.next; 
    }
}
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        dummy = ListNode(0)
        dummy.next = head
        while(head != None and head.next!= None):
            dnext = dummy.next
            hnext = head.next
            dummy.next = hnext
            head.next = hnext.next
            hnext.next = dnext
        return dummy.next

五、分治法

大问题切割成一个个小问题,最后再合并。
用到了递归,自己调用自己。

在这里插入图片描述

class Solution:
    def getNajority(nums,left,right):
        if left == right:
            return nums[left]
        else:
            mid = left+(right-left)//2
            leftNajority = getNajority(nums,left,right)
            rightNajority = getNajority(nums,mid+1,right)
            if leftNajority == rightNajority:
                return leftNajority
            else:
                leftcount = 0
                rightcount = 0
                for i in nums[left,right]:
                    if i == leftNajority:
                        leftcount+=1
                    elif i == rightNajority:
                        rightcount+=1
                if leftcount > rightcount:
                    return leftNajority
                else:
                    return rightNajority
    def majorityElement(self, nums: List[int]) -> int:
        return getNajority(nums,0,len(nums)-1)

六、回溯法

类似枚举,一层一层向下递归,尝试搜索答案。

  • 找到答案后,尝试别的可能或返回答案。
  • 找不到答案,则返回上一层递归,尝试别的路径。

七、深度优先搜索算法 (DFS)

  1. 用到了递归的思想。
  2. DFS:从root节点开始,尽可能深的搜索每一个分支。(把一个分支的结果搜索完,再去看下一个分支)
  3. 主要应用:
  • 二叉树搜索
  • 图搜索
  1. 例:走迷宫
  2. DFS和回溯算法的区别:回溯算法 = DFS + 剪枝

八、广度优先搜索算法(BFS)

  1. 主要思想:层层递进,一层一层遍历
  2. 主要应用:
  • 二叉树搜索
  • 图搜索
  1. DFS与BFS的区别:
    侧重点不同:
  • DFS:分支
  • BFS:层

九、并查集(Union Find)

  1. Union:合并两个元素为同一个根节点
  2. Find:找到某个元素的根节点

十、贪心算法(Greedy)

  1. 核心:
  • 每一步做出的都是当前看起来最好的选择
  • 只是局部的最优选择
  • 而不是整体的最优选择
  1. 例:零钱兑换 最少硬币的情况,应当尽可能取大的硬币

十一、算法记忆化(Memoization)

  1. 目的:减少重复计算

十二、动态规划

  • 题型千变万化
  • 思想千变万化

动态规划三要素:

  • 初始状态(可能是一个数,也可能是多个数)
  • 方程式(状态转移函数)
  • 终止状态
    应用:
  1. 计数:有多少种方式/方法
    例:机器人从左上角到右下角有多少个路径
  2. 求最值:最大值/最小值
    例:机器人从左->右路径的最大数字和
  3. 求存在性:是否存在某个可能
    例:是否存在机器人从左->右的路径

在这里插入图片描述

class Solution {
    public int fib(int n) {
        if(n<2){
            return n;
        }
        else{
            int dp[] = new int[n+1];
            dp[0] = 0;
            dp[1] = 1;
            for(int i=2;i<n+1;i++){
                dp[i] = dp[i-1] + dp[i-2];
            }
            return dp[n];
        }
    }
}

在这里插入图片描述

class Solution {
    public int uniquePaths(int m, int n) {
        int [][] dp =new int[m][n];
        dp[0][0] = 1;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(i-1>=0 && i-1<m){
                    dp[i][j] = dp[i][j]+dp[i-1][j];
                }
                if(j-1>=0 && j-1<n){
                    dp[i][j] = dp[i][j]+dp[i][j-1];
                }
            }
        }
        return dp[m-1][n-1];
    }
}
Apriori算法学习笔记(二) Apriori算法学习笔记(二)1. 基于置信度的剪枝将频繁项集Y划分成两个非空子集X和Y-X,使得X->Y-X满足置信度阈值。此时项集X和项集Y-X已经满足支持度阈值,因为它们是Y的子集且Y为频繁项集。 与频繁项集的产生相似,规则的产生也有两个重要的定理: 1. 如果规则X->Y-X不满足置信度阈值,若X’是X的子集,则X’->Y-X’的规则也不满足置信度阈值。 2. 如果规则X->Y- 阅读详情

相关推荐

分离与合体题解(区间DP)

题目: 经过在机房里数日的切磁,LYD从社神牛那里学会了分离与合体,出关前,杜神牛给了他一个测试 杜神牛造了个区域,它们紧邻着排成了一行,编号1-n。在这經个区域里都放着一把OI界 的金钥匙,每一把都有一定的价值,LYD当然想得到它们了。然而杜神牛规定LYD不可以一下子 把它们全部拿走,而是每次只可以拿一把。为了尽快地拿到所有的金钥匙,LYD自然就用上了刚学的分离与合体特技。 开始LYD可以选择从1~n-11~n-11~n-1的任何一个区域(记为K)进入,进入后LYD会在K区域发 生分离,从而分离为两个小L

cqbz_lipengcheng的博客 370

CGAL的2D Nef多边形布尔操作

当处理多边形和多面体集合时,数学模型确定了可以表示的点集类型。Nef多面体是最通用的直线多面体模型。包含在Nef多面体域内的更简单的拓扑模型包括:凸多面体,通常定义为非空有限点集的凸包,凸多面体是紧闭流形集。基本多面体,通常定义为有限个凸多面体的并集。多面体集,通常定义为有限个闭半空间的交集。这样的集合是封闭和凸的,但不一定是紧的。线性多面体,通常定义为简单复形的单纯形的所有点的集合。平面Nef多面体是可以通过使用集合补和交集操作从有限个开半空间的集合中获得的集合。

weixin_44897632的博客 1576

蓝牙抓包实战:用nrf52840和Wireshark解析广播包与SCAN_RSP的完整流程

本文提供了一份完整的蓝牙抓包实战指南,详细介绍了如何使用nRF52840 Dongle和Wireshark捕获并解析蓝牙广播包与SCAN_RSP。内容涵盖环境搭建、广播事件分析、数据包结构拆解以及常见连接问题的调试技巧,旨在帮助开发者和物联网工程师深入理解BLE底层通信,提升硬件调试能力。

weixin_29279153的博客 495

【论文阅读】NEF:用于从多视图重建 3D 参数曲线的神经边缘场

NEF: Neural Edge Fields for 3D Parametric Curve Reconstruction from Multi-view Images 全文翻译

WoooChi的博客 1114

STM32H743IIT6+USB3300高速HID通讯实战:从CUBEMX配置到调试避坑全记录

本文详细记录了基于STM32H743IIT6微控制器与USB3300 PHY芯片实现高速USB HID通信的完整实战过程。内容涵盖从硬件选型、STM32CubeMX工程配置(重点规避引脚映射等常见陷阱)、自定义报告描述符编写,到驱动层数据收发实现与高级调试技巧的全链路解析,旨在帮助开发者快速构建稳定、高效的嵌入式高速数据通道。

vscode5coder的博客 364

微机原理课程设计-模拟十字路口交通信号灯

一、设计任务描述 1.1设计目的 通过课程设计使学生更进一步掌握微机原理及应用课程的有关知识,提高应用微机解决问题的能力,加深对微机应用的理解。通过查阅资料,结合所学知识进行软、硬件的设计,使学生初步掌握应用微机解决问题的步骤及方法。为以后学生结合专业从事微机应用设计奠定基础。 1.2 设计要求 控制LED灯,按照十字路口红绿灯的原理亮灭显示: (1) 东西方向车辆放行x秒...

Learning_is_endless的博客 2万+

8种ETL算法模型汇总大全!看完你就全明白了

摘要:ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程,是构建数据仓库的重要一环,用户从数据源抽取出所需的数据,经过数据清洗,最终按照预先定义好的数据仓库模型,将数据加...

大数据星球-浪尖 3508

【项目解析】2KW 230V 数字逆变器控制系统(二)

【项目解析】 2KW 230V 数字逆变器控制系统(一) 项目的 交流输出电压 并不是单纯一个电压环就能控制好的,而是典型的 双环控制架构:最终占空比控制量会经过计算: 然后写入 单片机 TMM 定时器的比较寄存器 (TMGRA0/TMGRD0/TMGRC1), → 定时器输出互补 PWM, → 驱动 IGBT 全桥, → 经过 LC 滤波形成 230 VAC / 50Hz 的正弦电压。总结交流电压是双环控制的结果:目标/作用:把输出 RMS 电压稳到目标(例如 230 VAC);在母线波动与负载变化下

Naiva的博客 1297

7种基于比较的排序算法

从小到大排序 package sort; import java.util.Stack; import java.util.concurrent.ForkJoinPool; public class SortDemo { private void swap(int[] array, int x, int y) { int temp = array[x]; array[x] = array[y]; array[y] = temp; }

nefss_的博客 690

【YOLOv11多模态涨点改进】独家创新首发| TGRS 2026 |引入 CIFusion 通道交互融合模块,通过跨特征交互机制强化目标区域响应,适合多模态融合目标检测,小目标检测高效涨点

🔥本文提出了一种改进YOLOv11多模态目标检测模型的方法,通过引入CIFusion通道交互融合模块来提升RGB与红外特征融合效果。CIF模块采用通道级自适应交互机制,根据全局上下文动态分配不同模态通道的重要性,实现跨模态特征交互与互补信息融合。相比传统拼接或加权融合方式,CIF能够增强目标区域响应,抑制背景噪声,提高小目标和低对比度目标的检测性能。实验表明,该方法在DroneVehicle等数据集上显著提升了检测精度。论文还详细介绍了CIF模块的结构原理、实现代码及模型配置方法。

Ai缝合怪、助力小伙伴高效发论文 186

YOLOv8【第十章:多任务扩展深度篇·第19节】YOLOv8 与 DeepLabV3+ 对比——实时性与精度的权衡!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 1万+

算法集

.NET算法集 1.   选择排序usingSystem;  usingSystem.Collections.Generic;  usingSystem.Linq;  usingSystem.Text;    namespacesorter  {      public class SelectionSorter      {          private int min;          ...

史凯凯的编程技术博客 479

STM32(HAL库)驱动OLED

通过STM32F103C8T6单片机采用HAL库方式对0.96寸OLED(IIC通讯)屏幕进行驱动。

weixin_44597885的博客 8800

【学习】《算法图解》学习笔记总览

算法的效率通常用大O表示法来衡量。算法时间复杂度空间复杂度适用场景二分查找O(log n)O(1)有序数组中查找元素选择排序O(n²)O(1)小型数据集排序快速排序平均O(n log n),最坏O(n²)O(log n)通用排序场景广度优先搜索O(V+E)O(V)最短路径问题,V为顶点数,E为边数迪杰斯特拉算法O(V)带权图的最短路径贪心算法视具体问题而定视具体问题而定局部最优可导致全局最优的问题动态规划视具体问题而定视具体问题而定。

一个普通程序员的成长记录簿 1341

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

常见算法的学习笔记

常见查找算法、排序算法的学习笔记,用Java语言描述。

x18395499277的博客 2328

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

贪心算法学习笔记

贪心算法学习笔记

QT-Smile 243

算法学习笔记

算法学习总结 主要内容 本文档涵盖了多个算法和数据结构领域的内容,主要包括以下几个部分: 排序算法:快速排序和归并排序的实现 图论算法:Prim最小生成树、Kruskal算法、拓扑排序、DFS/BFS遍历、最短路径算法(Dijkstra、SPFA、Floyd、Johnson) 数据结构:并查集、线段树、树状数组、单调队列、哈夫曼树等 动态规划:线性DP(最长上升子序列、编辑距离等)、背包问题、数位DP、状压DP 基础算法:高精度运算、二分查找、前缀和、差分、ST表、贪心算法 字符串算法:最小表示法、字符串哈

zaijiancongqiand的博客 1688

算法学习笔记汇总

讲道理我真的没有写过什么学习笔记… 虚树

Averyta的博客 221

学习笔记———《EM算法》

PS:本人在学习EM算法时,是通过斯坦福大学的公开课讲EM算法的视频学习的,也对应看了别人整理的笔记http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html,个人觉得有些地方说的不是很清楚,特整理此笔记供大家参考。

MJ 839

算法基础之离散化学习笔记

算法基础之离散化学习笔记,暂时无内容,稍后补上

技术宅拯救世界 390

【算法竞赛学习笔记】基础算法篇:枚举

用方括号。

YZYZYYNO_2的博客 1016

算法学习笔记 之回溯算法

回溯算法解N皇后问题

诗酒年华 1322

莫队算法学习笔记

2025-04-28莫队算法是一种处理区间询问的离线算法, 通过分块可以达到nn​的时间复杂度。最基础的莫队算法是, 把长度为n的区间, 分成大小为n​的块, 然后把询问的lr先按照l所在的块的位置排序, 再按r的大小排序。我们定义LR用来记录当前维护的答案的区间, 只需要根据当前需要查询的区间动态地去移动L和R。所以要使用莫队,需要保证能从lr的贡献推出lr1的贡献。莫队也算是一种暴力的算法, 但是时间复杂度却可以做到 $n \sqrt{n} $。

fwdzh的博客 903

《300分钟搞定算法面试》学习笔记

之所以不在优快云直接发,怕说广告直接封了,但是分享还是要说明出处的,感觉老师讲的很好 《300分钟搞定算法面试》学习笔记(一) ------ 常用数据结构 《300分钟搞定算法面试》学习笔记(二) ------ 高级数据结构 ...

千喜 3247
上一篇: 数据结构9 图(Graph)
下一篇: 学习笔记 数据结构与算法
Neflibata_mo
博客等级 码龄6年 6粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值