最长回文子串

对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个相同的字母去除之后,它仍然是个回文串。所以状态转移方程为dp[i][j] = (dp[i+1][j-1]) && chars[i]==chars[j];同时对于j-1>=i+1 所以 j-i+1(数组长度)>=3,l=j-1>=2 ... »

快速排序

挖坑填数方 从数列中挑出一个元素,称为 "基准"(pivot); 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作; 递归地(recursive)把小于 ... »

《统计学习方法》——朴素贝叶斯代码实现

朴素贝叶斯分类原理 对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入$x$,利用贝叶斯定理求出后验概率最大的输出$y$。 特征独立性假设:在利用贝叶斯定理进行预测时,我们需要求解条件概率$P(x|y_k)=P(x_1,x_2,...,x_n|y ... »

Nginx(八): 观进程锁的实现

前面的nginx系列讲解了nginx很多通用概念,流程,以及核心的http模块的一些实现。应该说大体上对nginx已经不再陌生和神秘。 今天我们不看全局,只看一个非常非常小的细节:nginx是多进程并发模型的应用,但为了网络请求的安全性,必须要使用到锁,那么这个进程锁如何实现呢? 1. nginx进 ... »

【算法】分支界限法

前面我们介绍了一下回溯法的使用。 现在我们来给大家介绍一下它的好朋友——分支界限法。 如果说回溯法是使用深度优先遍历算法,那么分支界限法就是使用广度优先遍历算法。 深度优先遍历可以只使用一个属性来存放当前状态,但是广度优先遍历就不可以了,所以广度优先遍历的节点必须用来存储当前状态,一个节点代表一个当 ... »

KMP算法,你想知道的都在这里!

简洁 我相信很多人都听说过KMP算法*(PS:在上数据结构的时候,这个算法自始至终都没想明白)* 大家也知道KMP算法是用来寻找目标子串的算法,但是都没有真正搞懂KMP。之前,我也是如此,我疑惑的有: Next数组中的值是如何定下来的? 得到Next数组以后,又是如何遍历的? 希望这篇文章能对你们有 ... »

优先队列——priority queue

优先队列朴素版之简单应用 合并果子 题意: n个果子,数目为tr[i],进行n - 1次合并操作,每次都消耗两堆果子的重量和的体力,耗费的总体力等于每次合并所耗费的体力和,求最小值 思路1: 使用秘技STL,priority_queue来操作,但这个优先队列是从大到小的,有一个非常非常非常简便的方法 ... »

单调队列 —— 滑动窗口

dequeue双向队列 dequeue<int>que;//创建双向队列 que.push_front()//在队列前面塞一个元素 que.push_back()//在队列后面塞一个元素 que.pop_front()//删除队列第一个元素 que.pop_back()//删除队列的最后一个元素 q ... »

博弈论入门(论和威佐夫、巴什、尼姆打牌被吊打是什么感受(╥﹏╥)

威佐夫博弈 黄金分割比 经典例题: 有两堆石子,有两个绝顶聪明的人在玩一个游戏,每次每个人可以从一堆石子中取任意数量但不少于1个的石子,或从两堆中同时取走相同数量的石子,最后一个取完石子的人获胜。 面对博弈题,最重要的找出必败点 (0,0)(1,2)(3,5)(4,7)(6,10)…… 通过观察可以 ... »

买卖股票专题系列6---买卖股票的最佳时机含手续费

题目: 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。注意:这里的一笔交易指买入持 ... »

买卖股票专题系列1---买卖股票的最佳时机1

题目: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 ... »

计算斐波那契数

计算斐波那契数 【lintcode】366 描述 查找斐波纳契数列中第 N 个数。 所谓的斐波纳契数列是指: 前2个数是 0 和 1 。 第 i 个数是第 i-1 个数和第i-2 个数的和。 斐波纳契数列的前10个数字是: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ... 以下 ... »

JVM系列(三):JVM创建过程解析

上两篇中梳理了整个java启动过程中,jvm大致是如何运行的。即厘清了我们认为的jvm的启动过程。但那里面仅为一些大致的东西,比如参数解析,验证,dll加载等等。把最核心的loadJavaVM()交给了一个dll或者so库。也就是真正的jvm我们并没有接触到,我们仅看了一个包装者或者是上层应用的实现 ... »

动态规划-01背包问题

有N件物品和一个容量为V的背包。第i件物品的体积是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。状态转换方程:“f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}” ... »

分治算法

分治算法(Divide And Conquer)是解决规模庞大的问题的很好的思路,它通过降低问题的规模,形成若干个规模更小但形式相同的子问题,进行递归求解。在求解过后,将各个子问题的解合并起来,形成原问题的解。那么它的大致流程主要分成三步:分解(Divide);解决(Conquer);合并(Merg... ... »

字符串最大最小表示法

什么是循环字符串的最小表示法 就是对于一个字符串来说,其同构字符串中字典序最小的一个 比如说:S = bacd,则其同构字符串有 acdb、cdba、dbac,其中acdb事S串的最小表示法,因为其字典序最小 如何求字符串的循环同构的最小表示 暴力的方法是,你将所有的同构都写出来,如何拍个序,输出第 ... »

单调栈

概念: 顾名思义,单调栈即位满足单调性的栈结构,包括递增栈、递减栈。 指的是栈内元素从底到顶是单增、单减。一般来说从栈底到栈顶依次变大的就叫单调递增栈。 用途: 1.对于每个元素而言,可以看到之前比他大的所有的数和数量,且是依次的 比如:10 3 7 4 12 ![image-20210210165 ... »

【算法】数据结构与算法基础总览(中)——刷Leetcode等算法题时一些很实用的jdk辅助方法锦集

最近重新学习数据结构与算法以及刷leetcode算法题时,发现不少jdk自带的方法可以提升刷题的效率。这些小技巧不仅仅对刷算法题带来便利,对我们平时开发也是很有帮助的。本文以java语言为基础,记录了目前已经使用或看到过的一些小技巧,后续在刷题过程中,还会持续更新。 一、数组 1、使用Arrays. ... »