算法
文章平均质量分 79
迪崽~
I do what I love.
展开
-
字符串匹配算法和应用
KMP算法KMP: KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。1、常规匹配和kmp匹配常规匹配: 从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位。kmp匹配: 既然不匹配位原创 2021-08-02 19:55:37 · 1051 阅读 · 0 评论 -
堆栈相关应用算法
栈的压入、弹出序列题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)算法思想: 将第一个序列数据先压栈,如果最上面的数据与第二个需要弹出的数据相同,进行判断下一个栈顶数据是否为需要弹出的数据,如果是继续进行这样的判断,如果不是就跳出循环将第一个序原创 2021-06-27 16:32:35 · 622 阅读 · 0 评论 -
最大的子矩阵问题
1、全为1的最大的子矩阵在一个二维0 1矩阵中找到全为1的最大正方形,返回其边长。输入:1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0输出:2思路:动态规划,构造一个等大小的dp[n][m]矩阵,dp[i][j]表示以matrix[i][j]为右下角的全1正方形的边长。初始化dp[i][0]和dp[0][j]分别为matrix[i][0]和matrix[0][j],因为以边缘这一行一列中的点为右下角的全1正方形边长只有0和1两种情况,分别由他们本身是0还是1原创 2021-06-18 10:13:18 · 1150 阅读 · 1 评论 -
大数相加和大数相乘
1、大数相加int或者long类型的数据往往满足不了数据容量的要求,这时需要用到数组或者字符串进行操作。考虑到数据的位数并不是一个确定的值,运用string来处理可以简化思维。在进行运算之前,需要明确下面几点要求:1.将两组数据中位数大的放在前面,方便后面处理;2.字符转数字,减去‘0’;数字转字符加上‘0’;3.进位考虑4.最高位时进位判断string BigPlus(string num1,string num2){ //默认使得num1位数大于num2,方便后续运算。 if原创 2021-06-17 12:21:46 · 396 阅读 · 1 评论 -
链表交换、排序、相加
链表交换和排序1、给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。示例: 给定 1->2->3->4, 你应该返回 2->1->4->3.说明:你的算法只能使用常数的额外空间。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 1 class Solution { 2 public: 3 ListNode* swapPairs(ListNode* head) { 4 ListNode *dummy = n原创 2021-06-16 10:20:35 · 998 阅读 · 0 评论 -
随机函数rand 抽样问题
一、工行有30万个员工,其工卡号码分别是1~30万,在接下来的某天他们将举行年会,需要抽出10万个员工发奖品。我们有一个随机数生成函数rand()能够生成0~65535的整数,请写一个公平的抽奖程序,输出这10万个员工的工卡号码。注:直接在这里写代码,要求使用C++实现完整的代码...原创 2020-09-18 16:04:58 · 2140 阅读 · 0 评论 -
回型矩阵的打印问题
一、输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例: 如果输入如下矩阵,则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.分析: 把矩阵看成由若干个顺时针方向的圈组成,循环打印矩阵中的每个圈,每次循环打印一个圈。打印一圈通常分为四步,第一步从左到右打印一行;第二步从上到下打印一列;第三步从右到左打印一行;第四步从下到上打印一列。设置四个变量left,right,top,btm,用于表示圈的方位,每一步根据起始坐标和终止坐标循环打印。注意:最原创 2020-09-18 15:13:56 · 780 阅读 · 0 评论 -
数组变换问题
1、数组切分问题题目: 输入一个正序排列的整型数组,如果它可以被切分为1个或多个子序列,输出True,反之False。子序列需为连续的整型数组,并且长度至少为3。示例:例1:输入: [1,2,3,3,4,5]输出:True解释:可以切分为2个各自连续的子序列:1, 2, 33, 4, 5例2:输入: [1,2,3,3,4,4,5,5]输出:True解释:可以切分为2个各自连续的子序列:1, 2, 3, 4, 53, 4, 5例3:输入: [1,2,3,4,4,5]输出:Fa原创 2020-08-20 20:03:50 · 1479 阅读 · 0 评论 -
两两配对问题
1、两两配对差值最小题目描述:给定一个长度为偶数的数组arr,将该数组中的数字两两配对并求和,在这些和中选出最大和最小值,请问该如何两两配对,才能让最大值和最小值的差值最小?分析: 主要是利用了c++里面对数组的一个排序函数sort(数组名,数组名 + 数组长度)。使用这个函数需要导入#include求两两配对差值最小,其实就是把输入的数字排排序之后,从中间两位开始求和,再从中间向外面拓展一次求和,然后把求和的结果存到一个数组,再对这个数组排序,求最大最小值之差就可。int find(vector&l原创 2020-08-20 19:45:00 · 3045 阅读 · 1 评论 -
水王问题
求论坛的最大水王题目: 论坛有一水王,发帖量超过总帖子数的一半。。。如何快速的寻找水王的ID?分析: 与寻找一个数组中出现次数超过总的个数一半的元素类似。依次遍历数组,每次删除一对元素,这对元素值不同。那么剩下的部分水王的地位不变。不断缩小问题,最终剩下很小的一部分,可以找到水王。int FindKing(int* ID,int n){ int candidate; int nTime,i; nTime = 0; for(int i=0;i<n;i++) { if(nTime =原创 2020-08-20 18:51:24 · 245 阅读 · 0 评论 -
线程安全的队列实现(CAS与锁)
数组实现线程安全的循环队列cas函数如下:bool succ = __sync_bool_compare_and_swap(&a, b, c) //---》 if(a ==b ) {a = c;return true;}else{return false}struct queue{ int data[10000]; int front; int back;};int maxSize=10000;queue* q;int push(int d){ if ((q->bac原创 2020-08-20 16:43:25 · 1141 阅读 · 2 评论 -
三角形相关算法
1、数组中能组成三角形的数目int triangleCount(vector<int> &S) { // write your code here int iSize = S.size(); if (iSize <= 2) { return 0; } int sum = 0原创 2020-08-20 14:41:55 · 1344 阅读 · 0 评论 -
数组或链表的交集
两个数组的交集题目: 给定两个数组,编写一个函数来计算它们的交集。**说明:**输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。示例1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出: [2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [9,4]解题思路:交集即两集合共有的元素的集合。所以首先要保证集合的唯一性,所以选择std::map容器导入元素,进行去重。然后随意遍历其中一个集合中原创 2020-08-14 17:19:27 · 236 阅读 · 0 评论 -
shared_ptr的手写实现
template <typename T>class SmartPointer {public: //构造函数 SmartPointer(T* p=0): _ptr(p), _reference_count(new size_t){ if(p) *_reference_count = 1; else *_reference_count = 0; } //拷贝构造函数 Sm.原创 2020-08-13 19:48:02 · 320 阅读 · 0 评论 -
洗牌算法
洗牌算法 I题目:有一个大小为100的数组,里面的元素是从 1 到 100,随机从数组中选择50个不重复数。分析: 用 Math.random() * 100 ,就可以拿到一个 0 到 99 的随机数,是不是重复50次就可以了?当然不是,假如,第一次随机到5,第二次如果再一次随机到5的话,要求是选择不重复的数,所以要选出50个不重复的数的话,随机次数远远大于50,因为越到后面随机到的数与前面选出的数重复的概率越大。解答: 第一次随机到一个数后,将这个数取出来,再从剩下的99个数字里随机取出第二个数,这原创 2020-08-10 23:39:03 · 416 阅读 · 0 评论 -
内存拷贝函数的实现
内存拷贝函数的实现1、实现memcpy,void *Memcpy(void *dst, const void *src, size_t len),需要考虑内存重叠的情况。注意:实际C库中的memcpy是不考虑内存重叠这个问题的,也就是说使用memcpy时,dst和src的地址空间最好不要重叠。如果要考虑内存重叠,可以采用逆序拷贝即可(从尾到头复制数据)。/** * @Method: Memcpy * @Access: public * @Return: void * * @Param : ds原创 2020-08-05 11:41:52 · 1551 阅读 · 0 评论 -
二叉树相关算法
二叉树类算法一、二叉树的路径和:二叉树的每个节点为0-9的一个数字,根到叶子的一条路径拼成一个数,求所有路径形成的数字和struct TreeNode{ TreeNode* left; TreeNode* right; int value;}; int dfs(TreeNode* root, int sum){ if (root == nullptr) { return 0; } if (root->left ==原创 2020-08-04 11:20:57 · 1308 阅读 · 0 评论 -
海量数据的常见处理算法
海量数据的处理算法海量数据处理,就是基于海量数据上的存储、处理、操作。海量就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是无法一次性装入内存。解决办法:(1)针对时间,可以采用巧妙的算法搭配合适的数据结构,如Hash/bitmap/堆/倒排索引/trie树;(2)针对空间,大而化小:分而治之/hash映射,把规模大化为规模小的,各个击破。一、海量数据中的最值问题: 1、海量日志数据,提取出某日访问百度次数最多的那个IP。思路:分而治之/hash映射 + hash统计 + 堆原创 2020-07-27 22:26:01 · 3917 阅读 · 0 评论 -
常见排序算法
插入排序void StraightSort(int *arr,int len){ int tmp; int i; int j; for (i = 1;i < len;i++) { tmp = arr[i]; for (j = i - 1;j >= 0 && arr[j] > tmp;j--) { arr[j + 1] = arr[j]; } arr[j + 1] = tmp; }堆排序// 递归方式构建大根堆(len是arr的原创 2020-07-26 16:19:05 · 176 阅读 · 0 评论 -
算法之hashMap、LRU、bitMap、生产者消费者
hashMap//KVMap,首先,HashMap存储的是键值对,所以需要一个键值对类型。//链表结构里数据的数据类型 键值对type KV struct { Key string Value string}//LinkNode,键值对又是主要存储在链表里的,所以需要一个链表类。//链表结构type LinkNode struct { //节点数据 Data KV //下一个节点 NextNode *LinkNode}//创建只有头结点的原创 2020-07-22 18:53:53 · 576 阅读 · 0 评论 -
编辑距离算法(Minimum Edit Distance,MED)
算法简介Levenshtein Distance算法算法示例原创 2020-03-09 13:04:48 · 776 阅读 · 0 评论 -
LeetCode - 二维网格(数组)路径类题目
不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径? 例如,上图是一个7 x 3 的网格。有多少可能的路径?说明:m 和 n 的值均不超过 100。示例 : 输入: m = 3, n = 2; 输出: 3解释: 从左上角...原创 2020-03-02 17:47:12 · 1510 阅读 · 0 评论 -
LeetCode -数组数据的插入位置(二分法)
搜索数组数据插入位置给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。数组可能有重复数据,有重复数据时返回,插入到重复数据的第一个位置。示例 1: 输入: [1,3,6,7], 5, 输出: 2示例 1: 输入: [1,3,3,3,5,6], 3, 输出: 1分析:改进的二分法class Solution {pub...原创 2020-02-20 10:25:03 · 577 阅读 · 0 评论 -
LeetCode - 区间合并类问题
合并区间给出一个区间的集合,请合并所有重叠的区间。示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]], 输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].分析: C++,排序;根据区间左边界排序;如果当前区间的右边界大于等于下一个区间的左边界,则合并;。o(n)的时间复杂度。class...原创 2020-02-20 09:58:13 · 239 阅读 · 0 评论 -
LeetCode - 跳跃数组
跳跃游戏II给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。示例 : 输入: [2,3,1,1,4],输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。分析: 贪心跳跃class Solu...原创 2020-02-19 19:48:39 · 538 阅读 · 0 评论 -
LeetCode - 并查集类题目总结
情侣牵手原创 2020-02-13 23:01:45 · 654 阅读 · 0 评论 -
LeetCode - 缺失数字的数组查找总结(位置交换法)
缺失的第一个正数给定一个未排序的整数数组,找出其中没有出现的最小的正整数。说明: 你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。示例 1: 输入: [1,2,0], 输出: 3示例 2: 输入: [3,4,-1,1], 输出: 2示例 3: 输入: [7,8,9,11,12], 输出: 1分析: 我们使用一种 “座位交换法" 来达到in-place 的目的:从第一个位置开...原创 2020-02-11 22:57:27 · 1246 阅读 · 1 评论 -
LeetCode - 旋转数组类总结(二分法)
搜索旋转排序数组假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1: 输入: nums = [4,5,6,7,0,1,2],...原创 2020-02-09 21:35:04 · 346 阅读 · 0 评论 -
LeetCode - 子串匹配类总结(滑动窗口解法)
串联所有单词的子串给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。示例 1:输入:s = “barfoothefoobarman”,words = [“foo”,“bar”]输出:[0,9]解释:从索...原创 2020-02-08 16:35:33 · 880 阅读 · 0 评论 -
LeetCode - 有序多链表(数组)问题类总结
合并两个有序链表将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。不要新建节点,减少内存占用。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4/** * Definition for singly-linked list. * struct ListNo...原创 2020-02-04 23:49:12 · 211 阅读 · 0 评论 -
递归与迭代
迭代迭代:迭代简单来讲就是循环:类比于我们循环输出某一个字符数组时的情景:从字符数组中不断取出字符,再将字符输出。迭代的循环过程则是从栈(或者队列)中不断取出要操作的元素,进行操作,与普通循环过程不同的是在不断取出元素的同时也会向栈中放入元素,从而实现迭代过程。因而迭代的要点有:迭代的初始条件,迭代过程中迭代元素生成,迭代结束条件判断。迭代示例:斐波那契数列//迭代,时间复杂度O(n),...原创 2020-02-04 21:30:04 · 245 阅读 · 0 评论 -
LeetCode - 数独类题目总结
什么是数独 数独是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复 [1] 。数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一...原创 2020-02-04 17:35:12 · 763 阅读 · 0 评论 -
LeetCode - 排列组合类题目总结
电话号码的字母组合原创 2020-02-02 11:25:02 · 447 阅读 · 0 评论 -
LeetCode - 括号问题类总结
有效的括号给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例:"()[]{}" 与 "{[()]}"为有效的括号。分析:从左往右,连续的左括号(包括不连续)的最后一个左括号,应与最接近的其右边的右括号匹配。初始化栈 S。一...原创 2020-01-28 22:17:44 · 826 阅读 · 0 评论 -
LeetCode-N数之和类问题总结(双指针法)
两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9。因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]。分析:双指针法。...原创 2020-01-28 19:59:47 · 584 阅读 · 0 评论 -
LeetCode-整数与字符的转换问题
整数转罗马数字给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。示例 :输入: 3,输出: “III”。字符 数值:I 1,V 5,X 10,L 50,C 100,D 500,M 100...原创 2020-01-27 14:44:57 · 260 阅读 · 0 评论 -
LeetCode-盛水容器问题(双指针解法)
盛最多水的容器给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水...原创 2020-01-26 20:52:02 · 784 阅读 · 0 评论 -
leetcode-正则表达式和通配符匹配的dp解法
迭代和递归迭代:迭代简单来讲就是循环:类比于我们循环输出某一个字符数组时的情景:从字符数组中不断取出字符,再将字符输出。迭代的循环过程则是从栈(或者队列)中不断取出要操作的元素,进行操作,与普通循环过程不同的是在不断取出元素的同时也会向栈中放入元素,从而实现迭代过程。因而迭代的要点有:迭代的初始条件,迭代过程中迭代元素生成,迭代结束条件判断。递归:递归简单来讲就是函数的自身调用:要实...原创 2020-01-24 17:17:04 · 215 阅读 · 0 评论 -
LeetCode - 链表快慢指针类总结
链表快慢指针 快慢指针中的快慢指的是指针沿链表移动的步长,即每次向前移动速度的快慢。快指针每次沿链表向前移动两步fast=fast->next->next,慢指针每次向前移动一步slow=slow->next。一、回文链表请判断一个链表是否为回文链表。用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题。示例 1:输入: 1->2 ;输出: false...原创 2020-01-21 21:38:03 · 488 阅读 · 0 评论 -
LeetCode - 回文类问题总结
11原创 2020-01-16 10:18:34 · 307 阅读 · 0 评论