数据结构与算法
相信天道酬勤的M1ng
这个作者很懒,什么都没留下…
展开
-
单周速通《剑指Offer》周二
矩阵中的路径 中等 、剑指Offer.14_I 剪绳子 中等 、剑指Offer.14_II 剪绳子II 中等 、剑指Offer.15 二进制中 1 的个数 简单 、剑指Offer.16 数值的整数次方 中等 、剑指Offer.17 打印从 1 到最大的 n 位数 简单 、剑指Offer.18 删除链表的节点 简单 、剑指Offer.19 正则表达式匹配 困难 、剑指Offer.20 表示数值的字符串 中等 、剑指Offer.21 调整数组顺序使奇数位于偶数前面 简单 、剑指Offer.22 链表中原创 2020-05-26 17:39:45 · 228 阅读 · 4 评论 -
刷题找工作《环形链表问题》通解
Floyd算法、链表成环、NO.141 环形链表 、NO.142 环形链表II 、NO.202 快乐数 、NO.287 寻找重复数原创 2020-05-26 11:42:09 · 347 阅读 · 0 评论 -
震惊!超级大牛开发者面试被拒!居然只是因为不会翻转二叉树?
NO.141 环形链表 简单 震惊!著名软件 Homebrew 的作者 Max Howell 在 面试 Google 被拒,竟然是因为不会这个!Google:我们 90% 的工程师都用你写的软件(Homebrew),但你没法在白板上翻转二叉树,所以滚蛋吧思路一:深度优先遍历 从根节点开始,交换左右子树,然后递归的交换左右子树的左右子树。终止条件是子树节点为空。public TreeNode invertTree(TreeNode root) { //节点为空终止 if (root原创 2020-05-26 11:37:37 · 1091 阅读 · 0 评论 -
单周速通《剑指Offer》周一
刷了有快三百道 LeetCode 了,听说找实习必刷《剑指Offer》,于是每天花一点时间把这套题速刷一遍。如果有和我一样的菜鸟,咱们可以一起组队刷题,相互监督打卡哦!!干就完了!!!奥利给!!!!!数组中重复的数字 简单 、二维数组中的查找 简单 、替换空格 简单 、从尾到头打印链表 简单 、重建二叉树 简单 、用两个栈实现队列 简单 、斐波那契数列 简单、青蛙跳台阶 简单 旋转数组的最小数字 简单 、矩阵中的路径 简单 剑指Offer.03 数组中重复的数字 简单思路一:HashTable原创 2020-05-25 11:23:35 · 468 阅读 · 0 评论 -
刷题找工作《打家劫舍问题》一文通解
NO.198 打家劫舍 简单 、 NO.213 打家劫舍II 中等、 NO.337 打家劫舍III 中等 NO.198 打家劫舍 简单思路一:动态规划 dp[i]数组的含义:到第 i 号房子可偷窃的最高金额。初始化:数组大小[nums.length+1]包含没有房子的情况,dp[0] = 0,dp[1]=nums[0] 即没有房子的时候最高金额 0 ,只有 1 个房子的时候,最高金额就是这个房子中的现金。状态转移:到第 i 号房子为止偷窃最高金额 = Max(到 i-1 号的最高金额,到 i-2原创 2020-05-23 16:35:15 · 208 阅读 · 0 评论 -
LeetCode——从前序与中序遍历序列构造二叉树
NO.105 从前序与中序遍历序列构造二叉树 中等 思路一:模拟 回想了一下学校老师上课讲的如何根据两个遍历序列还原出二叉树的:根据前序序列的第一个字符确定树的根,示例中的3。知道了3这个根,根据中序序列确定左右子树[9]是左子树、[15,20,7]是右子树。根据左子树前序序列第一个字符确定树的根:9。9的左右子树为null,左子树完毕。根据右子树前序序列第一个字符确定树的根:20。知道了20这个根,根据中序序列确定左右子树[15]是左子树、[7]是右子树。根据左子树前序序列第一个字符确定原创 2020-05-22 22:18:33 · 377 阅读 · 0 评论 -
LeetCode——颠倒二进制位&位1的个数
NO.190 颠倒二进制位 简单 、NO.191 位1的个数 简单 NO.190 颠倒二进制位 简单思路一:逐位颠倒 每次用 & 运算取出 n 的最低位,将 ans 左移一位后用 ^ 运算保存得到的最低位。每次将 n 右移一位。public int reverseBits(int n) { int ans = 0; for (int i = 0; i < 32; i++) { ans = (ans << 1) + (n & 1);原创 2020-05-22 17:00:03 · 200 阅读 · 0 评论 -
[LeetCode]——只出现一次的数字I&II&III
只出现一次的数字 简单、只出现一次的数字II 中等、只出现一次的数字III 中等 NO.136 只出现一次的数字 简单思路一:异或public int singleNumber(int[] nums) { int ans = 0; for (int num : nums) { ans^=num; } return ans;}时间复杂度:O(n) 空间复杂度:O(1)NO.137 只出现一次的数字II 中等思路一:按位统计 遍历数组中每个元素原创 2020-05-21 19:04:26 · 212 阅读 · 0 评论 -
LeetCode——课程表I&II
NO.207 课程表 中等 、NO.210 课程表 II 中等非常经典的拓扑排序问题 NO.207 课程表 中等思路一:拓扑排序 拓扑排序的总体思路选择 广度优先遍历+贪心 。通常拓扑排序有两个主要功能:得到一条拓扑序列,拓扑序列不唯一。判断一个有向图是否有环。实现上,用两个集合,分别保存每个节点入度的数量、每个节点的下一个后继节点。还需要一个队列,进行广度优先遍历。将没有前驱的节点(入度为 0 )入队,广搜每出队一个节点,就将该节点的所有后继邻接节点的入度 -1 ,如果入度减为 0原创 2020-05-21 19:00:52 · 224 阅读 · 0 评论 -
刷题找工作《买卖股票问题》一文通解
NO.121 买卖股票的最佳时机 简单 、NO.122 买卖股票的最佳时机II 简单 、NO.123 买卖股票的最佳时机III 困难 、NO.188 买卖股票的最佳时机IV 困难 NO.121 买卖股票的最佳时机 简单思路一:暴力法 没什么好说的,双重循环计算所有元素两两组合相减的结果,取最大。public int maxProfit(int[] prices) { int maxProfit=0; for (int i = 0; i < prices.length - 1;原创 2020-05-21 18:57:51 · 171 阅读 · 0 评论 -
LeetCode——对链表进行插入排序&排序链表
对链表进行插入排序 中等 、排序链表 中等 NO.147 对链表进行插入排序 中等思路一:插入排序 思路题目上已经给了,就是动手实现就行了。寻找需要插入排序的节点 next;从 [表头,next] 区间内寻找到最后一个小于等于 next 的节点 pre;将 next 节点插入到 pre 节点的后面。public ListNode insertionSortList(ListNode head) { ListNode dummy = new ListNode(Integer.MIN_原创 2020-05-21 18:55:04 · 188 阅读 · 0 评论 -
[LeetCode No.65]——什么是面向测试编程?看看本这道题就知道了!口区
有效数字 困难 没有get到这道题目的点,这样的题目很搞心态。尤其是看了作者的解答之后更懵逼了,作者使用了责任链的设计模式,从来没想到解算法题还能用到设计模式。大牛的思维方式就适合我不一样,解个算法题都能考虑到扩展性和复用性。思路一:暴力法按序遍历字符串,逐位判断是否合法。注意要去除首尾空格。这种方法就是比较恶心,很容易有考虑不到的情况。而且测试用例中有:".1"、".2"、"+.8"...原创 2020-03-14 17:06:43 · 686 阅读 · 0 评论 -
徒手挖地球二九周目
徒手挖地球二九周目文章目录徒手挖地球二九周目NO.64 最小路径和 中等NO.169 多数元素 简单NO.229 求众数II 中等NO.1071 字符串的最大公因子 简单NO.64 最小路径和 中等思路一:动态规划 我们要找最小路径和,一定是走数值较小的位置并且不往回走不绕路,又因为是从左上走到右下,所以每次都向右或者向下移动。dp数组的含义:dp[i][j]走到[i][j]位置的最小路...原创 2020-03-13 13:34:12 · 274 阅读 · 0 评论 -
徒手挖地球二八周目
徒手挖地球二八周目文章目录徒手挖地球二八周目NO.62 不同路径 中等NO.63 不同路径II 中等NO.543 二叉树的直径 简单NO.1013 将数组分成和相等的三个部分 简单NO.62 不同路径 中等思路一:动态规划 只能向下或向右,就是无法后退或者绕路且到达终点的步数是确定的。dp[][]数组的含义:dp[i][j]就是到到i行j列的位置有多少种走法。初始化:dp[0][0...原创 2020-03-11 18:19:05 · 180 阅读 · 0 评论 -
徒手挖地球二七周目
徒手挖地球二七周目文章目录徒手挖地球二七周目NO.60 第K个排列 中等NO.61 旋转链表 中等NO.121 买卖股票的最佳时机 简单NO.60 第K个排列 中等思路一:逆用康托展开 什么是康托展开式可以先从百度了解。本文直接从示例着手。利用康托展开求排列是第几个,例如"213"是n=3的全排列中的第几个?[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z...原创 2020-03-09 16:35:49 · 250 阅读 · 0 评论 -
徒手挖地球二六周目
徒手挖地球二六周目文章目录徒手挖地球二六周目NO.57 插入区间 困难NO.58 最后一个单词的长度 简单NO.59 旋转矩阵II 中等NO.322 零钱兑换 中等NO.57 插入区间 困难思路一:暴力法 先将intervals和新区间都输入到一个数组中,然后对数组中的区间进行合并得到结果。徒手挖地球二五周目题解中NO.56合并区间中详细描述了如何进行区间合并。public int[]...原创 2020-03-08 15:58:02 · 150 阅读 · 0 评论 -
徒手挖地球二五周目
徒手挖地球二五周目文章目录徒手挖地球二五周目NO.55 跳跃游戏 中等NO.56 合并区间 中等NO.88 合并两个有序数组 简单NO.994 腐烂的橘子 简单NO.55 跳跃游戏 中等思路一:贪心算法 NO.45跳跃游戏II的姊妹题,思路一样可以结合学习,题解参考徒手挖地球二三周目。每次都在本次跳跃范围内找到下一跳最远的位置。如果最后最远的都为都不能到结尾,则false。public...原创 2020-03-04 20:51:26 · 1516 阅读 · 0 评论 -
徒手挖地球二四周目
徒手挖地球二四周目文章目录徒手挖地球二四周目NO.225 用队列实现栈 简单NO.53 最大子序和 简单NO.206 翻转链表 简单NO.54 螺旋矩阵 中等NO.225 用队列实现栈 简单思路一:使用队列API 其实没有太搞明白这个题目的意思。。。leetcode打卡活动第一天题目。主要是push()方法每次将新加入元素x之前的元素都按序出队并重新入队,这样新元素x就在队头。然后po...原创 2020-03-02 19:37:30 · 233 阅读 · 0 评论 -
徒手挖地球二三周目
徒手挖地球二三周目文章目录徒手挖地球二三周目NO.45 跳跃游戏II 困难NO.51 N皇后 困难NO.52 N皇后II 困难NO.45 跳跃游戏II 困难思路一:贪心算法 nums[i]表示的可以跳入的最大范围,如果当前nums[i]所能跳到的范围不涉及重点,那么就在当前能跳到的范围内选择一个最优的点(可以跳出更远的范围的点),因为如果这个最优点都不能跳到终点,那么其他的点更不能跳到。...原创 2020-02-28 19:02:20 · 326 阅读 · 0 评论 -
徒手挖地球二二周目
徒手挖地球二二周目文章目录徒手挖地球二二周目NO.41 缺失的第一个正数 困难NO.42 接雨水 困难NO.41 缺失的第一个正数 困难思路一:两次遍历 第一次遍历将每个元素交换到其元素值对应的下标出,第二次遍历检查每个元素的值和其下标是否相等,如不相等则这个下标就是缺失的第一个正数。第一次遍历:将所有符合nums[i]大于0且小于length的元素交换到其值对应的下标位置,例如...原创 2020-02-26 17:53:30 · 209 阅读 · 0 评论 -
徒手挖地球二一周目
徒手挖地球二一周目文章目录徒手挖地球二一周目NO.37 解数独 困难NO.37 解数独 困难思路一:回溯法 就是模拟人解数独时的简单想法:人在解数独的时候要注意每一行、每一列、每一个子数独中哪些数字已经被使用过了;一行一行的进行填充,填充完一行就聚焦到下一行继续填充;如果一个单元格中不为空,则去下一个单元格;如果一个单元格为空,我们就看一下这个单元格所属的行、列、...原创 2020-02-24 15:40:00 · 350 阅读 · 0 评论 -
徒手挖地球二十周目
徒手挖地球二十周目文章目录徒手挖地球二十周目NO.32 最长有效括号 困难NO.32 最长有效括号 困难思路一:暴力法 遍历所有偶数长度的子串,得到最长的有效括号序列。但是此方法会超时。public int longestValidParentheses(String s) { if (s==null||s.equals(""))return 0; int maxLen=...原创 2020-02-23 16:42:42 · 172 阅读 · 0 评论 -
徒手挖地球十九周目
徒手挖地球十九周目文章目录徒手挖地球十九周目NO.30 串联所有单词的子串 困难NO.30 串联所有单词的子串 困难这道题要把每个单词看成整体,每个不同的单词看作是不同的字符,单词串就看成是特殊的字符串。注意:s中的单词未必是长度相等。words中可能存在相同的单词。思路一:暴力法 words中的单词长度都一样,大幅降低了这道题的难度,所以这个特点要充分利用。所以遍历s的每个子串,分别...原创 2020-02-22 17:14:34 · 180 阅读 · 0 评论 -
徒手挖地球十八周目
徒手挖地球十八周目文章目录徒手挖地球十八周目NO.23 合并K个排序链表 困难NO.25 K个一组翻转链表 困难NO.23 合并K个排序链表 困难思路一:逐一两两合并 将NO.21合并两个有序链表中的方法进行k-1次即可。public ListNode mergeKLists(ListNode[] lists) { if (lists==null||lists.length==...原创 2020-02-17 17:52:45 · 262 阅读 · 0 评论 -
徒手挖地球十七周目
徒手挖地球十七周目文章目录徒手挖地球十七周目#NO.44 通配符匹配 困难这道题和NO.10正则表达式匹配看起来很像,正则匹配的题解可以参考徒手挖地球十六周目中的记录。这两道题目的区别在于’*‘的处理不同,正则中的星号是星号前的字符可以出现0次、1次或多次,而本题中通配符中的星号则是可以匹配任意字符。但是正则中的’.‘和通配符中的’?'作用是一样的。所以说这道题的难点一样是对于’*'...原创 2020-02-14 20:35:58 · 232 阅读 · 0 评论 -
徒手挖地球十六周目
徒手挖地球十六周目文章目录徒手挖地球十六周目NO.10 正则表达式匹配 困难NO.10 正则表达式匹配 困难思路一:回溯法 这种匹配思路其实就是不断地减掉s和p的可以匹配首部,直至一个或两个字符串被减为空的时候,根据最终情况来得出结论。如果只是两个普通字符串进行匹配,按序遍历比较即可:if( s.charAt(i) == p.charAt(i) )如果正则表达式字符串p只有一种"...原创 2020-02-12 21:06:58 · 762 阅读 · 0 评论 -
徒手挖地球十五周目
徒手挖地球十五周目文章目录徒手挖地球十五周目NO.4 寻找两个有序数组的中位数 困难NO.4 寻找两个有序数组的中位数 困难思路一:暴力法 直接合并两个有序数组,然后根据奇偶性找到中位数。但是这种笨办法不能满足时间复杂度的要求。public double findMedianSortedArrays(int[] nums1, int[] nums2) { int[] num=ne...原创 2020-02-11 17:25:09 · 193 阅读 · 0 评论 -
徒手挖地球十四周目
徒手挖地球十四周目文章目录徒手挖地球十四周目NO.48 旋转图像 中等NO.49 字母异位词分组 中等NO.50 Pow(x,n) 中等NO.48 旋转图像 中等思路一:先转置矩阵,再列对换 很好理解先将图像矩阵转置,再将转置之后的图像矩阵列对换就得到了顺时针旋转90°的效果。把示例在纸上模拟一下就很清楚了:public void rotate(int[][] matrix) { ...原创 2020-02-09 15:45:39 · 397 阅读 · 0 评论 -
徒手挖地球十三周目
徒手挖地球十三周目文章目录徒手挖地球十三周目NO.40 组合总和 II 中等NO.43 字符串相乘 中等NO.46 全排列 中等NO.47 全排列 II 中等NO.40 组合总和 II 中等本题和徒手挖地球十二周目中组合总和的思路一样只是少量变化,区别在于本题candidate数组中的元素不能重复使用(只能使用一次),本题数组中有重复元素。思路一:深度优先遍历,回溯法 从39题组合总和的...原创 2020-02-06 18:54:23 · 160 阅读 · 0 评论 -
徒手挖地球十二周目
徒手挖地球十二周目文章目录徒手挖地球十二周目NO.36 有效数独 中等NO.38 外观数列 简单NO.39 组合总数 中等NO.36 有效数独 中等思路一:暴力法 依次遍历完每一行,每一列,每一个一个子数独。public boolean isValidSudoku(char[][] board) { if (board==null||board.length<9...原创 2020-02-03 20:53:09 · 279 阅读 · 0 评论 -
徒手挖地球十一周目
徒手挖地球十一周目文章目录徒手挖地球十一周目NO.33 搜索旋转排序数组 中等NO.34 在排序数组中查找元素的第一个和最后一个位置 中等NO.35 搜索插入位置 简单NO.33 搜索旋转排序数组 中等根据题目的时间复杂度O(log n),可以排除遍历的想法(遍历的时间复杂度O(n)),需要用二分查找。思路一:二分法 二分查找一个很关键的点就是数组必须是有序的,本题的思路就是先找到有序的...原创 2020-01-28 15:20:35 · 189 阅读 · 0 评论 -
徒手挖地球十周目
徒手挖地球十周目文章目录徒手挖地球十周目NO.28 实现strStr() 简单NO.29 两数相除 中等NO.31 下一个排列 中等NO.28 实现strStr() 简单[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IskeVZ37-1578224361536)(https://s2.ax1x.com/2019/12/30/llALfs.png)]吐槽一下:...原创 2020-01-05 19:41:11 · 257 阅读 · 0 评论 -
徒手挖地球九周目
徒手挖地球九周目文章目录徒手挖地球九周目NO.22 括号生成 中等NO.24 两两交换链表中的节点 中等NO.26 删除排序数组中的重复项 简单NO.27 移除元素 简单NO.22 括号生成 中等思路一:暴力法 1. 将2*n个括号的序列全部得到。2. 同时判断其是否为有效序列。如果是则加入结果集。 List<String> res=new ArrayList<>...原创 2020-01-01 21:24:02 · 353 阅读 · 0 评论 -
徒手挖地球八周目
徒手挖地球八周目文章目录徒手挖地球八周目NO.19 删除链表的倒数第N个节点 中等NO.20 有效括号 简单NO.21 合并两个有序链表 简单NO.19 删除链表的倒数第N个节点 中等思路一:两次遍历 第一次遍历得到链表的长度L,第二次遍历删除第(L-N+1)个元素。public ListNode removeNthFromEnd(ListNode head, int n) { ...原创 2019-12-27 16:06:18 · 209 阅读 · 0 评论 -
徒手挖地球七周目
徒手挖地球七周目文章目录徒手挖地球七周目NO.16 最接近的三数之和 中等NO.17 电话号码的字母组合 中等NO.18 四数之和 中等NO.16 最接近的三数之和 中等思路一:暴力破解法 用list保存所有的三数之和的情况,然后找出最接近target的数:public int threeSumClosest(int[] nums, int target) { int l...原创 2019-12-25 16:54:12 · 312 阅读 · 0 评论 -
徒手挖地球六周目
徒手挖地球六周目文章目录徒手挖地球六周目NO.13 罗马数字转整数 简单NO.14 最长公共前缀 简单NO.15 三数之和 中等NO.13 罗马数字转整数 简单思路一:哈希表 1.用一个hash表把所有罗马数字和阿拉伯数字相互匹配的特殊值作为键值对存储起来,例如"M,1000"、“CM,900”、“D,500”、“CD,400”。。。2.然后将字符串逐步分割并去hash表进行查询匹配,因...原创 2019-12-18 17:38:22 · 147 阅读 · 0 评论 -
徒手挖地球五周目
徒手挖地球五周目文章目录徒手挖地球五周目NO.9 回文数 简单NO.11 盛最多水的容器 中等NO.12 数字转罗马数字 中等NO.9 回文数 简单思路一:字符串法 最简单的解法就是直接将数字转换为字符串s,然后将字符串翻转得到re,最后判断s和rs是否相等,相等则是回文。public boolean isPalindrome(int x) { String rs = new S...原创 2019-12-17 17:10:30 · 179 阅读 · 0 评论 -
徒手挖地球四周目
徒手挖地球四周目文章目录徒手挖地球四周目NO.6 Z字形变换 中等NO.7 整数反转 简单NO.8 字符串转换整数 (atoi) 中等NO.6 Z字形变换 中等[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B4YvB8hR-1576226460554)(https://s2.ax1x.com/2019/12/10/QDB5TA.png)]思路一:按列写,按行...原创 2019-12-13 16:41:20 · 209 阅读 · 0 评论 -
徒手挖地球三周目
徒手挖地球三周目NO.5 最长回文子串 中等思路一:暴力法 用两个for循环划分出所有子串,并依次判断划分出的子串是否为回文,如果是回文并且子串长度大于ans当前记录的值,就更新ans。public String longestPalindrome(String s) { String ans=""; int len=0; for (int i=0;i<s.l...原创 2019-12-13 16:40:37 · 225 阅读 · 0 评论 -
徒手挖地球二周目
徒手挖地球二周目NO.3 无重复字符的最长子串 中等[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K8phmhH7-1575735476645)(https://s2.ax1x.com/2019/12/05/Q8Z9it.png)]思路一:暴力法 先双层for循环划分出所有子串并依次进行是否含有重复子符的判断,如果不含重复字符且子串长度大于当前count所记录...原创 2019-12-08 00:18:45 · 168 阅读 · 0 评论