leetcode

250 阅读6分钟

要想学得好,算法少不了,这是关于leetcode上的题解,我是跟着公众号代码随想录的顺序进行刷题的。

面试题 02.07 链表相交 05/08

题目链接

思路:首先要确保两个要比较的链表的指针相同,那么就能找出结点。 题解:先找出长度较长的链表,再把该链表的指针指到剩下的数跟另一个链表的数个数相同。然后直接比较结点,结点相同就返回结点,一直比较到最后一个结点,若还不相同就返回null。

142 环形链表II 05/09

题目链接

思路:需要进行数学分析。首先,定义一个快指针和一个慢指针。快指针每次走2格,慢指针每次走一格。如果该链表有环,那么快慢指针终究会相遇。即两者最终会相等。当两者相等时,相等的位置离入环位置的距离会等于链表的头结点到入环位置的距离(需要做数学分析)。那么即可再定义两个指针,一个从头结点出发,另一个从相遇位置出发,当两者相同时,所得位置即为入环位置。

242.有效的字母异位词 05/12

题目链接

思路:这道题涉及的知识为哈希表。首先,最多只有26个字母。因此,用当前字母减去‘a’的值就可以作为存放在数组中的位置。比如'a'-'a'=0.那么a的个数就存放在数组arr[0]处。先对s进行分解,使得数组中包含了s所包含的字母个数。t再进来,用--即可。最后判断数组上所有位置是否全为0,若不是,说明两者不是字母异位词,反之则是。

349.两个数组的交集 05/19

题目链接

思路:根据题目描述,两个数组的交集且不出现重复的数字且不用关心先后顺序,那么我们可以想到HashSet这个不重复又无序的数据结构了。那么我们可以创建两个HashSet。第一个HashSet先用来存数组1出现的元素(如1,2,3,3,3就会存入1,2,3)。然后再通过同样方式存数组2的元素,但要加个判断条件(只有第一个HashSet中出现过的才进行添加,使用contains方法)。这样出来的第二个HashSet就是答案。但此时还要将HashSet转为数组,这也是一个重点。

方式1,自己上网搜的,效率较低:

image.png 方式2:代码随想录上的,效率十分高

image.png

202 快乐数 05/23

题目链接

快乐数,快乐数,做起来一点也不快乐

思路:最关键的点是,当某个数进去后陷入了无限循环且没有1出现,说明这个数不是快乐数。那么可以定义一个方法用来计算n的位数平方和。这个方法有些难想到。n=n/10是为了预防百位的出现。再创建不可重复的哈希表HashSet用来存放每次的结果。若某次过程发现n的值HashSet已经有了,那么就可以退出循环,且用n==1来判断是否为快乐数。

01 两数之和 05/24

题目链接

两数之和,最经典的题目了。今天,我要用哈希表的办法解决它

思路: 创建一个长度为2的数组res。要是给的nums为空或长度为0,直接返回res。不为空,就创建一个哈希表,key用来存储值,value用来存储下标。通过for循环并定义一个temp用来存储target-nums【i】,要是该哈希表中已经存在这个temp,那么可推断出此时的nums【i】与temp满足相加等于target。那么res[0]=map.get(temp)也就是通过temp找到索引并填入数组res的第一个,第二个就是i。要是没找到,key就是此时nums[i]的值,value就是此时i的值。再循环直到找到或找完。

454 四数相加|| 05/26

题目链接

思路: 先创建一个用Map做的哈希表。定义一个temp和最终结果res。用双层for循环先遍历nums1,再遍历nums2,令temp=2个数组对应索引对应的值相加。key用来记录相加的值,value用来记录相加的值出现了多少次。并判断哈希表中是否已经存在该key,若已经存在,value+1,不存在,则通过put方式加入此key值并赋value为1。再通过同样方式遍历数组nums3和nums4.用temp来记录2个数组对应索引对应的值相加。如果map中存在key=-temp的值,那么就让res+="此时的map中的key也就是-temp的对应的value值"。

383 赎金信 05/27

题目链接

思路: 对于赎金信中的字,如果杂志上包含所有即可返回true,否则返回false。那么,可以用数组创建一个包含26个字母的哈希表。先遍历杂志中的字母并存入哈希表中。再遍历赎金信中的字母并令相应的哈希表字母减1.判断:若是哈希表中该字母对应的索引对应的值为0,那么说明杂志中已经不再有赎金信中的字母了,这时可以返回false。一直遍历到没返回false即可返回true。

15 三数之和 06/01

题目链接

思路:该题不适合使用哈希表。应该使用双指针。首先创建集合result将所给数组进行排序。再定义一层for循环。当nums[i]>0,说明该数和后面的数再怎么加都无法等于0了,因此直接返回result。再判断当i>0且nums[i]=nums[i-1]时,此时说明再判断下去可能会出现重复的集合,不符合题意。下面,进入,解题的关键所在。定义左右指针。当右指针大于左指针时,定义一个sum等于nums[i]+nums[left]+nums[right]。若sum>0,right--。sum<0,left++。sum=0,往result中添加nums[i],nums[left],nums[right]这个集合。再在右>左的情况下判断right(left)是否与左(右)相等,相等就跳过,最后right--,left++。

15 四数之和 07/24

题目链接

思路: 与三数之和的思路差不多,但需要注意的是,这里需要进行剪枝操作,需要判断当nums[i]>0并且当nums[i]>target时,此时说明再怎么进行循环都会使相加的值更大,因此直接进行返回即可。接下来的操作与三数之和的操作差不多,这里就不再多赘述

541 反转字符串2 08/11

题目链接