算法
于对对
这个作者很懒,什么都没留下…
展开
-
2021-07-22 有限自动状态机示例
有限自动状态机说明大多数介绍有限自动状态机的帖子都是写了原理,那这个原理怎么落地呢。我找了一个简单易于理解的示例写一下。说明有限自动机有3个部分:1,当前状态,2,当前输入,3,当前状态对应的当前输入,所应该执行的操作。其中,3会产生一个新的状态1。对应一个新的输入2。从而实现循环举例:一个状态:[x,y]。 初始状态为 [1,0]对应的输入:A,BA对应的操作:产生新的状态 [2 * x + y,y ]B对应的操作:产生新的状态 [x, 2 * y + x]图示如下:原创 2021-07-22 14:17:50 · 251 阅读 · 0 评论 -
算法:连续子数组的长度
题目:给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。要求:0和1在子数组中连续例如:nums = [0,1]输出 2nums = [0,1,0]返回 2nums = [0,0,1,1,0,1]返回 4解法:class Solution { // 子数组中的0,1要求连续 public int findMaxLength1(int[] nums) { int num1 = 0; // 前1个原创 2021-06-03 17:35:55 · 330 阅读 · 0 评论 -
连续的子数组和
题目:给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:子数组大小 至少为 2 ,且子数组元素总和为 k 的倍数。如果存在,返回 true ;否则,返回 false 。如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。解法:递归遍历(时间复杂度高,但递归这种基本操作还是要熟练掌握的)代码:(我刚开始一直写错,原因是没注意到子数组要是连续的)class Solution { pu原创 2021-06-02 19:36:53 · 202 阅读 · 0 评论 -
算法:单词规律
题目给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。示例1:输入: pattern = “abba”, str = “dog cat cat dog”输出: true分析其实就是对应位置,pattern 对应位置的字符相同,则 str 对应位置的字符串也相同。代码class Solution { public bool原创 2020-12-16 20:38:20 · 149 阅读 · 0 评论 -
算法:字母异位词分组
题目给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出:[[“ate”,“eat”,“tea”],[“nat”,“tan”],[“bat”]]本题很明显是用 hash 来实现的。只是怎么做可能有一点点绕吧String 转为 char[]排序,再转为string将结果作为 map 的key, 转换前的 string 放入 list中,作为 ma原创 2020-12-14 20:32:50 · 124 阅读 · 0 评论 -
算法:649. Dota2 参议院
题目Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:禁止一名参议员的权利:参议员可以让另一位参议员在这一轮和随后的几轮中丧失所有的权利。宣布胜利: 如果参议员发现有权利投票的参议员都是同一个阵营的,他可以宣布胜利并决定在游戏中的有关变化。给定一个字符串代表每个参议员的阵营。字转载 2020-12-11 21:00:58 · 105 阅读 · 1 评论 -
算法:柠檬水找零
题目在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。注意,一开始你手头没有任何零钱。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。输入:[5,5,5,10,20]输出:true解释:前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。第 4 位顾客那原创 2020-12-10 21:39:22 · 151 阅读 · 0 评论 -
算法:相同的树
题目给定两个二叉树,编写一个函数来检验它们是否相同。遍历即可,左边的树左边的树,右边的树右边的树,如果不相等则返回false。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = v原创 2020-12-08 20:30:29 · 91 阅读 · 0 评论 -
算法:杨辉三角
题目根据数字 numRows, 生成 numRows 行的杨辉三角[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],]思路,杨辉三角只有第一行和第二行比较特殊,其他行都是1…1,中间由上一行的两个数相加获得。代码class Solution { public List<List<Integer>> generate(int numRows) { LinkedList<List<Integer&原创 2020-12-06 22:33:30 · 145 阅读 · 0 评论 -
算法:分割数组为连续子序列
题目leetcode659https://leetcode-cn.com/problems/split-array-into-consecutive-subsequences/给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 。如果可以完成上述分割,则返回 true ;否则,返回 false 。示例 1:输入: [1,2,3,3,4,5]输出: True解释:你可以分割出这样两个连续子序列 :转载 2020-12-05 00:35:02 · 211 阅读 · 0 评论 -
算法:计数质数的数量
题目统计所有小于非负整数 n 的质数的数量。思路质数的百度解释:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。创建一个数组,长度为n,填充为1.首先2是质数,从2开始,2的所有倍数都标记为0然后计算下一个,3,将3的所有倍数都标记为0重复上述步骤最后统计数组中,从下标为2开始,统计 1 的数量即可代码class Solution { public int countPrimes(int n) { int[] isPrime = new i原创 2020-12-03 20:44:08 · 275 阅读 · 0 评论 -
算法:在排序数组中查找元素的第一个和最后一个位置
题目给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。代码class Solution { public int[] searchRange(int[] nums, int target) { // 初始化返回值 int[] res = new int[]{-1,-1}; int count=0; // 这个count代原创 2020-12-02 23:21:28 · 278 阅读 · 0 评论 -
算法:上升下降字符串
连着熬了几个夜上线,实在没时间过来,今天终于上去了题目给你一个字符串 s ,请你根据下面的算法重新构造字符串:从 s 中选出 最小 的字符,将它 接在 结果字符串的后面。从 s 剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它 接在 结果字符串后面。重复步骤 2 ,直到你没法从 s 中选择字符。从 s 中选出 最大 的字符,将它 接在 结果字符串的后面。从 s 剩余字符中选出 最大 的字符,且该字符比上一个添加的字符小,将它 接在 结果字符串后面。重复步骤 5 ,直到你没法从原创 2020-11-26 17:49:03 · 100 阅读 · 0 评论 -
算法:有效的字母异位词
题目判断两个字符串s和t,是不是字母异位词。字符串只包含小写字母也就是说,s的所有字母和t都一样,只是位置不同。例如:输入: s = “anagram”, t = “nagaram”输出: true解题这道题呢,就相对简单些了。因为题目中说了字符串都是小写字母,那就可以用26个字母的数组来存放字符串的每个字母。新建数组 hex ,长度为26.1,遍历s,对应hex每个字符位置,+12,遍历t,对应hex每个字符位置,-13,遍历hex,判断是不是都为0,只要不是就返回false代码原创 2020-11-22 16:23:31 · 130 阅读 · 0 评论 -
算法:排序链表:归并排序
题目:给定链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。head = [4,2,1,3]输出:[1,2,3,4]解题1,最简单的算法,就是挨个遍历链表,将其加入数组,通过数组排序。但这样的空间复杂度比较高。2,我们学过归并排序。那就用归并排序来解题。概念:归并排序就是有 n 个数字:2,4,1,5,3…先两个两个的排序,再两组两组的排序。代码/** * Definition for singly-linked list. * public class Lis原创 2020-11-21 19:16:21 · 177 阅读 · 1 评论 -
算法:移动零
题目给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]代码class Solution { public void moveZeroes(int[] nums) { int i=0; int len=nums.length; while(i<len){ if (nums[i]==0){原创 2020-11-19 18:16:10 · 83 阅读 · 0 评论 -
算法:根据身高重建队列
题目:假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。注意:总人数少于1100人。示例输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]不会做的时候,先看看答案,对着答案画个图,也可以懂代码class Solution { pub转载 2020-11-16 20:47:03 · 72 阅读 · 0 评论 -
算法:数组的相对排序
题目给你两个数组,arr1 和 arr2,arr2 中的元素各不相同arr2 中的每个元素都出现在 arr1 中对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。解题int 数组排序可以用自定义排序函数的方式来实现此处对于自定义函数中,需要比较的两个对象t1、t2有4种情况。1,t1 和 t2 都在 arr2中2,t1 和 t2 都不在arr2中3,t1 在 arr2 中,t2不在原创 2020-11-14 15:08:17 · 253 阅读 · 0 评论 -
算法:奇偶链表
题目给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。思路其实就是调换单链表的顺序,把所有奇数节点放在前面,偶数节点放在后面代码/** * Definition for singly-linked list. * public class ListNode { * int val原创 2020-11-13 18:43:13 · 95 阅读 · 0 评论 -
算法:leetcode 514 自由之路
题目视频游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。给定一个字符串 ring,表示刻在外环上的编码;给定另一个字符串 key,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。最初,ring 的第一个字符与12:00方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 12:00 方向对齐,然后按下中心按钮,以此逐个拼写完 key 中的所有字符。旋转 ring 拼出 ke转载 2020-11-12 20:54:29 · 86 阅读 · 0 评论 -
算法:leetcode31. 下一个排列
会就偷着乐,不会就赶紧看看答案学起来,要不然做题干啥题目实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1过程本来还以为有啥技巧,想了半天没想到,一看答案,原来就是死算~……class Solution {转载 2020-11-10 20:41:15 · 55 阅读 · 0 评论 -
算法:最接近原点的 K 个点
题目我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。(这里,平面上两点之间的距离是欧几里德距离。)例如:输入:points = [[1,3],[-2,2]], K = 1输出:[[-2,2]]分析如题也就是说,求出前K个离 (0,0)最近的点。那就要排序。距离如何排序?先用勾股定理求出距离。ok,思路好了,接下来就是代码class Solution { public int[][] kClosest(int[][] poin原创 2020-11-09 18:58:47 · 550 阅读 · 0 评论 -
算法:根据数字二进制下 1 的数目排序
题目给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。请你返回排序后的数组。思路本题首先要将数字转变为二进制,然后再统计二进制中的1的数量。如果1的数量相同,则按数值的大小排列。所以本题的关键在于compare的重写代码class Solution { public int[] sortByBits(int[] arr) { Integer[] new原创 2020-11-07 17:55:26 · 317 阅读 · 0 评论 -
算法:插入区间
题目给出一个无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果重叠,则合并区间)。示例 1:输入:intervals = [[1,3],[6,9]], newInterval = [2,5]输出:[[1,5],[6,9]]思路1,先写一个方法,用于判断两个数组是否重叠,如果重叠,则返回合并后的数组。否则,返回哪个数组2相对于数组1 的位置。2,遍历二维数组,依次判断是否与数组2重叠,以及重叠的位置。直到没有重叠的位置。同时,将原创 2020-11-04 14:11:11 · 276 阅读 · 0 评论 -
算法:有效的山脉数组
题目:给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false。解释:就是说,数组A先递增,后递减。不可有相等的部分。思路:1,找出数组中的最大值2,0-最大值:递增3,最大值-数组结束:递减否则,返回falseclass Solution { public boolean validMountainArray(int[] A) { int a = 0; int index = 0; boolean res =原创 2020-11-03 22:27:22 · 163 阅读 · 0 评论 -
算法:求两个数组的交集
思路1,将两个数组分别排序2,同时遍历两个数组,将相同的数字放入set 集合3,将set 集合转换为 数组代码class Solution { public int[] intersection(int[] nums1, int[] nums2) { LinkedHashSet<Integer> res_set = new LinkedHashSet<Integer>(); Arrays.sort(nums1); Ar原创 2020-11-02 17:32:33 · 705 阅读 · 0 评论 -
算法:leetcode129 求根到叶子节点数字之和
题目:给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。输入: [1,2,3] 1 / \ 2 3输出: 25解释:从根到叶子节点路径 1->2 代表数字 12.从根到叶子节点路径 1->3 代表数字 13.因此,数字总和 = 12 + 13 = 25.解法:这道题,题意就是遍历二叉树,先遍历根节原创 2020-10-29 19:36:06 · 117 阅读 · 0 评论 -
算法: 二叉树前序遍历
首先,要明白什么是前序遍历。前序遍历在二叉树中的访问路径为:根节点 -》 左节点-》 右节点。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } *原创 2020-10-27 20:18:31 · 105 阅读 · 0 评论 -
算法:LeetCode1365. 有多少小于当前数字的数字
题目:https://leetcode-cn.com/problems/how-many-numbers-are-smaller-than-the-current-number/题解:这道题用暴力解法肯定是比较简单的 public int[] smallerNumbersThanCurrent(int[] nums) { int size = nums.length; int[] res = new int[size]; for (int i=0;i转载 2020-10-26 23:07:35 · 75 阅读 · 0 评论 -
算法:LeetCode845. 数组中的最长山脉
题目:https://leetcode-cn.com/problems/longest-mountain-in-array/今天的题目啊,依然是不那么好看明白。其实啊,就是对于一个数组 [2,1,4,7,3,2,5],找到其中的 先递增,再递减的子数组,并返回这类子数组的最大长度。如果没有这类子数组,则返回0例如[2,1,4,7,3,2,5]的最大 先递增,再递减的子数组为【1,4,7,3,2】,长度为5.好了,最大长度啊,最什么这种,看看能不能用动态规划解法。想要获得最大长度,就要先找到山顶。然转载 2020-10-25 18:15:11 · 128 阅读 · 0 评论 -
算法:leetcode1024. 视频拼接
题目:https://leetcode-cn.com/problems/video-stitching/分析:其实这道题,我只想说,这语文也太难懂了,看了半天晕晕乎乎不知道题目啥意思。其实题目意思是,给了一个二维数组 clips,一个 int 类型的 T问,能不能用二维数组,组成一个 一维数组,这个数组为[0,T],如果可以,返回需要二维数组中的最少 子数组 数量。否自返回-1代码: public int videoStitching(int[][] clips, int T) {转载 2020-10-24 18:26:27 · 341 阅读 · 0 评论 -
算法:判断是否回文链表
题目:判断一个链表是否回文链表回文链表的特点是从中间分开,往两边完全对称。步骤:1,找到回文链表的中间节点2,翻转后半段链表3,从头部开始,与翻转后的后半段链表比较。代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Soluti原创 2020-10-23 18:15:28 · 97 阅读 · 0 评论 -
算法:长按键入
题目:输入 name时。按键可能会被长按,导致字符可能被输入 1 次或多次。检查键盘输入的结果字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。分析其实这个题目,就是比较两个字符串,一共有3种情况。初始化两个指针 i,j分别指向name 和 typed的01,字符串相同,则 i 和 j 同时 +12,字符串不同,但 typed 对应 j 位置的字符串和 j-1 位置的字符串相同,则 j+13,其他情况,直接跳出循环。返回 false遍历完字原创 2020-10-21 20:53:12 · 219 阅读 · 0 评论 -
算法:重排链表
题目给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。思路单单用列表来做,需要不停的遍历,去获取最后一个节点。那有没有办法,不用这样呢?所以就想到了数组,数组是直接可以通过下标来获取节点的。1,将链表节点都加入到数组中2,用两个指针,一个从头部开始向后,一个从尾部开始向前。代码/** * Definition for singly-linked list原创 2020-10-20 21:04:51 · 133 阅读 · 0 评论 -
算法:比较含退格的字符串
题目给定 S 和 T 两个字符串,其中,#表示退格符,也就是向前删除一个字符。判断 S 和 T 是否相同。思路1,遍历两个字符串,遇到非#,则加入一个队列,遇到#,则从队列尾部删除一个元素。2,最后比较两个队列的元素是否相同代码class Solution { public boolean backspaceCompare(String S, String T) { int lenS = S.length(); int lenT = T.length()原创 2020-10-19 23:50:22 · 340 阅读 · 0 评论 -
算法:删除链表的倒数第N个节点
题目给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。保证用一次扫描实现。例如:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.分析要删除如下倒数第二个节点定义两个指针,first和second之间相差n,所以当first为最后一个节点时,second就是要删除节点的上一个节点。此时 second.next = second.next.next 即可删除目标节点。原创 2020-10-18 18:52:43 · 209 阅读 · 0 评论 -
算法:N皇后二
题目:leetcode 52题。在 n×n 的国际象棋棋盘上,放置n个皇后。有几种方法,可以使得n个皇后不能互相攻击。在国际象棋中,皇后可以如图的4个方向。解法:回溯法。遍历n,定义一个行的数组 columns,用于保存已有皇后的行定义一个左斜线的数组 left_line,用于保存已有皇后的左斜线定义一个右斜线的数组 right_line,用于保存已有皇后的右斜线对于一列中的每一个数值i,判断i的行,左斜线,右斜线是否已存在上述3个数组中。如果存在,则继续。否则,将其存入对应的数组转载 2020-10-17 21:58:38 · 746 阅读 · 0 评论 -
算法:有序数组的平方
题目给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求按递增顺序排序。代码class Solution { public int[] sortedSquares(int[] A) { int len = A.length; int[] res = new int[len]; for (int i=0;i<len;i++){ int temp = A[i]*A[i];原创 2020-10-16 20:38:33 · 164 阅读 · 0 评论 -
算法:填充每个节点的下一个右侧节点指针
题目给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。解题广度优先思路,一层一层的遍历。遍历的同时,将每个节点的下一个节点设定为next节原创 2020-10-15 21:15:42 · 77 阅读 · 0 评论 -
算法:查找常用字符
题目:给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。你可以按任意顺序返回答案。例如输入:[“bella”,“label”,“roller”]输出:[“e”,“l”,“l”]解释:输入的例子中,e在所有字符串中出现了1次,l 出现了2次分析这道题,其实就是统计每个字母在每个字符串中出现的次数,然后选最少的次数。例如,例如a,在所有字符原创 2020-10-14 22:37:42 · 94 阅读 · 0 评论