算法
文章平均质量分 78
算法是每个程序员必不可少的能力,也决定着你的编码能力,不管是面试,还是实际的技术攻关,算法都显得格外重要,一起来刷题,培养算法思维吧!
ATFWUS
电子科技大学硕士,CSDN博客专家。曾在两家top互联网大厂及一家央企工作,拥有丰富的工程实践经验,热爱技术的开源与分享。关注我,一起在计算机的海洋里系统化的学习!(本博客简介见个人主页或博客简介专栏)
展开
-
2020最新-精选基础算法100题(面试必备)
0x01.概述作为一个程序员,算法能力必不可少,虽然不一定是算法工程师,但是算法还是彰显着个人的编码能力,面试中也经常会被问到,甚至会被要求临场做算法题,所以,还是好好积累吧。个人其实对算法挺有兴趣的,从3月份开始,陆陆续续刷了一些算法题,把一些有意义的记录下来了,也顺便写了一些题解,个人认为,还是挺有收获的。之前写了一篇算法文章的目录,不过后来就忘了实时去更新了,于是现在,想把之前做过的一些有意义的算法题分享出来,刚好整理了100篇比较有意义的。希望对大家有所帮助。0x02.说明关原创 2020-05-18 19:58:16 · 286444 阅读 · 24 评论 -
打印矩阵问题
打印矩阵问题是这样一个问题:以顺时针或者逆时针的方式打印整个矩阵。因为这个打印的顺序和我们经常遍历矩阵的顺序完全不同,所以初次面对这个问题时,看似比较困难,但是仔细一想,解法又会非常多的,是一道不错的面试题(前提是以前没有做过)。...原创 2022-08-10 21:13:22 · 589 阅读 · 0 评论 -
LeetCode 求和类问题 深入分析(两数之和,三数之和,四数之和)
本文整理了LeetCode中常见的求和类问题(两数之和,三数之和,四数之和),分析其求解及改进的思路。希望能给初入算法的同学提供一些帮助。原创 2021-07-30 16:00:00 · 6620 阅读 · 0 评论 -
双栈实现队列 && 单队列实现栈
简单算法记载。算法要求:使用两个栈来实现队列。要求只能使用栈特性相关的操作,如push,pop,peek,isEmpty等。要求要能实现队列特性相关的操作,如push,pop,peek,isEmpty等。实现思想:一个栈用于输入,一个栈用于输出。队列的所有push操作交给输入栈。当队列需要pop或者peek时,先看输出栈中是否有元素,有直接进行相关操作,没有就将输入栈倒置到输出栈中,再使用输出栈来进行相关操作。利用的核心思想是:栈倒置后的顺序就是队列的顺序。实现代码:时.原创 2021-03-05 13:05:29 · 520 阅读 · 2 评论 -
你知道位运算x&=(x-1)表示什么嘛?
今天一个小伙伴说在一个算法里面看到代码x&=(x-1)不明白它的意思,于是我给ta分析了一下,在此分享出来,其实也很好理解,想清就行了。理解x&=(x-1):单纯的去看这些位运算的话,如果不是接触很多,很难一眼看出它的含义,我们不妨拿几个数先试试,理解一下它的实际运算过程,这样就很好理解了。假设x=3,也就是11。那么x-1=2,也就是10。那么此时x&(x-1)也就等于11&10,根据&的运算规则,相同为1,不同为0,那么运算结果是10。.原创 2021-03-03 14:44:57 · 10617 阅读 · 9 评论 -
旋转图像算法-实际应用
针对图片90度旋转的算法思路,进行实际的应用。原创 2020-12-19 12:26:53 · 18751 阅读 · 4 评论 -
【儿童节快乐呀!】-- 拥有最多糖果的孩子【儿童节特别题】
0x01.谁能拥有最多的糖果呢?来自儿童节官方的满满宠意。看看谁能拥有最多的糖果呢?给你一个数组 candies 和一个整数 extraCandies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目。对每一个孩子,检查是否存在一种方案,将额外的 extraCandies 个糖果分配给孩子们之后,此孩子有 最多 的糖果。注意,允许有多个孩子同时拥有 最多 的糖果数目。示例 1:输入:candies = [2,3,5,1,3], extraCandies = 3输出:[true,原创 2020-06-01 08:31:53 · 756 阅读 · 0 评论 -
图文并茂详解经典算法系列-1:根据指定两种序列构造二叉树
0x01.问题1.从前序与中序遍历序列构造二叉树根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出:前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树:2.从中序与后序遍历序列构造二叉树根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorde原创 2020-05-22 12:26:49 · 1054 阅读 · 0 评论 -
每个元音包含偶数次的最长子字符串(教你如何状态压缩)
0x01.问题给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 ‘a’,‘e’,‘i’,‘o’,‘u’ ,在子字符串中都恰好出现了偶数次。示例 1:输入: s = “eleetminicoworoep”输出: 13解释: 最长子字符串是 “leetminicowor” ,它包含 e,i,o 各 2 个,以及 0 个 a,u 。示例 2:输入: s = “leetcodeisgreat”输出: 5解释: 最长子字符串是 “leetc” ,其中包含 2 个 e原创 2020-05-20 09:29:51 · 706 阅读 · 0 评论 -
课程表 II-- 拓扑排序思想
0x01.问题现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]。给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。示例 1:输入: 2, [[1,0]] 输出: [0,1]解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课原创 2020-05-17 09:33:59 · 1136 阅读 · 0 评论 -
和为K的子数组--前缀和优化
0x01.问题给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。说明 :数组的长度为 [1, 20,000]。数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。0x02.详细分析思路初读题目,发现主要是寻找子数组的个数,条件是子数组的和为k。发现是子数组问题,于是各种方法就可原创 2020-05-15 08:39:01 · 1314 阅读 · 1 评论 -
二叉树的层序遍历序列存储--层级BFS
0x01.问题给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],3 / \ 9 20 / \ 15 7返回其层次遍历结果:[[3],[9,20],[15,7]] * Definition for a binary tree node. * public class TreeNode { * int val; *原创 2020-05-13 08:20:30 · 670 阅读 · 0 评论 -
最小栈--辅助最小值栈的维护
0x01.问题设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入: [“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],[-2],[0],[-3],[],[],[],[]]输出: [null,null,nu原创 2020-05-12 10:45:22 · 850 阅读 · 0 评论 -
《剑指offer》二叉树的最近公共祖先--递归解决
0x01.问题给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节原创 2020-05-11 12:28:24 · 685 阅读 · 1 评论 -
x 的平方根--二分法取平方根
0x01.问题实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4 输出: 2示例 2:输入: 8 输出: 2 说明: 8 的平方根是 2.82842…,由于返回类型是整数,小数部分将被舍去。0x02.解决思路问题的关键当然不是直接去调用相关的库函数(也会存在精度不足),而是自己去思考一些其他的思路。最为简单的思路是把0-x看成有个有序集,在其中进行二分搜索,找原创 2020-05-09 08:11:51 · 835 阅读 · 0 评论 -
最大正方形--矩阵中的dp
0x01.问题在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。示例:输入:1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0输出: 4 public int maximalSquare(char[][] matrix) 0x02.dp的简要分析问题的关键是在矩阵中找一个只包含1的最大正方形。根据普通的思...原创 2020-05-08 10:57:25 · 1359 阅读 · 0 评论 -
另一个树的子树--递归判断
0x01.问题给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。示例 :给定的树 s:(图1)给定的树 t:(图2)4/ \1 2返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。public boolean isSubtre...原创 2020-05-07 08:31:09 · 541 阅读 · 0 评论 -
验证二叉搜索树
0x01.问题给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入:2/ \1 3输出: true示例 2:输入:(如图)输出: false解释: 输入为: [5,1,4,null,null,3...原创 2020-05-05 09:29:42 · 607 阅读 · 0 评论 -
跳跃游戏 II -- 贪心
0x01.问题给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。示例:输入: [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。说明:假设你总是可以到达数组的最...原创 2020-05-04 08:01:35 · 778 阅读 · 0 评论 -
整数转换英文表示
0x01.问题将非负整数转换为其对应的英文表示。可以保证给定输入小于 2^31 - 1 。示例 1:输入: 123 输出: “One Hundred Twenty Three”示例 2:输入: 12345 输出: “Twelve Thousand Three Hundred Forty Five”示例 3:输入: 1234567 输出: “One Million Two Hundr...原创 2020-04-30 21:15:32 · 1409 阅读 · 0 评论 -
快乐数--快慢指针(判断成环思路)
0x01.问题编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 True ;不是,则返回 False 。示例:输入:19输出:true解释:1^2 + 9^2 = ...原创 2020-04-30 08:54:57 · 754 阅读 · 0 评论 -
山脉数组中查找目标值--二分搜索
0x01.问题给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 最小 的下标 index 值。如果不存在这样的下标 index,就请返回 -1。何为山脉数组?如果数组 A 是一个山脉数组的话,那它满足如下条件:首先,A.length >= 3其次,在 0 < i < A.length - 1 ...原创 2020-04-29 08:35:59 · 677 阅读 · 0 评论 -
搜索旋转排序数组--二分搜索
0x01.问题假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [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...原创 2020-04-27 08:24:46 · 540 阅读 · 0 评论 -
全排列问题--经典回溯算法
0x01.问题给定一个 没有重复 数字的序列,返回其所有可能的全排列。输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]public List<List<Integer>> permute(int[] nums)0x02.问题分析全排列问题是一个非常经典的回溯类型...原创 2020-04-25 19:26:24 · 1479 阅读 · 0 评论 -
二叉树的右视图--深搜
0x01.问题给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释: 1 <--- / \ 2 3 <--- \ ...原创 2020-04-22 08:32:24 · 597 阅读 · 0 评论 -
统计「优美子数组」-- 滑动窗口
0x01.问题给你一个整数数组 nums 和一个整数 k。如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是 「优美子数组」。请返回这个数组中「优美子数组」的数目。示例 1:输入:nums = [1,1,2,1,1], k = 3 输出:2 解释:包含 3 个奇数的子数组是 [1,1,2,1] 和[1,2,1,1] 。示例 2:输入:nums = [2,4,6...原创 2020-04-21 18:38:49 · 696 阅读 · 0 评论 -
岛屿数量--DFS次数
0x01.问题给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入: 11110 11010 11000 00000输出: 1示例 2:输入: 11000 11000 00100 00011输出: 3解释: ...原创 2020-04-20 08:00:09 · 783 阅读 · 0 评论 -
统计重复个数--循环结剪枝
0x01.问题由 n 个连接的字符串 s 组成字符串 S,记作 S = [s,n]。例如,["abc",3]=“abcabcabc”。如果我们可以从 s2 中删除某些字符使其变为 s1,则称字符串 s1 可以从字符串 s2 获得。例如,根据定义,“abc” 可以从 “abdbec” 获得,但不能从 “acbbe” 获得。现在给你两个非空字符串 s1 和 s2(每个最多 100 个字符长)和两...原创 2020-04-19 16:28:30 · 17700 阅读 · 0 评论 -
盛最多水的容器--双指针
0x01.问题给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。**说明:**你不能倾斜容器,且 n 的值至少为 2。示例:输入:[1,8,6,2,5,4,8,3,7]输出:49来源于...原创 2020-04-18 09:15:48 · 735 阅读 · 1 评论 -
跳跃游戏--贪心思路
0x01.问题给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3步到达最后一个位置。示例 2:输入: [3,2,1,0,4] 输出: false 解释: 无...原创 2020-04-17 07:57:49 · 884 阅读 · 0 评论 -
合并区间--排序解决
0x01.问题给出一个区间的集合,请合并所有重叠的区间。输入: [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].public int[][] merge(int[][] intervals)0x02.分析思路看完题目,首选想到的应该是,这个给...原创 2020-04-16 07:54:34 · 798 阅读 · 0 评论 -
01 矩阵--多源BFS
0x01.问题给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 。给定矩阵的元素个数不超过 10000。给定矩阵中至少有一个元素是 0。矩阵中的元素只在四个方向上相邻: 上、下、左、右。示例:输入:0 0 00 1 01 1 1输出:0 0 00 1 01 2 1public int[][] updateMatr...原创 2020-04-15 08:42:29 · 828 阅读 · 1 评论 -
两数相加 II--用栈翻转链表元素
0x01.问题给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。注:与 两数相加I 属于同类型的题目输入示例:(7 -> 2 -> 4 -> 3) + (5 -&...原创 2020-04-14 08:08:30 · 524 阅读 · 0 评论 -
设计推特--空间动态更新的Java底层实现原理
0x01.问题设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近十条推文。你的设计需要支持以下的几个功能:postTweet(userId, tweetId): 创建一条新的推文。getNewsFeed(userId): 检索最近的十条推文。每个推文都必须是由此用户关注的人或者是用户自己发出的。推文必须按照时间顺序由最近...原创 2020-04-13 12:23:29 · 22579 阅读 · 0 评论 -
交点--几何判断线段交点问题
0x01.问题给定两条线段(表示为起点start = {X1, Y1}和终点end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值。要求浮点型误差不超过10^-6。若有多个交点(线段重叠)则返回 X 值最小的点,X 坐标相同则返回 Y 值最小的点。坐标绝对值不会超过 2^7,输入的坐标均是有效的二维坐标。输入示例:line1 = {0, 0}, {3, 3}...原创 2020-04-12 09:39:05 · 1014 阅读 · 1 评论 -
鸡蛋掉落--一步一步的dp
0x01.问题你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 &l...原创 2020-04-11 10:41:28 · 15538 阅读 · 2 评论 -
翻转字符串里的单词-Java的正则匹配
0x01.问题给定一个字符串,逐个翻转字符串中的每个单词。无空格字符构成一个单词。输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。输入示例:" hello world! "输出示例:“world! hello”public String reverseWords(String s)...原创 2020-04-10 08:29:07 · 685 阅读 · 0 评论 -
括号生成--DFS
0x01.问题给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。输入示例:3输出示例:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]题目来源于Leetcodepublic List<String> generateParenthesis(int n)0x02.要点...原创 2020-04-09 08:57:37 · 812 阅读 · 0 评论 -
机器人的运动范围--经典计数DFS
0x01.问题地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机...原创 2020-04-08 08:53:18 · 974 阅读 · 0 评论 -
旋转矩阵--原地修改
0x01.问题给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。挑战:不占用额外内存空间能否做到?输入示例:给定 matrix =[[1,2,3],[4,5,6],[7,8,9]],输出示例:原地旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]来自程序员面试经典Jav...原创 2020-04-07 08:49:08 · 1151 阅读 · 0 评论