
算法
文章平均质量分 91
Pi_dan
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
八大排序算法总结Java实现
大二时候学的数据结构,也没有好好实现一下,上个星期课上写选择排序,选择排序是啥来着,课下就整理了一下。八种排序方法常见的八种排序方法:冒泡排序 快速排序 插入排序 希尔排序 选择排序 堆排序 归并排序 基数排序冒泡排序,快速排序都属于交换排序,插入希尔排序都是属于插入排序,希尔排序的基础也是插入排序,选择排序和堆排序都是属于选择排序。各排序方法详细介绍冒泡排序...原创 2018-09-19 21:00:29 · 317 阅读 · 1 评论 -
LeetCode 31
31. 下一个排列题意要理解 “字典序”,题目中的数组,进行全排列生成的所有序列,从大到小排序,找出题目中序列的下一个序列。比如 [2,3,1]:123132213231312321[2,1,3] 的下一个字典序就是[2,3,1]解题思路:从后向前扫描,每次扫描两个相邻的数字,即a[i]和a[i+1],判断是否降序,即a[i]是否大于a[i+1],当不是降序的情况,就需要交换了...原创 2020-02-12 11:09:06 · 431 阅读 · 0 评论 -
LeetCode 19 21 23 链表题
今天的三个题都是链表题诶,都是比较简单的题。19. 删除链表的倒数第N个节点题目要求最好是一次遍历。类似题目在考研数据结构见过,也挺简单的。因为链表我们不知道它的长度,一个指针的话必定需要两次遍历,一次判断长度,一次根据长度来找倒数第N个节点删除。重要的是找出倒数第N个结点,删除就很简单了。两个指针只需要一次遍历,分别设置两个指针 p 和 tmp 均指向头指针head ,一开始时,先让...原创 2020-02-11 11:07:38 · 293 阅读 · 0 评论 -
LeetCode10正则表达式
考研完之后一直很浮躁,也没做啥事儿,现在疫情这么严重,出不了家门,初始公布成绩也推迟了,还有十来天就要出成绩了,呼……先做毕设写算法,出成绩之后再打算趴。10 正则表达式题目链接之前试着提交过这个题目,但是没过,今天补上。解题报告里有两种方法,回溯,动态规划。自己写的时候用回溯,但是代码及其不简洁而且考虑也不周全。解题报告里的回溯代码可真是清爽。回溯法如果没有符号 * 的存在这个题目就...原创 2020-02-10 21:48:25 · 229 阅读 · 0 评论 -
LeetCode14最长公共前缀
题目:编写一个函数来查找字符串数组中最长的公共前缀字符串。例如:{"abc","abfas","abcsdfw"} 输出:ab分析:比较一个字符串数组的最长公共前缀,遍历整个字符串数组,创建一个字符串用来保存当前最长公共字符串,逐个比较,不断更新公共字符串内容。情况比较多,考虑周全,不然可能会数组溢出。公共字符串的长度和当前比较字符串的长度大小的比较,避免数组越界,还有空字符串的时候。代码:c...原创 2018-03-07 21:30:13 · 3833 阅读 · 0 评论 -
LeetCode200岛屿的个数
题目:给定 '1'(陆地)和 '0'(水)的二维网格图,计算岛屿的数量。一个岛被水包围,并且通过水平或垂直连接相邻的陆地而形成。你可以假设网格的四个边均被水包围。示例 1:11110110101100000000答案: 1示例 2:11000110000010000011答案: 3分析:深度优先广度优先,当遍历到某个位置grid[i][j]时,判断它是否为1,为1,结果+1,然后则去遍...原创 2018-03-08 17:11:36 · 5741 阅读 · 0 评论 -
LeetCode78子集
题目:给定一组不同的整数 nums,返回所有可能的子集(幂集)。注意事项:该解决方案集不能包含重复的子集。例如,如果 nums = [1,2,3],结果为以下答案:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]分析:使用回溯法,递归求解,在循环中套用递归,递归中也就含有循环。创建一个result结果集合,和一...原创 2018-03-17 11:12:37 · 2273 阅读 · 0 评论 -
LeetCode6Z字形转换
题目:将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:(下面这样的形状)P A H NA P L S I I GY I R之后按逐行顺序依次排列:"PAHNAPLSIIGYIR" 实现一个将字符串进行指定行数的转换的函数:string convert(string text, int nRows);convert("PAYPALISHIRING", ...原创 2018-03-09 21:58:17 · 3423 阅读 · 4 评论 -
LeetCode35搜索插入位置
题目:给定一个排序数组和一个目标值,如果在数组中找到目标值则返回索引。如果没有,返回到它将会被按顺序插入的位置。你可以假设在数组中无重复元素。分析:二分搜索,查找到返回当前数字索引,查找不到返回它插入后的位置索引。就是在普通的二分搜索基础上,插入一个判断,当查找到最后一个数字时,如果查找到数字就返回当前索引,如果查找不到当前数字则判断一下和最后查找的数字的大小,返回相应的位置。代码:class S...原创 2018-03-10 23:00:02 · 846 阅读 · 0 评论 -
LeetCode207课程表
题目:现在你总共有 n 门课需要选,记为 0 到 n - 1。一些课程在修之前需要先修另外的一些课程,比如要学习课程 0 你需要先学习课程 1 ,表示为: [0,1]给定 n 门课以及他们的先决条件,判断是否可能完成所有课程?例如:2, [[1,0]]总共有2门课程可供选择。选取课程 1之前,你需要完成课程 0。所以这是可能的。2, [[1,0],[0,1]]总共有 2 门课程可供选择。要参加课程...原创 2018-03-11 12:05:33 · 1983 阅读 · 0 评论 -
LeetCode34搜索范围
题目:给定一个已经升序排序的整形数组,找出给定目标值的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果在数组中找不到目标,返回 [-1, -1]。例如:给出 [5, 7, 7, 8, 8, 10] 和目标值 8,返回 [3, 4]。分析:自己写的第一种方法就是普通二分查找,找到target数字之后,分别向前向后遍历,直到找到一个不等于target的数字。这个最差的情况到了...原创 2018-03-17 11:12:07 · 1066 阅读 · 0 评论 -
LeetCode46全排列
题目:给定一个含有不同数字的集合,返回所有可能的全排列。比如,[1,2,3] 具有如下排列:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]分析:全排列,回溯,直接看代码吧。代码:class Solution { public List<List<Integer>> permu...原创 2018-03-17 11:07:37 · 686 阅读 · 0 评论 -
LeetCode169求众数——分治
题目:给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且数组中的众数永远存在。方法:Hash Table将每个数字仿佛哈希表中,记数,直到某个数的count>n/2。时间复杂度为o(n)。排序因为众数是出现次数大于n/2的数字,所以排序之后中间的那个数字一定是众数。即nums[n/2]为众数。时间复杂度即排序的世界复...原创 2018-03-04 14:40:05 · 5861 阅读 · 7 评论 -
LeetCode100相同的树
题目:给定两个二叉树,写一个函数来检查它们是否相同。如果两棵树在结构上相同并且节点具有相同的值,则认为它们是相同的。 示例 1:输入 : 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3]输出: true示例 2:输入 : 1 1...原创 2018-03-17 21:45:22 · 1517 阅读 · 0 评论 -
LeetCode96不同的二叉查找树
题目:给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种?例如,给出 n = 3,则有 5 种不同形态的二叉查找树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ ...原创 2018-03-18 11:06:50 · 4591 阅读 · 1 评论 -
LeetCode767重构字符串
题目:给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。若可行,输出任意可行的结果。若不可行,返回空字符串。示例 1:输入: S = "aab"输出: "aba"示例 2:输入: S = "aaab"输出: ""注意:S 只包含小写字母并且长度在[1, 500]区间内。分析:写一个NewChar类,里面包含字母的出现频数,和字母本身。用优先队列PriorityQueue...原创 2018-03-12 21:37:56 · 1734 阅读 · 0 评论 -
LeetCode684冗余连接
题目在本问题中, 树指的是一个连通且无环的无向图。输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。结果图是一个以边组成的二维数组。每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边。返回一条可以删去的边,使得结果图是一个有着N个节点的...原创 2018-03-22 23:17:53 · 1045 阅读 · 0 评论 -
LeetCode71简化路径
题目:给定一个文档 (Unix-style) 的完全路径,请进行路径简化。例如,path = "/home/", => "/home"path = "/a/./b/../../c/", => "/c"边界情况:你是否考虑了 路径 = "/../" 的情况?在这种情况下,你需返回"/"。此外,路径中也可能包含多个斜杠'/',如 "/home//foo/&原创 2018-03-06 15:31:40 · 255 阅读 · 0 评论 -
LeetCode5最长回文子串
题目:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 长度最长为1000。示例:输入: "babad"输出: "bab"注意: "aba"也是有效答案 示例:输入: "cbbd"输出: "bb"分析:动态规划来做,每个回文字符串的子字符串也是回文字符串,即string是回文字符串那么它的string.substring(1,lenth-1),string.subst...原创 2018-03-13 18:17:11 · 2393 阅读 · 2 评论 -
LeetCode242有效的字母异位词
题目:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。例如,s = "anagram",t = "nagaram",返回 trues = "rat",t = "car",返回 false注意:假定字符串只包含小写字母。分析:两个int型数组,sArray和tArray,来储存s和t字符串中的字符情况,a对应数组下标0,b对应数组下标1……最后比较两个数组内容情况...原创 2018-03-19 22:25:06 · 4976 阅读 · 3 评论 -
LeetCode199. 二叉树的右视图
题目给定一棵二叉树,想象自己站在它的右侧,返回从顶部到底部看到的节点值。例如:给定以下二叉树, 1 <--- / \2 3 <--- \ \ 5 4 <---你应该返回 [1, 3, 4]。分析首先把二叉树的根节点添加到list结果集合中,然后遍历二叉树,首先遍历它的右子树,当结果添加一...原创 2018-03-29 22:48:46 · 894 阅读 · 0 评论 -
LeetCode1两数之和
题目:给定一个整数数列,找出其中和为特定值的那两个数。你可以假设每个输入都只会有一种答案,同样的元素不能被重用。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]分析:可以直接遍历两遍数组,第一遍用target-nums[i],第二遍找nums数组中是否存在target-num...原创 2018-03-14 16:43:31 · 10513 阅读 · 2 评论 -
LeetCode47全排列二
昨天没有写,今天补上哈。。题目给定一个可能包含重复数字的集合,返回所有可能的不同全排列。例如,[1,1,2] 有以下不同全排列:[ [1,1,2], [1,2,1], [2,1,1]]分析之前写的是无重复数字的全排列,这次是有重复数字的,这就需要判断一下是否要进行交换。在加入判断时,判断的范围要注意,因为一开始没有搞清楚交换的原理啊,错了很多次,判断时需要判断当前数组区间中是否存在...原创 2018-03-24 16:46:34 · 585 阅读 · 0 评论 -
LeetCode53最大子序和
题目给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大。例如,给定序列 [-2,1,-3,4,-1,2,1,-5,4],连续子序列 [4,-1,2,1] 的和最大,为 6。 扩展练习:若你已实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。分析一开始用的最简单最直接的方法,挨个的把每个子序列的和求一遍,时间复杂度O(n²),提交之后超时了。。。。。嗯...原创 2018-03-20 18:17:11 · 180 阅读 · 0 评论 -
LeetCode70爬楼梯
第一次完全自己写出来的动态规划代码,虽然是道简单题吧 啊呀好高兴,好高兴以后要慢慢的脱离开解题报告写算法!题目你正在爬楼梯。需要 n 步你才能到达顶部。每次你可以爬 1 或 2 个台阶。你有多少种不同的方式可以爬到楼顶呢?注意:给定 n 将是一个正整数。 示例 1:输入: 2输出: 2说明: 有两种方法可以爬到顶端。1. 1 步 + 1 步2. 2 步 示例 2:输入: 3输出: ...原创 2018-03-25 14:15:32 · 5826 阅读 · 9 评论 -
LeetCode22生成括号
题目给 n 对括号,写一个函数生成所有合适的括号组合。比如,给定 n = 3,一个结果为:[ "((()))", "(()())", "(())()", "()(())", "()()()"]分析n对括号,n个左括号为left,n个右括号right,当left != 0时,递归left-- path+“(”,当rigth!==&&right>原创 2018-03-21 20:46:47 · 2155 阅读 · 0 评论 -
LeetCode83. 删除排序链表中的重复元素
题目给定一个排序链表,删除所有重复的元素使得每个元素只留下一个。 案例:给定 1->1->2,返回 1->2给定 1->1->2->3->3,返回 1->2->3分析链表的问题,因为是有序的所以判断一下当前节点的next节点的val值 和 当前节点的val值是否相等,相等则删除它的next节点,不相等则进行下一个节点的判断。代码/** * D...原创 2018-03-26 21:29:45 · 186 阅读 · 0 评论 -
LeetCode520. 检测大写字母
今天的很简单的很简单的,因为今天可能写不下去比较有难度一点儿的。。。呐,不能不写,就来个简单的练练手哈。题目给定一个单词,你需要判断单词的大写使用是否正确。我们定义,在以下情况时,单词的大写用法是正确的:全部字母都是大写,比如"USA"。单词中所有字母都不是大写,比如"leetcode"。如果单词不只含有一个字母,只有首字母大写, 比如 "Google"。否则,我们定义这个单词没有正确使用大写字母...原创 2018-04-15 21:36:55 · 1436 阅读 · 0 评论 -
LeetCode210.课程表 II
题目总共有 n 门课程需要参加,这些课被标号为 0 到 n-1 。有一些课程需要“前置课程”,比如如果你要上课程0,你需要先学课程1,我们用一个匹配来表示他们: [0,1]。给你课程的总数量和一些前置课程的需求,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。例如:2, [[1,0]]总共有2门课程可供选择。要参加课程...原创 2018-03-27 22:39:53 · 896 阅读 · 0 评论 -
LeetCode257. 二叉树的所有路径
好多天没写算法了,好多天也不更了。。今天开始继续啊,加油!先来一个简单的二叉树练练手哈题目给定一个二叉树,返回从根节点到叶节点的所有路径。例如,给定以下二叉树: 1 / \2 3 \ 5所有根到叶路径是:["1->2->5", "1->3"]分析二叉树先序遍历一下,递归把节点值挨个加入就好了代码/** * Definition for a binar...原创 2018-04-10 15:41:53 · 2512 阅读 · 0 评论 -
LeetCode217.存在重复
题目给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数应该返回 true。如果每个元素都不相同,则返回 false。分析嗯。。。哈希表。。直接贴代码吧。代码class Solution { public boolean containsDuplicate(int[] nums) { Map<Integer,Integer&g...原创 2018-03-28 18:04:18 · 228 阅读 · 0 评论 -
LeetCode219.存在重复II
题目给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使 nums [i] = nums [j],并且 i 和 j 的绝对差值最大为 k。分析和217存在重复很像,多加一层判断,注意那种情况:[1,2,1,1] k=1 ,虽然第一个 1 和第三个第四个 1 都不符合条件,但是第三个和第四个 1 符合条件。代码class Solution { public bo...原创 2018-03-28 18:46:37 · 1960 阅读 · 0 评论 -
LeetCode127. 单词接龙
题目给出两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列,转换需遵循如下规则:每次只能改变一个字母。变换过程中的中间单词必须在字典中出现。例如,给出:beginWord = "hit"endWord = "cog"wordList = ["hot","dot","dog","lot","log"原创 2018-04-11 18:44:51 · 804 阅读 · 0 评论 -
LeetCode155. 最小栈
又是昨天的,这两天有点儿懒,栈的实现,很简单的。题目设计一个支持 push,pop,top 操作,并能在常量时间内检索最小元素的栈。push(x) -- 将元素x推入栈中。pop() -- 删除栈顶的元素。top() -- 获取栈顶元素。getMin() -- 检索栈中的最小元素。示例:MinStack minStack = new MinStack();minStack.push(-2);m...原创 2018-04-17 16:52:12 · 791 阅读 · 1 评论 -
LeetCode621. 任务调度器
今天哒,是看了半天解题报告做的。 那就来分析一下解题报告。点击打开链接题目给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。然而,两个相同种类的任务之间必须有长度为 n 的冷却时间,因此至少有连续...原创 2018-04-17 17:21:57 · 3590 阅读 · 5 评论 -
LeetCode198. 打家劫舍
题目你是一个专业的强盗,计划抢劫沿街的房屋。每间房都藏有一定的现金,阻止你抢劫他们的唯一的制约因素就是相邻的房屋有保安系统连接,如果两间相邻的房屋在同一晚上被闯入,它会自动联系警方。给定一个代表每个房屋的金额的非负整数列表,确定你可以在没有提醒警方的情况下抢劫的最高金额。分析简单的动态规划问题,题目意思是计算数组中 不相邻数字最大之和。比如 [ 1, 3, 4, 5, 3, 2 ] 应返回 1...原创 2018-04-22 11:52:16 · 1363 阅读 · 0 评论 -
LeetCode56. 合并区间
题目给出一个区间的集合,请合并所有重叠的区间。示例 1:输入: [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入: [[1,4],[4,5]]输出: [[1,5]]解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。分析首先对区间的...原创 2018-04-22 12:00:10 · 198 阅读 · 0 评论 -
LeetCode769. 最多能完成排序的块
题目数组arr是[0, 1, ..., arr.length - 1]的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。我们最多能将数组分成多少块?示例 1:输入: arr = [4,3,2,1,0]输出: 1解释:将数组分成2块或者更多块,都无法得到所需的结果。例如,分成 [4, 3], [2, 1, 0] 的结...原创 2018-04-23 20:46:21 · 1132 阅读 · 0 评论 -
LeetCode347. 前K个高频元素
今天继续哈,写的还是比较简单的一个题,哈希表和堆排序,要多多熟悉java的数据结构。题目给定一个非空的整数数组,返回其中出现频率前 k 高的元素。例如,给定数组 [1,1,1,2,2,3] , 和 k = 2,返回 [1,2]。注意:你可以假设给定的 k 总是合理的,1 ≤ k ≤ 数组中不相同的元素的个数。你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。分析看到给出一个...原创 2018-04-14 11:10:37 · 3133 阅读 · 0 评论 -
LeetCode130. 被围绕的区域
题目给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。示例:X X X XX O O XX X O XX O X X运行你的函数后,矩阵变为:X X X XX X X XX X X XX O X X解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何...原创 2018-04-24 14:39:58 · 1880 阅读 · 0 评论