日记
hw_2020
这个作者很懒,什么都没留下…
展开
-
日記20200725
2020年07月25日优秀代码参考ID题目大致内容解题思想注意点151翻转字符串里的单词使用.trim().split("\s+")165比较版本号.split("\.");技巧:当一个已经遍历结束的话,我们将其赋值为 0. String num1 = i < nums1.length ? nums1[i] : "0";166分数到小数模拟除法的过程,a=被除数/除数,被除数更新为num=被除数-除数a, num=num10;一直循环直到nu原创 2020-08-02 09:22:39 · 104 阅读 · 0 评论 -
日記20200724
2020年07月24日优秀代码参考ID题目大致内容解题思想注意点127单词接龙方法一 广度优先搜索,方法二 双向广度优先搜索131分割回文串回溯137只出现一次的数字 II位运算常用方法积累类名方法名解释ArrayListindexOf(value)返回value值对应的索引值,ArrayListcopyOfRange(T[ ] original,int from,int to)将原数组original原创 2020-08-02 09:21:15 · 94 阅读 · 0 评论 -
日記20200712
2020年07月12日优秀代码参考ID题目大致内容解题思想注意点49字母异位词分组方法一 普通for循环加used数组,hashmap存string1中各个字符及其出现次数,再去循环,string2中各对应字符及其出现个数,最后hashmap中要是存在value不等于0的键值对,则说两个字符串不符合条件,false。方法二 映射,我们将每个字符串按照字母顺序排序,这样的话就可以把 eat,tea,ate 都映射到 aet。其他的类似。50Pow(x, n)fo原创 2020-08-02 09:20:41 · 93 阅读 · 0 评论 -
日記20200711
2020年07月09日优秀代码参考ID题目大致内容解题思想注意点12整数转罗马数字贪心,每次用最大的罗马数字来表示当前数29两数相除相减,可以相减的次数就是商-x 的补码怎么求?把 x 按位取反,末位加 1 。Java 中就是 ~x + 1 了,此时所存的就是 x 对应的那个负数,即它的相反数了。43字符串相乘常用方法积累类名方法名解释ArrayListindexOf(value)返回value值对应的索引值,原创 2020-07-12 19:01:19 · 100 阅读 · 0 评论 -
日記20200709
2020年07月09日优秀代码参考ID题目大致内容解题思想注意点198打家劫舍动态规划,和题213一致3无重复字符的最长子串滑动窗口,用两个指针和一个hashset。我们使用两个指针表示字符串中的某个子串(的左右边界)。其中左指针代表着上文中「枚举子串的起始位置」,而右指针即为上文中的 rk; 在每一步的操作中,我们会将左指针向右移动一格, 表示 我们开始枚举下一个字符作为起始位置,然后我们可以不断地向右移动右指针, 但需要保证这两个指针对应的子串中没有重复原创 2020-07-12 19:00:45 · 106 阅读 · 0 评论 -
日記20200708
2020年07月08日优秀代码参考ID题目大致内容解题思想注意点141环形链表使用hashset,加入节点,判断是否已经包含下一个节点。或者用双指针,fast走两步,slow走一步,如存在fash=slow则true160相交链表先两个指针A和B,同时指在两个链表同时往后走,假如A指向了null,此时B走几步到null,就是两个链表的相差节点个数。我们可以此时再新建指针C为长的链表头节点,和B一起往后走,当B到null了,又新建一个指针D为短链表的头节点。此时原创 2020-07-12 19:00:14 · 81 阅读 · 0 评论 -
日記20200707
2020年07月07日优秀代码参考ID题目大致内容解题思想注意点58最后一个单词的长度使用库函数split。或者直接从后面开始遍历67二进制求和将短的字符串你补零至两个字符串一样长,反转,从最左边开始计算。若carry+a+b>1,则Strinbuilder.append(carry+a+b-2),且carry=1。其他情况,直接append(carry+a+b)就可以了。最后判断一下carry是否还为1,是的话追加一个1。反转,toString返回.原创 2020-07-12 18:59:46 · 81 阅读 · 0 评论 -
日記20200706
2020年07月06日优秀代码参考ID题目大致内容解题思想注意点21合并两个有序链表递归迭代28实现 strStr()滑动窗口38外观数列递归迭代常用方法积累类名方法名解释ArrayListindexOf(value)返回value值对应的索引值,ArrayListcopyOfRange(T[ ] original,int from,int to)将原数组original,从下标from开始复制,复制到原创 2020-07-12 18:59:03 · 108 阅读 · 0 评论 -
日記20200703
2020年07月03日优秀代码参考ID题目大致内容解题思想注意点9回文数把数字转成string,再用StringBuilder的reverse方法反转一下,euqals判断是不是内容相同即可13罗马数字转整数使用hashmap存对应数值,将字符串转为字符数组,如果char[i-1]对应数值 < char[i]对应数字,则sum+=后者数值减前者的差值14最长公共前缀方法一 暴力。for循环,只需要遍历最短的字符串长度即可,扫面每个字符串的每一原创 2020-07-12 18:58:08 · 74 阅读 · 0 评论 -
日記20200630
2020年06月30日栈优秀代码参考ID题目大致内容解题思想注意点225用队列实现栈用两个队列就可以232用栈实现队列和225思路一样,用两个栈就可以71简化路径把字符串转化成字符数组,以"/“分割,先排除是不是当前目录”.“和空”",然后要是返回上一级,"…",则出栈,不然进栈。字符数组遍历完了,判断栈是不是空,是,返回"/",不然遍历栈中的元素,然后每个元素前加上"/",即fPath.append("/").append(p);, 返回原创 2020-07-01 20:23:16 · 89 阅读 · 0 评论 -
日記20200625
2020年06月25日数组多数投票算法(Majority Vote Algorithm)。给一个数组,其中含有N个非负元素,让你求出数组中出现次数超过一半的数字。(排序的时间复杂度一般来说是O(NlogN),那么有没有时间复杂度为n的算法呢? )设置一个计数器count和保存最多元素的变量majority,如果count==0,则将now的值设置为数组的当前元素,将majority赋值为1;反之,如果majority和现在数组元素值相同,则count++,反之count–;重复上述两步原创 2020-07-01 20:22:35 · 102 阅读 · 0 评论 -
日記20200624
2020年06月24日数组优秀代码参考ID题目大致内容解题思想注意点153寻找旋转排序数组中的最小值关键是需要找到旋转点。用二分法,终止条件是if (nums[mid] > nums[mid + 1]) { return nums[mid + 1]; }和if (nums[mid - 1] > nums[mid]) { return nums[mid]; }。需要注意的是,判断更新变量lo和hi的条件是if (nums[mid] >= nums[0])原创 2020-07-01 20:20:43 · 82 阅读 · 0 评论 -
日記20200623
2020年06月23日数组优秀代码参考ID题目大致内容解题思想注意点59螺旋矩阵 II使用和题54的思想就行只不过是在每次遍历时赋值即可,不过需要注意的是,遍历时的条件需要加上num<=n*n, 即赋值的数不能超过给定值n的平方73矩阵置零遍历原始矩阵,如果发现如果某个元素 cell[i][j] 为 0,我们将第 i 行和第 j 列的所有非零元素设成很大的负虚拟值(比如说 -1000000),最后,我们便利整个矩阵将所有等于虚拟值的元素设为 0。原创 2020-07-01 20:20:02 · 75 阅读 · 0 评论 -
日記20200622
2020年06月22日数组二分查找while用<还是<=,很难判断。题34用<。 int right = nums.length;时,用while (left < right),同时注意,需要right = mid,此时区间为[left, right),因为是左闭右开区间,所以right=mid也取不到mid。以上是对于搜索左右侧边界的二分查找。优秀代码参考ID题目大致内容解题思想注意点34在排序数组中查找元素的第一个和最后一个位置使用原创 2020-06-23 20:18:40 · 291 阅读 · 0 评论 -
日記20200621
2020年06月21日数组优秀代码参考ID题目大致内容解题思想注意点11盛最多水的容器可以暴力。优化,双指针。思想:当移动短板,那么面积一定小于或等于原来面积。15三数之和先将数组排序,然后遍历,当前数字nums[i], 如果nums[i]>0, 说明之后的数相加不可能为0,直接break;不>0, 给两个指针L=i+1, R=len-1.如果nums[i]+nums[L]+nums[R]==0, 加入结果集合。L++,R–, 继续遍历。注意排除原创 2020-06-23 20:18:12 · 58 阅读 · 0 评论 -
日記20200620
2020年06月20日链表优秀代码参考ID题目大致内容解题思想注意点82删除排序链表中的重复元素 II初始化预先节点dummy,用一个pre指针,while循环直到到值相同的最后一个节点,pre.next指向该节点86分隔链表新建两个链表max和min,遍历原来链表,小于的放在min中,其余放在max,再把min的尾部指向max的头部,返回min的头部92反转链表 II双指针,p指在m-1位置,g指在m-2。将m位置的结点的指向g.next, 即原创 2020-06-23 20:17:38 · 73 阅读 · 0 评论 -
日記20200619
2020年06月19日链表优秀代码参考ID题目大致内容解题思想注意点257二叉树的所有路径递归2两数相加注意进位问题,当和大于等于10,sum=sum%10;carry=sum/10小技巧:对于链表问题,返回结果为头结点时,通常需要先初始化一个预先指针 pre,该指针的下一个节点指向真正的头结点head。使用预先指针的目的在于链表初始化时无可用节点值,而且链表构造过程需要指针移动,进而会导致头指针丢失,无法返回结果。19删除链表的倒数第N个节点先原创 2020-06-23 20:17:14 · 55 阅读 · 0 评论 -
日記20200618
2020年06月18日深度优先搜索 && 树优秀代码参考ID题目大致内容解题思想注意点207课程表方法一BFS,判断此课程安排图是否是 有向无环图(DAG)。对 DAG 的顶点进行排序,使得对每一条有向边 (u,v),均有 u(在排序记录中)比 v 先出现。亦可理解为对某点 v 而言,只有当 v 的所有源点均出现了,v才能出现。先生成入度表和邻接集合,随后遍历,当入度为0时,进入队列。当队列不为空时,出队,课程数-1。将其入度表对应位置减1,若入读等于原创 2020-06-23 20:16:25 · 96 阅读 · 0 评论 -
日記20200617
2020年06月17日深度优先搜索优秀代码参考ID题目大致内容解题思想注意点200岛屿数量方法一DFS。利用常用技巧方向数组,回溯4个方向上,当前元素是1且没被遍历过就可以使用dfs。方法二 BFS,搭配辅助队列使用。使用小技巧:把坐标转换为一个数字queue.addLast(i * cols + j);就不需要数组存了。常用方法积累类名方法名解释ArrayListindexOf(value)返回value值对应的索引值,Arr原创 2020-06-23 20:15:47 · 77 阅读 · 0 评论 -
日記20200616
2020年06月16日深度优先搜索DFS搭配递归,BFS要搭配队列。优秀代码参考ID题目大致内容解题思想注意点129求根到叶子节点数字之和方法一回溯。方法二分治。两种方法思想一样,实现手法上不一样而已。都是先不断找子节点,当一个节点的左右节点都为空时返回130被围绕的区域从边界的 O 做 DFS,然后把遇到的 O 都标记一下,这些 O 就是可以连通到边界的。然后把边界的所有的 O 都做一次 DFS ,把 DFS 过程的中的 O 做一下标记。最后我们原创 2020-06-23 20:15:14 · 69 阅读 · 0 评论 -
日記20200615
2020年06月15日深度优先搜索优秀代码参考ID题目大致内容解题思想注意点117填充每个节点的下一个右侧节点指针 II和116题一样。方法一的代码都一样常用方法积累类名方法名解释ArrayListindexOf(value)返回value值对应的索引值,ArrayListcopyOfRange(T[ ] original,int from,int to)将原数组original,从下标from开始复制,复制到上标to,生成原创 2020-06-21 11:16:06 · 76 阅读 · 0 评论 -
日記20200614
2020年06月14日深度优先搜索优秀代码参考ID题目大致内容解题思想注意点109有序链表转换二叉搜索树方法一 递归+指针。两个指针 slow_ptr 和 fast_ptr。slow_ptr 每次向后移动一个节点而 fast_ptr 每次移动两个节点。当 fast_ptr 到链表的末尾时 slow_ptr 就访问到链表的中间元素。对于一个偶数长度的数组,中间两个元素都可用来作二叉搜索树的根。当找到链表中的中间元素后,我们将链表从中间元素的左侧断开,做法是使用一个 pre原创 2020-06-21 11:15:33 · 60 阅读 · 0 评论 -
日記20200613
2020年06月13日深度优先搜索优秀代码参考ID题目大致内容解题思想注意点98验证二叉搜索树方法一 递归,设定上下界,左子树的上界是根节点的值,右子树的下界是根节点的值。方法二 中序遍历。只要再中序遍历中当前节点值大于前一个结点的值,则符合条件。用栈来模拟中序遍历。方法二的实现过程很巧妙105从前序与中序遍历序列构造二叉树方法一 递归,利用前序和中序的顺序特性。方法二 迭代 栈。我们用一个栈保存已经遍历过的节点,遍历前序遍历的数组,一直作为当前根节点的左子原创 2020-06-21 11:14:26 · 82 阅读 · 0 评论 -
日記20200612
2020年06月12日哈希表 深度优先搜索当判断set中是否有该数,或者判断次数有无与先前出现的重复,不需要contains方法,直接return add方法就行。因为set唯一,且add方法的返回值是是否添加成功。hashmap,如何当知道value的时候删除元素?不行。利用key是内容,value放该内容的个数。当检查到map中含有这个内容的时候,进行相应操作,随后需要删除这个内容。怎么删除呢?先是将value-1,再判断value==0,即map.get(key)==0,成立删除map.原创 2020-06-21 11:13:52 · 76 阅读 · 0 评论 -
日記20200611
2020年06月11日排序数组int[] nums 转成ArrayList方法:List nums=Arrays.asList(nums); //1. 使用Arrays.asList。1.1该方法返回的是基于数组的List视图(List view)。所以,这种方式是将数组转换为List的最快的方式。因为返回的只是视图,不需要多余的内存来创建新的List以及复制操作;1.2 该方法返回的List是长度是固定的(fixed),不是只读的。所以我们不能进行删除、添加操作,而可以使用set()方法进原创 2020-06-21 11:13:25 · 94 阅读 · 0 评论 -
日記20200610
2020年06月10日数组 && 排序线性结构:顺序存储:数组、栈、队列。在不排序的情况下,插入、删除、查找困难;在排序的情况下,插入、删除困难。 优点是利用索引查找方便;链式存储:链表(单链表、循环链表、双链表)。克服顺序存储的一些缺点,插入和删除方便,但是无论排序与否,查找仍旧困难;树结构:综合顺序和链式存储的优点,删除增加查找方便。比如二叉排序树(二叉查找树BST),插入删除查找都很简单。要是要返回一个数字int(正整数),但是输入参数不符合条件,就不可原创 2020-06-21 11:12:44 · 75 阅读 · 0 评论 -
日記20200609
2020年06月09日数组判断一个整数num的长度:(num+"").length()优秀代码参考ID题目大致内容解题思想注意点53最大子序和动态规划(和乘积最大的连续子数组一样),优化空间的动态规划(preMax,curMax),分治(分类)66加一数组,需要考虑进位。加一得十,进一位个位数为 0 。加法运算如不出现进位,运算就结束了,且进位只会是一。88合并两个有序数组直接合并再排序、双指针(从前往后)、双指针(从后往前)1原创 2020-06-21 11:12:11 · 71 阅读 · 0 评论 -
日記20200608
2020年06月08日分治算法 && 数组归并排序算法完全遵守分治模式。分治模式每层递归都会有三个步骤:分解原问题、解决子问题、合并这些子问题的解成原问题的解。最大子数组:具有最大和的连续子数组,可用分治算法。小技巧,计算中值,不要前后加除以2,要mid = (left + right) >>> 1上述运算结果正好能对应一个整数的二分之一值,这就正好能代替数学上的除2运算,但是比除2运算要快。int mid = (left + right)原创 2020-06-21 11:11:41 · 63 阅读 · 0 评论 -
日記20200607
2020年06月07日贪心算法可以先找递归贪心算法解决问题,并将递归算法转化为迭代算法,则完成贪心方法的过程。贪心算法通常都是自顶向下的设计:做出一个选择,然后求解剩余下的那个子问题,而不是自底向上地求解出很多问题,然后再做选择。贪心算法可能依赖之前作出地选择,但不依赖将来地选择。小技巧,如何无限循环遍历数组,取余数remain = remain - cost[j] + gas[(j + 1) % n];j = (j + 1) % n;其中%,当j+1超过n后,由于取余,又从头原创 2020-06-21 11:10:49 · 73 阅读 · 0 评论 -
日記20200606
2020年06月06日动态规划回溯算法,需要记录过程,复杂度通常较高。动态规划是用空间(填表格)换时间的时间,所以有些情况表格可以复用。如当前情况只和上一个情况相关。常用复用方法:滚动数组(当前行只参考了上一行的时候,可以只用 2 行表格完成全部的计算);滚动变量(斐波拉契数列问题)。解决递归中堆栈溢出的问题的一个思路就是使用动态规划(DP)技术.优秀代码参考ID题目大致内容解题思想注意点120三角形最小路径和动态规划,自底向上。要是带记原创 2020-06-21 11:10:17 · 66 阅读 · 0 评论 -
日記20200605
2020年06月05日动态规划优秀代码参考ID题目大致内容解题思想注意点63不同路径 II动态规划。注意,若是一行或一列上有一个障碍物,即“1”,那么该行或该列上的值都应初始化为“1”。64最小路径和动态规划,状态方程的编写,每次要选取最小的才行91解码方法动态规划,是一维的,要清楚运用分类计数的加法和乘法原理95不同的二叉搜索树 II动态规划,得明白二叉搜索的特性,难96不同的二叉搜索树动态规划,由卡特兰数推出常原创 2020-06-05 23:14:55 · 92 阅读 · 0 评论 -
日記20200604
2020年06月04日动态规划Java Vector类。实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:Vector 是同步访问的。Vector 包含了许多传统的方法,这些方法不属于集合框架。Vector 主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况。有三种构造方法,其中Vector(int size,int incr),创建指定大小的向量,并且增量用 incr 指定。增量表示向量每次增加的元素数目。动态规划与分治相似,只不过分治会做原创 2020-06-05 23:14:22 · 64 阅读 · 0 评论 -
日記20200531
2020年05月31日leetcode优秀代码参考ID题目大致内容解题思想注意点77组合回溯78子集回溯79单词搜索回溯搜索对象是一个两维数组,不再是一个一维数组,定义一个上左右下的方向二维数组90子集 II回溯。难点在于怎么控制重复的元素不搞出重复的子集,但是在子集中又可以出现,比如[1,2,2],子集[1,2],[1,2],因为索引1和2上都是2,所以子集重复了,要避免。而[1,2,2]又是允许的。我用.contains()判断耗原创 2020-06-05 23:13:52 · 90 阅读 · 0 评论 -
日記20200528
2020年05月28日leetcode优秀代码参考ID题目大致内容解题思想注意点40组合总和 II和组合总和解法一样,只不过下一次从i+1开始,而不是i。如何去掉一个数组中重复的元素,除了使用哈希表以外,我们还可以先对数组升序排序,重复的元素一定不是排好序以后的第 1 个元素和相同元素的第 1 个元素。根据这个思想,我们先对数组升序排序是有必要的。候选数组有序,对于在递归树中发现重复分支,进而“剪枝”也是有效的。46全排列回溯。因为要取遍所有,不用剪枝,所以原创 2020-06-05 23:13:03 · 98 阅读 · 0 评论 -
日記20200527
2020年05月27日leetcode如何控制左右括号个数相等StringBuilder和StringBuffer基本相似。不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。把StringBuilder st;定义在全局变量,不给初始值,要是在方法中直接使用会空指针异常sql基本执行顺序FROMONJOINWHEREGROUP BYWITH CUBE or WITH ROLLUPHAVINGSELECT原创 2020-06-05 23:12:22 · 77 阅读 · 0 评论 -
日記20200526
2020年05月26日leetcodedeque容器为一个给定类型的元素进行线性处理,像向量一样,它能够快速地随机访问任一个元素,并且能够高效地插入和删除容器的尾部元素。但它又与vector不同,deque支持高效插入和删除容器的头部元素,因此也叫做双端队列。当Deque作为队列的时候,会产生FIFO(先进先出)行为。同时,Deque也可以作为LIFO(后进先出)堆栈,此接口优于传统的Stack类使用ArrayDeque是Deque接口的一个实现,使用了可变数组,所以没有容量上的限制。但其是线原创 2020-05-27 13:49:00 · 84 阅读 · 0 评论 -
日記20200523
2020年05月20日leetcodeJava的LinkedList是一种常用的数据容器,与ArrayList相比,LinkedList的增删操作效率更高,而查改操作效率较低。优秀代码参考ID题目大致内容解题思想注意点933最近的请求次数没看懂题目和解答101对称二叉树思想1 递归。当满足以下条件时互为镜像: 1.它们的两个根结点具有相同的值。 2.每个树的右子树都与另一个树的左子树镜像对称。 思想2 迭代,利用队列Queue<TreeNod原创 2020-05-23 22:21:47 · 112 阅读 · 0 评论 -
日記20200522
2020年05月20日leetcodeJava 类变量有默认值,可以不初始化;但局部变量必须要初始化public class Demo{ public static void main(String[] args){ int i; //没有赋值 System.out.println("i is" + i); }} 会编译错误。优秀代码参考ID题目大致内容解题思想注意原创 2020-05-23 22:19:50 · 76 阅读 · 0 评论 -
日記20200520
2020年05月20日leetcodebreak:结束整个循环;continue:跳过当前循环剩余内容,马上开始下一次循环。HashMap存入和取出数据顺序不一致,要想一样,可以:通过有序的Key获取相应的数据用HashMap的子类 LinkedHashMap,可以按照我们put的顺序进行存储map数据Map<String, String> map = new LinkedHashMap<>();用 TreeMap优秀代码参考ID原创 2020-05-20 23:16:57 · 103 阅读 · 0 评论 -
日記20200519
2020年05月19日leetcode想用arraylist来做数组的重合,值不唯一可以重复,用indexOf(value)可以获得索引,但是效率不高,耗时长。优秀参考代码的运行时间才3ms,不过内存消耗和我的差不多优秀代码参考leetcode题目序号题目大致内容解题思想注意点350两个数组的交集II使用HashMap来跟踪每个数字出现的次数。先在HashMap记录一个数组中存在的数字及相应出现次数。然后,遍历第二个数组,检查其数字在HashMap中是否存在,原创 2020-05-20 08:44:08 · 99 阅读 · 0 评论