
数据结构与算法
文章平均质量分 79
Serena0814
这个作者很懒,什么都没留下…
展开
-
位运算之实现加减乘除
由于不是科班出生,对位运算一直产生抗拒心理,今天接触到相关算法题:用位运算实现加减乘除,在此记录下来。位运算实现加法大致分三步:先求两数不带进位的加法:a和b异或的值再求两数进位的值:a和b与的结果左移一位将1,2相加(这里的加法又是以上的2步完成,直到没有进位)贴代码: public static int add(int a,int b){ int sum = ...原创 2019-04-27 18:07:50 · 608 阅读 · 0 评论 -
KMP算法
本小白今天学习了KMP算法(太疲劳了,尽管脑壳疼也要把今天的学习任务记录下来应付秋招~ ),KMP算法名字的由来据说是三个人名,解决的是在字符串str1中匹配str2的问题。如果str1的某一子串为str2,则返回str2字符串的第一个字符在str1中角标,否则返回-1。暴力解这个问题简单粗暴的解法的就是从str1的第一个字符开始比对str2,若出现不符合的情况,则由str1下一个字符开始重新...原创 2019-05-03 21:42:24 · 214 阅读 · 0 评论 -
Manacher算法
马拉车算法主要解决的是找到一个字符串中最长的回文子串。暴力解暴力解的思路是遍历字符串str中的每一个字符str[i],从str[i]开始往两边扩,记录下每个以str[i]为中心的回文长度。这种方式的时间复杂度为O(n*n)。即使是以这种方法,奇回文还能求解,偶回文便不能直接扩,否则会出错。例如“abba”,以str[0]为中心的回文长度为1,以str[1]为中心的回文长度为1,以str[2]...原创 2019-05-04 11:37:41 · 136 阅读 · 0 评论 -
窗口及窗口最小/大值的更新结构(单调双向队列)
窗口窗口的数据结构使用的是单调双向队列。滑动时,加数只能从窗口右端(尾部)加,滑出数时数只能从左边(头部)滑出。注意:队列中存的是数组的下标。以求最大值为例,流程为:窗口进数时有两种情况:新加的数比队列中最后一个数小,则直接在尾部加入队列;新加的数比队列中最后一个数大或等于,则从尾部弹出旧数直到队列尾部的数严格大于新加入的数,再把新数加入队列尾部。注意:队列中的值要严格递减,若碰到...原创 2019-05-04 16:20:21 · 257 阅读 · 0 评论 -
单调栈
应用:求数组中每个数左边离它最近的比它大的和右边离她最近的比它大的数。暴力解:每个位置两边遍历,时间复杂度O(n^2)。单调栈:时间复杂度O(n)。...原创 2019-05-05 17:37:30 · 189 阅读 · 0 评论 -
Morris遍历
Morris遍历程序流程:假设指针cur指向当前节点,cur从头结点开始。如果cur无左孩子,则cur = cur.right;如果cur右左孩子,则找到cur左子树上最右的节点,记为mostRight,分为以下两种情况:若mostRight的right指针为null,则让其指向cur,且cur = cur.left;若mostRight的right指针指向cur,则让其指回nu...原创 2019-05-05 22:03:01 · 647 阅读 · 0 评论 -
哈夫曼编码
参考原博客:https://www.cnblogs.com/wuyuankun/p/3982216.html哈夫曼编码步骤:一、对给定的n个权值{W1,W2,W3,…,Wi,…,Wn}构成n棵二叉树的初始集合F= {T1,T2,T3,…,Ti,…,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。(为方便在计算机上实现算 法,一般还要求以Ti的权值Wi的升序排列。)...转载 2019-05-27 12:45:51 · 488 阅读 · 0 评论 -
约瑟夫环
约瑟夫问题约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。例如只有三个人,把他们叫做A、B、C,他们围成一圈,从A开始报数,假设报2的人被杀掉。首先A开始报数,他报1。侥幸逃过一劫。然后轮到B报数,他报2。非常惨,他被杀了C接着从1开始报数接着轮到A报数,他报2。也被杀死了。最终胜利者是...原创 2019-07-21 10:56:23 · 268 阅读 · 0 评论