算法
菜鸟的救赎之旅
这个作者很懒,什么都没留下…
展开
-
8月3日:子集
题目如下:这是一道求排列组合问题。求排列组合问题常用思路是递归和回溯思想,然后好不容易看懂了解题方法开始自己写,写完以后就是这个样子然后我又看了一下题解,感觉我写的和题解基本一样了,就方法名称不一样(难道方法名不一样还有影响嘛?),然后我再仔细检查了一下两者之间的差别,还真写个地方不一样我add的是函数传进来的list,而题解是用的res.add(new ArrayList<Integer>(list));原来如此,因为形参传进去的都是引用类型的变量,list引用所指原创 2020-08-03 10:46:59 · 189 阅读 · 0 评论 -
7月31:今天来写写快速排序
时间过得可真快,转眼又到了7月的最后一天了,复习到这个时候,感觉有点俱足无措,感觉啥都没准备好,又感觉不知道准备啥。然后看算法的时候又看到了快速排序,虽然以前看过好多遍快速排序,但始终没有自己写过,没有自个儿写过始终觉得心里不踏实。所以哇,不管怎么样今天还是来把快排写了吧。...原创 2020-07-31 16:54:15 · 116 阅读 · 0 评论 -
7月28日:和为K的连续子数组
题目如下:题目看着不难,然后我第一个想到的就是暴力解法,直接双重循环。但是发现速度确实挺慢的,所以就看了一下官方的题解。我的理解是:新建一个hashmap,然后遍历数组,并将数组累加,将累加的结果放入hashmap中,如果hanshmap中存在当前累加减去目标数,则说明存在一个和为K的子数组。classSolution{publicintsubarraySum(int[]nums,intk){if(nums==null||nums.lengt...原创 2020-07-28 09:56:04 · 520 阅读 · 0 评论 -
7月28日:找到所有数组中消失的数字
题目如下:1.首先对于这种数组消失数字问题我想到的是用hashset将数组中的元素放进hashset中,由于hashset是不允许有重复元素的,所以放完以后再遍历1-n(因为题目说了,a[i]的范围在1-n之间),所以遍历1-n的过程中判断遍历的那个数是否在hashset中,如果不再则说明该数就是消失的数字。这个方法虽然简单,但是不太符合题目要求,因为题目要求不使用额外空间(题目是不建议使用hashset)2.不使用hashset,那我可以先将该数组排序哇,排完序再遍历1-n和排好序的数组对比,原创 2020-07-28 08:26:49 · 98 阅读 · 0 评论 -
7月28:路径总和III
题目如下:题解看了很久都看得不太懂,然后本来想放弃,可是感觉如果连这种题都放弃的话那秋招就真的没戏了,于实开始硬着头皮看代码。代码如下:/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval)...原创 2020-07-28 07:03:43 · 166 阅读 · 0 评论 -
7月27日:字符串解码
题目如下:这个题思路不难,一般遇到这种括号问题,大多用栈来解决,遇到左括号进栈,遇到右括号出栈,但是写起来还是不容易哇,力扣中等难度还是中等难度,比简单题还是难不少。下面是实现代码:classSolution{publicStringdecodeString(Strings){StringBufferans=newStringBuffer();Stack<Integer>multiStack=newStack&...原创 2020-07-27 07:58:01 · 92 阅读 · 0 评论 -
7月27日:前K个高频元素
题目如下:经过这么多天的刷题以后,看到这道题目还是有思路的,毕竟遇到数组中求一个数的频率问题,首先肯定能想到用HashMap来统计频率。而要求前K问题很明显是得用堆排序。虽然HashMap容易写,但将它和堆结合以前没写过,所以哇,还是没有写出来(主要还是堆排序不太会写);可是在java中它有一个优先队列就实现了小顶堆的功能。代码如下:classSolution{publicint[]topKFrequent(int[]nums,intk){...原创 2020-07-27 07:34:18 · 69 阅读 · 0 评论 -
7月25日:最长上升子序列
题目如下: 经过一个多月的leetcode刷题,虽然很多题还是刷不明白,但是有些套路还是能够想到,比如这道题。题目要求求最长上升子序列。我一开始将题意看错了,题目要求的是最长上升子序列,我理解成立求最长连续上升子序列,还用到了双指针法,可是一直通过不了,后来仔细将我的输出结果和目标结果进行对比,才发现,原来题目所说的子序列并不要求序列得连续。 然后只好想其他方法了,看到最长让我想到了动态规划,动态规划的难点在于找到状态转移方程,可能还是我对动态规划理解的不到位吧,一时间还是想不到。然...原创 2020-07-25 07:11:44 · 89 阅读 · 0 评论 -
7月24:完全平方数
题目如下:思路:classSolution{publicintnumSquares(intn){intdp[]=newint[n+1];Arrays.fill(dp,Integer.MAX_VALUE);//bottomcasedp[0]=0;//pre-calculatethesquarenumbers.intmax_square_index=(int)Ma...原创 2020-07-24 11:58:52 · 138 阅读 · 0 评论 -
7月24日:回文链表
首先是题目:这道题被定义为简单题着实让我感到很意外,如果没有时间和空间复杂度限制的情况下确实是简单题,毕竟如果没有空间限制直接可以先遍历链表,然后将链表节点值用数组存起来,然后用个双指针去判断这个数组是否是回文数组即可。如果没有空间限制的话,我还想到了可以先将链表复制一份,然后将复制后的链表进行反转操作,然后遍历原始和反转后的链表,如果完全相等的话则说明这条链表是回文链表,如果有一个节点不相等则说明不是反转链表。我的代码如下:classSolution{publicLi...原创 2020-07-24 07:45:32 · 105 阅读 · 0 评论 -
7月24日:最大正方形
题目如下:如图题目所示是求一个矩阵中最大正方形面积的最大值。这让我想到了前些天刚做的求一片区域中所有海岛数量的题目,那道题是将问题转换成图搜索问题,用dfs(深度优先遍历法)来遍历图从而寻找出图中所有的海岛数量。所以我一开始也是尝试将这个问题转换成图搜索问题,可是找不到解决方法,然后就想到暴力法。暴力法由于正方形的面积等于边长的平方,因此要找到最大正方形的面积,首先需要找到最大正方形的边长,然后计算最大边长的平方即可。暴力法是最简单直观的做法,具体做法如下:遍历矩阵中的每个元素,每次原创 2020-07-24 06:56:10 · 131 阅读 · 0 评论 -
7月23日:数组中第K大个元素
题目如下:这个题目还是算比较经典的吧,可能笔试的时候出现的不多,但是面试的时候问的可能会比较多。面试官虽然不会直接问数组中的第K个元素,但是他可能会问到:如果我手上有100w个数,我现在要快速找出第3大的数,如何最快实现呢?,通常我们首先能想到的是先对那100w个数进行排序,然后按照排序结果取第几个元素就可以了,所以这道题的重点是如何选取排序算法。一般对于这种找出最大或者最小的元素的问题,一般都是用堆排序算法来解决的,次之是快速排序。那么为什么使用堆排序对于这道题会更好呢?因为堆排序每次都是原创 2020-07-23 07:29:44 · 71 阅读 · 0 评论 -
7月23日:实现前缀树
题目如下:很明显这是一道关于设计数据结构的题目。但是本菜鸡拿到这道题目的第一想法就是用hashSet来存字符串,这样的话插入和查找字符串是否存在就比较方便了,但查前缀就变得有些麻烦,虽然麻烦但是还是可以完成前缀查询的。下面是菜鸡思路代码:classTrie{Set<String>hash;/**Initializeyourdatastructurehere.*/publicTrie(){hash=new...原创 2020-07-23 06:52:24 · 94 阅读 · 0 评论 -
7月22日:课程表
题目如下:这个题的题目叫做课程表,第一眼看这个题目会以为是数据库相关的题目,但实际上确实一道算法题。刚开始我拿到这道题的时候还是不太理解题意,然后过了几分中没有思路以后就直接打开了题解,看着题解都是直接按照图来解,也就是把这个题归纳成有向图的遍历问题,进而可以用拓扑排序思想来解题,拓扑排序也就是广度优先遍历算法。下面是它的题解下面是它的Java实现的拓扑排序代码:这个代码我也看了好几遍,可是并没有看懂,那是吃完饭之前做的一道题,当时看题解看得不太懂,然后心里就很不舒服,因为这样的原创 2020-07-22 23:13:09 · 119 阅读 · 0 评论 -
今日题目:链表反转(leetcode简单题)
下面是题目:这道题目可以说是链表里面比较经典也可以说是比较简单的题目了,但是菜鸡的我还是自己独立写不出来,看来还是自己太菜了。下面是leetcode的上的官方解,官方给出了两种解题思路这种方法还是比较好理解的,毕竟它是直接通过迭代来实现反转的,比较直观,也就是遍历链表的每一个节点,遍历的同时对每个节点进行反转。递归的解法代码看起来都会比较简洁,但是代码可读性比较低,比较难懂。但是递归写多的话实际上和跌打是一样的,只不过递归的时候得搞清楚递归的终止条件,把递归的终止条件搞清楚了递归原创 2020-07-22 12:22:46 · 117 阅读 · 0 评论 -
今日题目:打家劫舍(经典动态规划题目)
题目描述如下:这是一道关于动态规划的简单题,虽说是简单题,但是关于动态规划的,看起来就有点恐惧,但看到这道题是简单题,顿时就觉得“天晴了,雨停了,我觉得我又行了”,然后就开始想关于他地动态递推公式,我一开始地想法是(由于题目要求小偷不能同时偷相邻两个房屋,所以我觉得递归公式是dp[i] = dp[i-2]+nums[i]),然后很快就写出了程序,可是提交地时候却没有通过最后还是没办法只有去看了题解:看来还是我理解的有问题,它的递推公式应该是dp[i] = max(dp[i-2]+nums原创 2020-07-22 10:47:40 · 201 阅读 · 0 评论 -
今日题目:乘积最大子数组
题目如下:第一次做这个题的时候想到的是暴力法,暴力法就直接用双重循环,依次遍历数组,然后挨个比较大小。然后又想到了双指针法,可是这道题目貌似双指针法和暴击解法没啥太大的差别。所以这样一想就放弃了,然后看了一下优秀的题解方法,在题解方法中大多数使用的都是动态规划思想,可是我看了半天还是不是很理解他们的那种动态规划算法思想。这是官方C++思路。它的动态规划转移方程为:动态规划的思想是当前状态可以由上一个状态得到,可是我的想法是题目不是要求乘积最大的连续子数组嘛,这样的转移方程能求原创 2020-07-22 07:04:01 · 116 阅读 · 0 评论 -
今日题目:排序链表
这段时间刷leetcode算法题给我刷的有点崩溃了,随着秋招时间一天一天临近了,然鹅我的算法题刷的依然是一塌糊涂,很多难点的算法题还是不会写,心里也越来越紧张。但还是得刷下去哇。 刚开始刷的两道链表中判断是否有环感觉还是挺简单的,很快就写出来了,然后刷到了链表的排序这道题,着实不太好懂。但是不好懂也得弄懂,没有办法,只能一步一步来了,下面就开始吧。题目要求时间空间复杂度分别为O(nlogn)O(nlogn)和O(1)O(1),根据时间复杂度我们自然想到二分法,从而联想到归并排序;对...原创 2020-07-21 11:14:37 · 116 阅读 · 0 评论 -
记事本刷算法哇
【2020.7.5】LC148 Two-sum题目描述给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足index1 小于index2.。注意:下标是从1开始的假设给出的数组中只存在唯一解例如:给出的数组为 {2, 7, 11, 15},目标值为9输出 ndex1=1, index2=2我的想法很简单,直接暴力两次循环遍历,但它题目的标签是hashimport java.ut.原创 2020-07-05 07:33:45 · 135 阅读 · 0 评论 -
字节跳动笔试后的感悟
前些天投了字节跳动提前批,投完过了一天提示简历筛选完毕,然后短信和邮件发来了笔试邀请,本来我以为提前批内推过来的没有笔试,没想到还是有笔试,后来才知道,原来内推是简历非常厉害的才能免笔试(小菜鸡不配免笔试),然后没有办法哇,人家要笔试考我,别无他法,只有刷题咯,然后我找了leetcode的中的字节跳动专项来训练,说是训练,实际上由于时间来不及了(那个题库中差不多40道题),因为距离笔试只剩下1天时间不到了,所以直接看答案,答案看得倒是蛮快的,可是有点消化不良。终于在今天上午10点笔试开始了,字节跳动还是那个原创 2020-07-04 21:10:22 · 3183 阅读 · 2 评论 -
把数组排成最小的数(遇到的一个小问题)
刚刚在写剑指offer中的把数组排成最小的数,首先说说我的思路吧,因为不久前曾做过字符串的全排列这道题,所以对它还有印象,然后又碰到这个把数组排成最小的数这道题,比较两题你会发现,假如把数组元素看作是字符,那么整个数组就可以看成是一个字符串了,所以本质上两道题可以用同一种思路来做。然后我就按照字符串的排列思路来做这道题,他们唯一不同点在于一个是把字符串分成字符,然后对字符进行排列,另一个是把几个字符串进行排列(把数组里的整数变成字符串),下面是代码package 剑指offer;import原创 2020-06-21 11:14:55 · 96 阅读 · 0 评论 -
字符串踩过的坑
某天写算法题(字符串的排列)import java.util.ArrayList;import java.util.Collections;/** * 输入一个字符串,按字典序打印出该字符串中字符的所有排列。 * 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 */public class 字符串的排列 { private ArrayList<String> list = new ArrayLis原创 2020-06-21 07:52:17 · 87 阅读 · 0 评论 -
顺时针打印矩阵(直接算法)
这是一道很经典的题目(顺时针打印矩阵),每次做这道题就让我想起来当初大一的时候刚学c语言那会儿,那时候对编程无比痴迷,每次写代码都写很久,现在感觉已经失去了那份痴迷很久了。那下面步入正题吧!!!顺时针打印矩阵,其实这和我们玩过的一种游戏很相似--------贪食蛇,特别是以前的诺基亚手机那会,如下一个矩阵:1 2 3 45 6 7 89 1011 121314 15 16这样一个矩阵:它顺时针打印的话就是:[1, 2, 3, 4, ...原创 2020-06-19 20:39:40 · 337 阅读 · 0 评论 -
填坑——拓扑排序
拓扑排序很早以前就接触过了,大概是在本科二年级的时候,然鹅现在已经研三了,过去太久了,所以只对这个名词挺熟悉,对它的算法都忘的差不多了,但是昨天面试的腾讯实习,面试官突然问到这个问题,面试之前还是复习过十大经典排序算法,可是拓扑排序确实没有复习过,所以现在决定填坑。把拓扑排序的知识点补起来。 首先,拓扑排序并非真的排序,这一点是基础,当时我被问到拓扑排序的时候第一个想到的就是排序,但是当时复习的十大排序算法中并没有拓扑排序,从而导致面试的时候进一步的慌张。下面是拓扑排序的百度词条定义。...原创 2020-06-18 07:40:16 · 131 阅读 · 0 评论 -
从基础的排序算法开始哇!!!
首先是冒泡排序,算法的思想很简单,假如给我们一个乱序的数组 arr:{1,5,6,2,3,9,4,8,7,10},冒泡排序的思想顾名思义,就是把最大的数或者最小的数往排序的方向冒泡,假如是从小到大排序,所以得做两层嵌套for循环,每次都把最大的数移动到最右边。代码如下...原创 2020-06-11 21:52:02 · 86 阅读 · 0 评论