算法
rookieWai
这个作者很懒,什么都没留下…
展开
-
【算法笔记】十大排序算法(Java实现)
冒泡排序()时间复杂度O(N2)算法思想与分析针对一个数组序列,从前到后相邻的元素两两比较,如果前面的元素大于后面的元素则交换位置,比完最后两个元素后,数组中最大的元素就到了末尾;然后再将末尾的元素排除,前面的所有元素再进行一次上述的比较交换方式,第二大的元素就到了原数组倒数第二的位置;按照此方式继续进行下去,最后就形成了一个有序序列。数组大小为n第一趟从第一个元素开始,比较两相邻元素,前面大于后面则交换位置,一直到最后两个元素比较完,一共需要比较n-1次第二趟从第一个元素开始,一直比较到倒原创 2021-05-11 17:58:52 · 194 阅读 · 2 评论 -
【算法笔记】平衡二叉树
平衡二叉树问题给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。问题分析代码原创 2021-05-11 16:50:41 · 113 阅读 · 0 评论 -
【算法笔记】完全二叉树的节点个数
完全二叉树的节点个数问题给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。递归法迭代法...原创 2021-05-11 16:35:16 · 759 阅读 · 0 评论 -
【算法笔记】对称二叉树
对称二叉树问题给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。问题分析这里的镜像对称也就根节点的左右两子树对称,可以通过分别遍历这两个子树然后比较对应值是否相等就行。通过哪种遍历方式呢?后序遍历,从图中可以看出镜面对称比较的是两子树的同外侧和同内侧,也就是从左子树最左的节点和右子树最右的节点开始,再比较左子树最右的节点和右子树最左的节点。所以左子树的遍历顺序是左右中,右子树的遍历顺序是右左中。这里采用后序遍历的递归法递归三要素:参数和返回值原创 2021-05-10 15:16:09 · 139 阅读 · 0 评论 -
【算法笔记】反转二叉树
反转二叉树问题翻转一棵二叉树。示例:输入:输出:问题分析原创 2021-05-10 09:05:16 · 3251 阅读 · 0 评论 -
【算法笔记】二叉树的层序遍历
二叉树的层序遍历原创 2021-05-09 17:23:43 · 74 阅读 · 0 评论 -
【算法笔记】二叉树的遍历
二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历原创 2021-05-09 16:24:15 · 110 阅读 · 0 评论 -
【算法笔记】逆波兰表达式求值
逆波兰表达式求值问题根据逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。示例 :输入:tokens = [“2”,“1”,"+",“3”,"*"]输出:9解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9问题分析问题...原创 2021-05-06 22:34:09 · 280 阅读 · 0 评论 -
【算法笔记】有效的括号&&删除字符串中的所有相邻重复项
有效的括号删除字符串中的所有相邻重复项原创 2021-05-06 22:32:24 · 235 阅读 · 0 评论 -
【算法笔记】栈实现队列&&队列实现栈
栈实现队列队列实现栈原创 2021-05-06 21:55:34 · 63 阅读 · 0 评论 -
【算法笔记】滑动窗口最大值
滑动窗口最大值问题给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。问题分析可使用单调队列解决问题(java中使用LinkedList来实现单调队列),队列从头到尾是从大到小的,那么队头元素就是需要返回的最大值,只需每次让队头弹出就行。当滑动窗口移动时,我们需要弹出在窗口外的元素,因为是按大小顺序入的队,所以队首元素不一定是需要弹出的元素,如何解决呢?其实没有必要将原创 2021-05-06 18:18:02 · 260 阅读 · 0 评论 -
【算法笔记】三数之和
三数之和问题给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。问题分析如果只寻找满足条件的三元组其实是很容易的,我们可以分步操作,先计算两数之和,在判断是否有第三个数加上满足和为零,记录满足条件的三元组,但是这样会产生很多重复的三元组,所以需要对三元组进行去重,一般的方法处理会显得非常繁杂,不好操作。这里使用双指针是比较容易操作的基本操作流原创 2021-04-23 19:45:58 · 5738 阅读 · 1 评论 -
【算法笔记】赎金信
赎金信问题给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)你可以假设两个字符串均只含有小写字母。问题分析这道题的意思就是让我们判断字符串a是否能由字符串b中的字符构成。简单的处理方式就是通原创 2021-04-22 22:28:10 · 125 阅读 · 0 评论 -
【算法笔记】四数相加
四数相加问题给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。问题分析看过这道题目后,第一反应就是找到四个数组所有的组合方式,判断相加是否为零,是则保存结果,这种做法的时间复杂度非常大,显然是不可原创 2021-04-22 22:05:45 · 946 阅读 · 0 评论 -
【算法笔记】两数之和
两数之和问题给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。暴力解法可直接使用两个for循环遍历数组元素,找到两个和为目标值的元素 public int[] twoSum(int[] nums, int target) { for (int i=0;i<nums.length;i++){原创 2021-04-22 21:36:02 · 74 阅读 · 0 评论 -
【算法笔记】两个数组的交集|快乐数
j原创 2021-04-20 20:35:54 · 193 阅读 · 0 评论 -
【算法笔记】环形链表
环形链表问题原创 2021-04-21 18:01:48 · 137 阅读 · 0 评论 -
【算法笔记】设计链表
设计链表问题设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点原创 2021-04-21 17:16:44 · 192 阅读 · 0 评论 -
【算法笔记】反转链表
反转链表问题反转一个单链表。问题分析最最直接的做法就是创建一系列新节点,然后按顺序把原来链表的值赋值给它们,后面的结点依次指向前面的结点就完事了。但是这种做法浪费空间内存,如果我们直接在原链表上进行反转就可以大大节省空间内存。简单来说就是将原链表的next指针的指向反转方向,就可以实现链表的反转。实现next指针反转的操作定义两个指针per、post,两个指针在链表中相邻,per在前,post在后(注意:这里的前后是按原链表的指向,左边是前,右边是后)post.next=pre; 实现pos原创 2021-04-21 11:53:53 · 83 阅读 · 0 评论 -
【算法笔记】反转字符串
反转字符串问题给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-string-ii著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。...原创 2021-04-14 21:40:56 · 159 阅读 · 1 评论 -
【算法笔记】螺旋矩阵
螺旋矩阵问题给你一个正整数n ,生成一个包含1到 n2 所有元素,且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix。问题分析当n=3是,是一个3x3正方形矩阵整个生成过程就是从左到右,从上到下,从右到左,从下到上,采用循环分步操作就很容易实现。但是需要注意很多问题:(1)拐角问题从图中可以看出有很多重合的地方,就是每一个拐角,想要处理好问题必须先解决拐角,也就是每一步的边界问题。可采取每一到达拐角处就进入下一步,让下一步来处理这个拐角,比如从左到右是1到2,到3时就让原创 2021-04-13 10:21:02 · 1189 阅读 · 1 评论 -
【算法笔记】有效的字母异位词
有效的字母异位词问题给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。你可以假设字符串只包含小写字母。问题分析简单来说就是判断两个字符串中所有拥有的字母是否相同,所以首先排除长度不等的字符串,然后再做判断。最直接的方法就是采用两个for循环,一个外循环遍历s字符串,一个内循环遍历t字符串,通过将s字符串每个字符与t中每个字符对比,如果能找到对应相等的字母,就返回true,但是问题中没有说不能有重复的字母,如果采用这种方法我们还需要对重复的字母进行处理,而且时间复原创 2021-04-12 22:54:57 · 396 阅读 · 0 评论 -
【算法笔记】移除链表元素
移除链表元素问题给你一个链表的头节点head和一个整数val ,请你删除链表中所有满足Node.val == val的节点,并返回新的头节点 。问题分析一个很简单的链表删除操作,通过头结点不断向后面的结点移动,比较每一个结点是否等于val,是就执行链表的删除操作。原链表直接解决问题我们需要注意的是头结点的删除方式和其他结点的不同删除头结点:head=head.next 直接让头结等于下一个节点删除非头结点(A.next):A.next=A.next.next 该节点的上一个节点的指原创 2021-04-11 17:26:15 · 294 阅读 · 2 评论 -
【算法笔记】长度最小的子数组
长度最小的子数组问题给定一个含有n正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组[numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。暴力解法简单理解就是找任意连续的子数组的和,通过双重循环就可以实现,最外层循环控制子数组的起始位置,内存循环控制子数组的结束位置,判断以每一个起始位置能满足条件的最短数组,最终获得本题的答案。时间复杂度为O(n2)。具体代码原创 2021-04-10 22:02:15 · 175 阅读 · 0 评论 -
【算法笔记】分割回文串
分割回文串问题给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。问题分析对字符串的切割,就相当于把所有字符拿出来,按照原本字符的次序对其进行组合,是一种特殊的组合方式,所以可以看做是回溯问题,在回溯的基础上,我们还需要进行回文判断。所有回溯问题都可以抽象为树结构,是在一棵树上的深度优先遍历,那么在这里我们先画出一个简单的树结构,再进一分析问题。然后进行我们回溯的三个步骤:1.回溯函数的终止条件原创 2021-04-08 17:28:49 · 1707 阅读 · 0 评论 -
【算法笔记】分发饼干
分发饼干问题假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。问题分析我们需要满足更多的孩子,按道理来说大饼干也可以给胃口小的孩子,但是这样剩下 的小饼干也许能满足小胃口的孩子,却不原创 2021-04-05 16:03:42 · 80 阅读 · 0 评论 -
【算法笔记】移除元素
移除元素问题给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。暴力解决这是一个很简单的数组问题,我们只需要遍历数组寻找等于目标值的元素,如果找到了,那么就把这个元素后面的所有元素向前移动一位,整体分析下来采用一个两层循环嵌套就可以解决问题,一层遍历元素,一层更新元素。具体代码public cla原创 2021-04-04 20:16:25 · 124 阅读 · 0 评论 -
【算法笔记】组合总和
组合总和问题给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。问题分析本问题是一个组合然后求和的问题,本质上就是一个组合问题,找到总和等于目标值的组合,可判断为回溯问题,所有回溯问题都可以抽象为树结构,是在一棵树上的深度优先遍历,那么在这里我们先画出一个简单的树结构,再原创 2021-04-04 18:43:12 · 442 阅读 · 0 评论 -
【算法笔记】数组
数组问题给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。问题分析首先我画一个有序的数组从图中可以看出,目标值存在4种情况在数组所有元素之前等于数组中某一个元素插入数组中在数组所有元素之后分析完题目后,会发现这是一个很简单的查找问题,一般来说一个简单的for循环就能解决问题,下面我们来尝试一下 public int searchInsert(int[] nums, int原创 2021-04-03 17:21:27 · 57 阅读 · 0 评论 -
【算法笔记】组合
问题:给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。问题分析:纯组合问题,可判断为回溯问题,所有回溯问题都可以抽象为树结构,是在一棵树上的深度优先遍历,那么在这里我们先画出一个简单的树结构,便于我们理解算法的步骤。...原创 2021-04-03 16:48:47 · 102 阅读 · 0 评论 -
【算法笔记】最长公共子序列
问题给定两个字符串text1和text2,返回这两个字符串的最长公共子序列的长度。一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。分析...原创 2021-03-31 09:04:09 · 273 阅读 · 1 评论 -
【算法笔记】CoinChange
问题给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。解题思路本题是求最少的情况,最优解,可判断是动态规划问题,解决问题基本步骤为确定状态(开一个数组)db[i]:最少用多少个硬币才达到i元初始化和边界(1)0元时需要0个硬币,所以db[0]=0;(2)当i<0时:设为正无穷,通过初始化实现 ;也可采用将db中所有元素赋值为amoun原创 2021-03-29 19:08:00 · 427 阅读 · 0 评论 -
【算法笔记】冒泡排序
冒泡排序时间复杂度O(N2)算法思想与分析针对一个数组序列,从前到后相邻的元素两两比较,如果前面的元素大于后面的元素则交换位置,比完最后两个元素后,数组中最大的元素就到了末尾;然后再将末尾的元素排除,前面的所有元素再进行一次上述的比较交换方式,第二大的元素就到了原数组倒数第二的位置;按照此方式继续进行下去,最后就形成了一个有序序列。数组大小为n第一趟从第一个元素开始,比较两相邻元素,前面大于后面则交换位置,一直到最后两个元素比较完,一共需要比较n-1次第二趟从第一个元素开始,一直比较到倒数第二原创 2021-03-27 17:49:49 · 102 阅读 · 0 评论 -
【算法笔记】归并排序
归并排序平均时间复杂度O(NlogN)算法思想对于一个待排序的数组,我们可以先递归地将它分成两半分别排序,然后将结果归并起来。简单的说就是把一个数组分成两半,然后把这两半分别排好序,最后将这两部分合在一起进行排序,实际情况下,分成两部分数组的排序仍然是采用归并的方式,所以我们会使用到递归的思想来操作。原地归并的抽象方法前提是待排序数组的左右两部分已经有序(后面会通过递归来实现),此方法会将原数组所有的元素复制到一个辅助数组中,然后通过辅助对象把归并的结果放入原数组中。实现过程:代码/原创 2021-03-22 18:47:03 · 90 阅读 · 0 评论 -
【算法笔记】选择排序和插入排序
选择排序算法思想首先找到最小的元素,让它和数组的第一个元素交换位置,然后在剩下的元素中找到最小的和数组的第二个元素交换位置,如此往复,直到将整个数组排好序。原创 2021-03-19 15:55:19 · 142 阅读 · 0 评论