
算法
文章平均质量分 76
四五又十
这个作者很懒,什么都没留下…
展开
-
算法复盘 ~ 前缀和经典问题 ~ 连续的子数组和
连续的子数组和523. 连续的子数组和给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:子数组大小 至少为 2 ,且子数组元素总和为 k 的倍数。如果存在,返回 true ;否则,返回 false 。如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。输入:nums = [23,2,4,6,7], k = 6输出:true解释:[2,4] 是一个大小为 2 的子数组,并且和为 6 。思路一:原创 2021-06-02 21:48:27 · 546 阅读 · 0 评论 -
算法复盘 ~ 4的幂、多数元素、 盛最多水的容器
4 的幂给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x思路一:循环判断即可,最后看结果是否为小数class Solution { public boolean isPowerOfFour(int n) { double x = n; while(x > 1){ x /= 4; }原创 2021-05-31 20:44:20 · 570 阅读 · 0 评论 -
算法复盘~整数反转、字符串转整数
1. 整数反转给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)思想:想法①将数字转为字符串,然后将字符串反转接着转为整数,这样做有几个很难处理的点,例如将负数的处理,负号怎么处理、前置0怎么处理,不考虑溢出的话转为整数会去掉前置0、怎么判断溢出?当然字符串的反转这一块可以使用栈?新思路:对于整数x来说,使用x mod 1原创 2021-05-26 11:10:36 · 623 阅读 · 1 评论 -
0429-备战秋招算法-递归、回溯问题- 电话号码的字母组合、全排序、全排列(递归 + 剪枝)
1. 电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。输入:digits = "23"输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]思路:递归+回溯题目根据题意,本题就是一个排列题目,假设digits的长度是固定的,那么本题就很好做了,如果是长度为2那个两个for循环,如果为3那么三个for循环…问题就出在原创 2021-04-29 23:05:22 · 7630 阅读 · 0 评论 -
0422-算法复盘 -逆序对的归并排序写法剑指~Offer 51. 数组中的逆序对
1.数组中的逆序对在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。输入: [7,5,6,4]输出: 5思路1:很简单的思路,使用暴力,这里不推荐使用暴力因为时间复杂度为o(n2)思路2:在归并排序的基础上进行逆序对,因为归并排序总是会让部分有序,例如现在有[8,12,16],以及[9,26,55],对于这两个数组归并排序到了并的阶段,该如何求逆序对呢?考虑第一个数组每一个数对整个逆序对和的贡献对于第一个数8(index原创 2021-04-22 23:26:59 · 573 阅读 · 0 评论 -
0414-算法复盘 排序算法-冒泡排序、选择排序、插入排序、希尔排序、归并排序、堆排序、快速排序
1. 排序算法及时间复杂度分析1.1 冒泡排序思想:从无序队列的头部开始,进行两两比较,将最大的(最小的)元素放至队列的尾部for(int i = 0; i < nums.length; i++){ for(int j = 1; j < nums.length - i; j++){ if(nums[j] > nums[j - 1]){ int temp = nums[j]; nums[j] = nums[j + 1];原创 2021-04-14 11:48:17 · 604 阅读 · 1 评论 -
0411-算法复盘 最小生成树(Kruskal算法)、最短路径(Dijkdtra算法)、删除链表中的重复节点
1.最小生成树(Kruskal算法)一个有n户人家的村庄,有m条路连接着。村里现在要修路,每条路都有一个代价,现在请你帮忙计算下,最少需要花费多少的代价,就能让这n户人家连接起来。最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。例如解决最小生成树有两种解法:Kruskal算法:初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里,具体可以看下图一整个算法的流程是:先对所有边进行排序,每次选取权值最小的边选取到的边原创 2021-04-11 23:43:59 · 828 阅读 · 0 评论 -
0410-算法复盘-设计LRU缓存结构、并查集Union-Find算法(路径压缩递归、迭代)
1.设计LRU缓存结构LRU算法是指最近最久未使用,初次接触是在操作系统中,在虚拟内存,当内存空间不足时需要将一些段或者页淘汰出内存中,从而加载新的段页进来设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最少使用的项目。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是原创 2021-04-10 23:59:28 · 721 阅读 · 0 评论 -
0409-算法复盘 数组中相加和为0的三元组、寻找第k大、跳台阶、子数组的最大累加和问题
1. 数组中相加和为0的三元组给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。注意:三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c)解集中不能包含重复的三元组。例如,给定的数组 S = {-10 0 10 20 -10 -40},解集为(-10, 0, 10) (-10, -10, 20)输入[-2,0,1,1,2]返回值[[-2,0,2],[-2,1,1]]思路:由于不能包含重复的三元组,所以要去重,去重最原创 2021-04-09 23:45:08 · 196 阅读 · 0 评论 -
0408-算法复盘 合并区间、 矩阵的最小路径和、合并两个有序的数组、链表中倒数第k个节点、二叉树的z型遍历
1. 合并区间以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例 1:输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入:intervals原创 2021-04-08 23:40:02 · 611 阅读 · 0 评论 -
0407-算法复盘 最长公共子串、最长公共子序列、 最长回文子串
1.最长公共子串给定两个字符串str1和str2,输出两个字符串的最长公共子串题目保证str1和str2的最长公共子串存在且唯一。示例1输入"1AB2345CD","12345EF"输出"2345"思路:子串和子序列不同的是,子串是需要连续的,对付这种题目可以使用二维矩阵dp[i] [j] 如果str1(i) == str2(j) 那么dp[i] [j] = dp[i - 1] [j - 1] + 1 ,如果不相等则dp[i] [j] = 0例如:str=acbcbcef,str2=原创 2021-04-07 23:30:39 · 527 阅读 · 0 评论 -
0406-算法复盘-判断链表中是否有环、链表中环的入口、两数之和、找到字符串的最长无重复字符子串、 括号序列、二分查找
1. 判断链表中是否有环非开空间复杂度O(1)解法:直接使用Set容器,如果有重复节点值则判断当前有环,这个思路比较简单明确O(1)解法:使用两个指针,一个一次走两格快指针,一个慢一次走一格慢指针。在有环的情况下因为慢指针是一个一个走的所以快慢指针一定会相遇。有了这思路便可快速的判断出是否有环public class Solution { public boolean hasCycle(ListNode head) { if(head == null) return false原创 2021-04-07 12:28:01 · 375 阅读 · 2 评论 -
0405-算法复盘-最长不含重复子串的长度、反转链表、最小的k个数、约瑟夫环、两个栈实现队列
04051. 最长不含重复子串的长度剑指 Offer 48. 最长不含重复字符的子字符串请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke"原创 2021-04-05 23:41:35 · 182 阅读 · 2 评论 -
美团2021春招笔试题第10场前三题
收到了4月4号的美团春招笔试邀请,虽然我投的实习生,这几天赶紧把前几场的美团春招2021笔试题刷一刷,目标是搞懂前三题,第4题争取搞明白。第10场的题目前2题A了,但是第三题超时,都是使用常规的方法,思路超时也是在情理之中。。。算法太差劲1.淘汰分数某比赛已经进入了淘汰赛阶段,已知共有n名选手参与了此阶段比赛,他们的得分分别是a_1,a_2….a_n,小美作为比赛的裁判希望设定一个分数线m,使得所有分数大于m的选手晋级,其他人淘汰。但是为了保护粉丝脆弱的心脏,小美希望晋级和淘汰的人数均在[x,y]之间原创 2021-04-01 11:25:46 · 1313 阅读 · 1 评论 -
算法回顾--二叉树基础知识
二叉树的各种遍历递归遍历中序遍历:中序遍历的顺序是左根右,递归写法比较简单。直接贴上模板public void inorder(TreeNode root){ if(root == null) return; if(root.left != null) inorder(root.left); //当前位置即为操作,可以根据题意进行添加 if(root.right != null) inorder(root.right);}例如,lettcode94题遍历二叉树使用原创 2021-03-24 23:35:33 · 198 阅读 · 0 评论 -
知识扫盲--算法--排序算法
冒泡排序冒泡排序的核心思想是:从无序队列的头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)元素放在队列的尾部,从而成为有序队列的一部分冒泡排序维护两个for循环,第一个for循环控制次数,第二个for循环控制两两比较。,需要注意的是:冒泡排序从哪冒?一般来将都会从右边冒出,也就是说右边(队列的尾部)就是有序的队列public void bullleSort(int[] nums){ for(int i = 0;i < nums.length - 1;i++){ .原创 2021-03-22 23:30:03 · 153 阅读 · 0 评论