算法
程序员世杰
公众号『程序员世杰』,就职过各互联网大厂,资深码农,专注Java后端技术栈、AIGC等领域的技术分享
展开
-
二分查找算法的万能公式(LeetCode35、704、1095)
二分查找常常用于有序数组的查找操作。当然如果是一个问题,数组的顺序满足特定条件(不仅仅是升序或者降序,也可以是先升后降或先降后升),就可以通过逐步排查,缩小问题的规模的方式找到,这种算法也是二分查找算法。PS:不想看过程的,直接拉到万能公式,即看即用!文章目录两种二分查找第一种第二种思维导图万能公式代码示例(套公式示例)LeetCode704LeetCode35LeetCode1095...原创 2020-04-29 22:09:25 · 3595 阅读 · 0 评论 -
搞懂回溯算法思想(LeetCode46、47、980)
一、回溯介绍1.定义搜索与回溯是计算机解题中常用的算法,很多问题无法根据某种确定的计算法则来求解,可以利用搜索与回溯的技术求解。回溯是搜索算法中的一种控制策略。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。如迷宫问题:进入迷宫后,先随意选择一个前进方...原创 2020-04-25 16:58:22 · 625 阅读 · 0 评论 -
Java求指定精度的开根号运算
原理是二分法不断迭代:取max为指定值target,min为1,精度要求m;取min和max的中点mid,当midmid>target,把max设定为mid;当midmid<target,把min设定为mid。然后max和min求出新的中间 newMin。结果就在mid和newMid之间,并不断逼近最终结果,当newMid-mid的绝对值小于m时,结果即为所求【代码】packa...原创 2020-04-14 22:26:52 · 844 阅读 · 0 评论 -
【面试刷题-力扣经典】动规:221. 最大正方形
【题目】在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。输入:1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4【思路】dp[x][y] 代表的是正方形的最右下角是x,y的时候,正方形的边长从 (0,0)(0,0) 开始,对原始矩阵中的每一个 1,我们将当前元素的值更新为(1,3) 处的 2 表示到该索引为...原创 2020-04-13 20:52:57 · 436 阅读 · 0 评论 -
快速求最大公约数和最小公倍数
辗转相除法辗转相除法又名欧几里得算法(Euclidean algorithm),目的是求出两个正整数的最大公约数。这条算法基于一个定理:两个正整数 a 和 b(a 大于 b),它们的最大公约数等于 a 除以 b 的余数 c 和 较小数 b 之间的最大公约数。算法计算过程是这样的:2个数相除,得出余数如果余数不为0,则拿较小的数与余数继续相除,判断新的余数是否为0如果余数为0,则最大公...原创 2020-04-09 21:31:30 · 996 阅读 · 2 评论 -
【面试刷题-力扣经典】409最长回文串、647回文子串、5最长回文子串
1原创 2020-04-08 20:24:08 · 326 阅读 · 0 评论 -
LeetCode42.接雨水、LeetCode11. 盛最多水的容器
单调栈、动态规划、双指针【题目】给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。【输入】: [0,1,0,2,1,0,1,3,2,1,2,1]【输出】: 6【解法一】:暴力解法思路:对于数组中的每个元素,我们找出下雨后水能达到的最高位置,等于两边最大高度的较小值减去当前高度的值。每次计算的当前元素能存储的雨水,最后累计即可首尾元素无...原创 2020-04-05 21:59:03 · 512 阅读 · 0 评论 -
单调栈
一、单调栈定义单调递增栈:数据出栈的序列为单调递增序列(比站内元素小就入栈,否则将栈中比当前元素小的元素弹出后再入栈)单调递减栈:数据出栈的序列为单调递减序列(比站内元素大就入栈,否则将栈中比当前元素大的元素弹出后再入栈)二、题目(一)视野总和【题目】描叙:有 n 个人站队,所有的人全部向右看,个子高的可以看到个子低的发型,给出每个人的身高,问所有人能看到其他人发现总和是多少。输...原创 2020-04-03 09:33:14 · 608 阅读 · 1 评论 -
磁盘寻道调度算法
磁盘调度在多道程序设计的计算机系统中,各个进程可能会不断提出不同的对磁盘进行读 / 写操作的请求。由于有时候这些进程的发送请求的速度比磁盘响应的还要快,因此我们有必要为每个磁盘设备建立一个等待队列,常用的磁盘调度算法有以下四种:先来先服务算法(FCFS),最短寻道时间优先算法(SSTF),扫描算法(SCAN),循环扫描算法(CSCAN) 例: 假定某磁盘共有 ...转载 2020-03-31 11:03:03 · 5080 阅读 · 0 评论 -
快速幂
快速幂:将幂指数 b 转换为二进制,例:6 对应二进制为 110,此时 a b =a4a2a0,时间复杂度为 f(n)=lgnpublic class QuickPower { public static void main(String[] args) { /** * 2^n;需要n个2相乘,时间复杂度O(n) * ...原创 2020-03-30 20:22:58 · 182 阅读 · 0 评论 -
java处理超大数——BigInteger
一、BigInteger介绍如果在操作的时候一个整型数据已经超过了整数的最大类型长度 long 的话,则此数据就无法装入,所以,此时要使用 BigInteger 类进行操作。这些大数都会以字符串的形式传入。BigInteger 相比 Integer 的确可以用 big 来形容。它是用于科学计算,Integer 只能容纳一个 int,所以,最大值也就是 2 的 31 次访减去 1,十进制为 21...原创 2020-03-30 17:01:57 · 11260 阅读 · 2 评论 -
最长回文子串
【题目】给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。解法一、暴力法很明显,暴力法将选出所有子字符串可能的开始和结束位置,并检验它是不是回文。时间复杂度:O(n^3)空间复杂度:O(1)【代码】public String longestPalindrome...原创 2020-03-29 18:13:49 · 239 阅读 · 0 评论 -
LinkedHashMap底层实现+LRU缓存实现
一、介绍LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题。除此之外,LinkedHashMap 对访问顺序也提供了相关支持。在一些场景下,该特性很有用,比如缓存。在实现上,LinkedHashMap 很多方法直接继承自 HashMap,仅为维护双向链表覆写了部分方法。Linke...原创 2020-03-26 20:10:54 · 1024 阅读 · 0 评论 -
什么是一致性哈希?看这里
[TOC]前言伴随着系统流量的增大,出现了应用集群。在 Redis 中为了保证 Redis 的高可用也为 Redis 搭建了集群对数据进行分槽存放。在 Mysql 数据库要存储的量达到一个很高的地步的时候,我们会对数据库进行分库分表操作。OK,到这儿先假设我们不知道什么是集群、什么是分库分表,我们先来看一个数据库水平切分演变的例子:假设我们的系统中有一张会员表 customer_info,...转载 2020-03-26 11:18:59 · 8029 阅读 · 2 评论 -
剑指offer刷题总结——链表篇(二)
1.链表中环的入口结点【题目】链表中环的入口结点给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出 null。【代码】package swear2offer.linkednode;public class Loop { /** * 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出 null。 * * 思路: ...原创 2020-03-17 22:51:46 · 145 阅读 · 0 评论 -
剑指offer刷题总结——树篇(三)
星级:11.按之字形顺序打印二叉树【题目】请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。【代码】package swear2offer.tree;import java.util.ArrayList;import java.util.LinkedList;import java....原创 2020-03-01 21:26:35 · 442 阅读 · 0 评论 -
剑指offer刷题总结——数组篇(五)
1.数字在排序数组中出现的次数【题目】统计一个数字在排序数组中出现的次数。【代码】public int GetNumberOfK(int [] array , int k) { if (array.length==0 || array==null) return 0; int i,n,count; n = array.length; ...原创 2020-02-29 18:16:14 · 490 阅读 · 0 评论 -
剑指offer刷题总结——数组篇(四)
1.数组中的逆序对【题目】在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数 P。并将 P 对 1000000007 取模的结果输出。 即输出 P%1000000007题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%1...原创 2020-02-29 15:51:12 · 469 阅读 · 0 评论 -
剑指offer刷题总结——字符串篇(一)
星级:11.字符串的排列【题目】输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串 abc, 则打印出由字符 a,b,c 所能排列出来的所有字符串 abc,acb,bac,bca,cab 和 cba。输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。【代码】package swear2offer.strs;import java.util...原创 2020-02-27 10:58:14 · 552 阅读 · 1 评论 -
剑指offer刷题总结——树篇(二)
星级:11.二叉树中和为某一值的路径【题目】输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。【代码】 /** * 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。 * 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路...原创 2020-02-26 10:46:48 · 420 阅读 · 0 评论 -
剑指offer刷题总结——数组篇(三)
1.顺时针打印矩阵【题目】输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下 4 X 4 矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.【代码】public ArrayList<Integer> printMatr...原创 2020-02-24 20:51:40 · 500 阅读 · 0 评论 -
剑指offer刷题总结——数组篇(二)
1.斐波那契数列【题目】大家都知道斐波那契数列,现在要求输入一个整数 n,请你输出斐波那契数列的第 n 项(从 0 开始,第 0 项为 0)。【代码】package swear2offer.array;public class FeiBoNaQi { /** * 大家都知道斐波那契数列,现在要求输入一个整数 n, * 请你输出斐波那契数列的第 n 项(...原创 2020-02-23 16:55:28 · 479 阅读 · 0 评论 -
剑指offer刷题总结——堆、栈、队列篇
1.用两个栈实现队列【题目】用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。 队列中的元素为 int 类型。【代码】package swear2offer.construction;import java.util.Stack;public class StackToQueue { /** * 用两个栈来实现一个队列,完成队列的 Push 和 P...原创 2020-02-22 16:58:23 · 501 阅读 · 0 评论 -
剑指offer刷题总结——树篇(一)
1.重建二叉树【题目】输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {4,7,2,1,5,3,8,6},则重建二叉树并返回。【代码】package swear2offer.tree;public class ReCreateTree { ...原创 2020-02-22 12:17:01 · 522 阅读 · 0 评论 -
剑指offer刷题总结——链表篇(一)
1.从尾到头打印链表【题目】输入一个链表,按链表从尾到头的顺序返回一个 ArrayList。【代码】package swear2offer.linkednode;import java.util.ArrayList;public class ReturnArrayList { /** * 输入一个链表,按链表从尾到头的顺序返回一个 ArrayList。 ...原创 2020-02-22 10:57:19 · 525 阅读 · 0 评论 -
剑指offer刷题总结——数组篇(一)
1.排序次序【题目】返回一个数字数组的排序值,比如数据 [6,2,5,0] 的返回是 [4,2,3,1]【代码示例】package swear2offer.array;import java.util.Arrays;public class SortSequence { /** * 返回一个数字数组的排序值 * 比如数据 [6,2,5,0] 的返回是 [...原创 2020-02-21 16:03:10 · 1150 阅读 · 0 评论 -
【自用】刷算法题路径
知识点总结:排序算法(堆排序、快排、归并)动态规划回溯算法链表、二叉树、数组、堆、栈路径:把总结的题目复习一遍复习牛客网的剑指offer66道题目LeetCode题目进行针对性训练...原创 2020-02-17 16:11:45 · 179 阅读 · 0 评论 -
约瑟夫环问题多解法汇总
【问题】首先,让小朋友们围成一个大圈。然后,随机指定一个数 m, 让编号为 0 的小朋友开始报数。每次喊到 m-1 的那个小朋友要出列唱首歌,并且不再回到圈中,从他的下一个小朋友开始,继续 0…m-1 报数… 这样下去… 直到剩下最后一个小朋友,哪个小朋友会在最后表演呢?(注:小朋友的编号是从 0 到 n-1)如果没有小朋友,请返回 - 1【题解一、数组模拟环】public int So...原创 2020-01-06 10:18:27 · 292 阅读 · 0 评论 -
Java面试知识点(九十三)高效判断一个数,是不是素数
面试的时候,如果要手写算法题目,判断一个数是不是素数,可以说是非常常见的问题了,这道题目回答并不算难,但是想要以优雅高效的方法回答,却并不轻松,下面我会介绍三种方式,时间复杂度从高到低。注意:0和1既不是素数也不是合数第一种方式1.方式:从2遍历到n-12.时间复杂度:O(n)3.代码示例boolean firstMethod(int n) { if (n < 2...原创 2019-11-13 15:43:16 · 879 阅读 · 0 评论 -
Java面试知识点(七十七)剑指offer精彩算法题(上)
一、剑指offer第56题【链表中环的入口节点】【题目】给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出 null。【思路】1、设置快慢指针,假如有环,他们最后一定相遇。2、两个指针分别从链表头和相遇点继续出发,每次走一步,最后一定相遇与环入口。证明结论 1:设置快慢指针 fast 和 low,fast 每次走两步,low 每次走一步。假如有环,两者一定会相遇(因为 l...原创 2019-10-18 14:28:39 · 415 阅读 · 0 评论 -
DP动态规划专题(一)动态规划基本模型
动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。原创 2019-04-02 11:25:07 · 2484 阅读 · 2 评论 -
DP动态规划专题(二)动态规划应用例题和代码实现
本篇着重进行动态规划例题展开,关于动态规划的基本模型和基础知识,请移步DP动态规划专题(一)动态规划基本模型文章目录【例1】求最长不下降序列【例1】求最长不下降序列㈠问题描述:设有由n个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)且b(i)<>b(j) (i<>j),若存在i1<i2<i3< … < ie 且有b(...原创 2019-04-02 12:03:50 · 823 阅读 · 0 评论 -
图论最短路径算法(一)Floyed算法(弗洛伊德算法)
文章目录Floyed-Warshall算法 O(N^3^)算法描述:算法分析&思想讲解:Floyed算法变形:应用场景【例1】最短路径问题Floyed-Warshall算法 O(N3)简称Floyed(弗洛伊德)算法,是最简单的最短路径算法,可以计算图中任意两点间的最短路径。Floyed的时间复杂度是O (N3),适用于出现负边权的情况。以下没有特别说明的话,dis[u][v]表...原创 2019-04-08 11:18:58 · 2180 阅读 · 0 评论 -
图论最短路径算法(三)SPFA算法(福特/Ford算法的队列实现)
SPFA是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。【算法思想】初始时将起点加入队列。每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将其入队。直到队列为空时算法结束。这个算法,简单的说就是队列优化的bellman-ford,利用了每个点不会更新次数太多的特点发明的此算法。SPFA 在形式上和广度优先搜索非常类似,不同的是广度...原创 2019-04-12 11:11:23 · 327 阅读 · 0 评论 -
搜索与回溯算法
为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。一、前言搜索与回溯是计算机解题中常用的算法,很多问题无法根据某种确定的计算法则来求解,可以利用搜索与回溯的技术求解。回溯是搜索算法中的一种控制策略。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发...原创 2019-06-13 16:38:04 · 8969 阅读 · 1 评论 -
刷题——[剑指 offer] JAVA 版题解
序号 题解 牛客 OJ 数据结构类型 03 [剑指 offer] 二维数组中的查找 二维数组中的查找 数组 04 [剑指 offer] 替换空格 替换空格 字符串 05 [剑指 offer] 从尾到头打印链表 从尾到头打印链表 链表 06 [剑指 offer] 重建二叉树 重建二叉树 ...原创 2019-07-15 10:25:09 · 2017 阅读 · 0 评论 -
Java实现搜索回溯经典题目
前言搜索与回溯是计算机解题中常用的算法,很多问题无法根据某种确定的计算法则来求解,可以利用搜索与回溯的技术求解。回溯是搜索算法中的一种控制策略。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。如迷宫问题:进入迷宫后,先随意选择一个前进方向,一步步向前试探前进,...原创 2019-07-18 12:01:44 · 1910 阅读 · 1 评论 -
B树、B+树、B*树
B树及其变种是数据库存储主要数据形式之一二叉搜索树在说明B树之前,先说明一下B树的基础——二叉搜索树所有非叶子结点至多拥有两个儿子(Left 和 Right);所有结点存储一个关键字;非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;如图所示:使用二叉搜索树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,...转载 2019-07-16 10:34:52 · 993 阅读 · 0 评论 -
Java面试知识点(四十七)红黑树
红黑树红黑树就是一种平衡的二叉查找树,说他平衡的意思是他不会变成 “瘸子”,左腿特别长或者右腿特别长。除了符合二叉查找树的特性之外,还具体下列的特性:节点是红色或者黑色根节点是黑色每个叶子的节点都是黑色的空节点(NULL)每个红色节点的两个子节点都是黑色的。从任意节点到其每个叶子的所有路径都包含相同的黑色节点。插入数据可能会导致不符合红黑树规则的情况出现...原创 2019-07-18 18:14:17 · 1160 阅读 · 0 评论 -
java实现排序算法,比较时间复杂度
插入排序、冒泡排序、选择排序、快速排序、归并排序1.插入排序【定义】第一个元素自成一个有序数组A,从第二个元素开始,把每一个元素插入到有序数组A中合适的位置,满足有序的条件。直到最后元素,至此构建成一个有序数组。【时间复杂度】O(n2)【代码】...原创 2019-07-16 18:04:01 · 2202 阅读 · 0 评论