![](https://img-blog.csdnimg.cn/cd10d6874ce7440bb55189e370ef5b69.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode
这里总结的写过的LeeCode的题目,主要是为了总结解题思路~
木可木可❀
一个努力的小小白~
展开
-
(C++) LeetCode 39:组合问题
LeetCode 39题原创 2022-09-18 10:39:19 · 564 阅读 · 2 评论 -
LeetCode 剑指 05 :替换空格
题目:思路:这个题我是直接另外用了一个字符串变量来存储,这样的话就另外需要O(n)的空间。也可以直接在同一个字符串s上进行操作,不过那样的话就需要先对字符串的长度进行扩充。扩充可以调用库函数 resize()实现。当利用 resize()扩容后就是给字符串进行替换操作了,这里很容易想到可以用双指针的方法,但是如果双指针我们是从前往后移动的话,那么每次需要替换空格的时候都要把后面的数据往后挪3位,如此一来时间复杂度相当于就是O(n^2)了,那还不如再创一个字符串呢。。。所以,这里的小技巧是双指原创 2022-05-10 19:52:43 · 145 阅读 · 0 评论 -
LeetCode 151:颠倒字符串中的单词
题目:思路:这道题实际上还是对字符串的翻转的操作,只不过限制又加多了一些,单词与单词之间有多余的空格,题目要求空格也要规整,这道题目我的思路是,先把单词里多余的空格删掉,那么这里就分为了三种情况,一种是在最前面有多余的空格,需要全部清除,第二种是单词与单词之间有多余的空格,只需要保留一个就可以,第三种就是最后面有多个空格,也全部删掉。关于去除多余的空格我的思路是利用了两个标记来进行判断,判断空格是否多余或者是合法,类似于移除元素那道题,利用双指针把字符串前移到正确的格式,然后start指针的原创 2022-05-10 14:05:39 · 221 阅读 · 1 评论 -
LeetCode 剑指 Offer 58 - II. 左旋转字符串
思路:这道题可以有两种方法,实际上就是字符串的翻转问题。这里我先对整体翻转,然后再对局部进行翻转,但是这里要注意,局部翻转的时候要注意字符的个数需要进行处理。class Solution {public: string reverseLeftWords(string s, int n) { reverse(s.begin(), s.end()); n = n % s.length(); reverse(s.begin(), s.begin() + (s.length() ..原创 2022-05-10 10:29:48 · 120 阅读 · 0 评论 -
LeetCode 189:轮转数组
题目:思路:最简单的方法应该是利用for多次将数组的内容一个一个的移动,但是这种方式需要多个双重for循环,比较耗时,所以这里想的方法是尽量在一个for循环中就结束操作,以下分为两种情况,一种是当我要循环的次数少一整个数组长度的一半的时候,还有是超过一半的时候,具体可以看代码,这里有一个要注意的点是,k的次数需要取模(如果是暴力法通过取模可以减少循环的次数),如果k没有取模那么可能就会有错误。代码:class Solution {public: void rotate(vec原创 2022-05-08 21:33:30 · 1093 阅读 · 0 评论 -
LeetCode 283:移动零
思路:暴力法多次移动肯定是不行的,会超时。提出新的方法,通过快慢指针来实现代码:class Solution {public: void moveZeroes(vector<int>& nums) { int fastIndex=0,slowIndex=0; bool flag=true; while(fastIndex<nums.size()){ if(flag==true){ ..原创 2022-05-08 21:28:19 · 520 阅读 · 0 评论 -
LeetCode 824: (C++)山羊拉丁文
太久没有写过LeetCode啦,今天刚好突然想起来,就找了道题目写一下,这次是用C++写的,因为最近在复习C++,正好这道题也简单,就写了一下,可能写的不咋样,大家就参考参考就行~题目:我把一些操作都分别用了不同的函数来写,应该也好理解,就不写详细思路了,应该都可以很容易看出来,这里有一个要注意的点就是 a e i o u不光是小写,还有大写也是属于同一种情况,加上就可以了代码:#include<iostream>using namespace std;cla.原创 2022-04-21 20:11:25 · 612 阅读 · 0 评论 -
(Python) LeetCode 104:树的深度
题目:代码:# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def maxDepth(self, root: Option原创 2022-01-22 16:14:08 · 603 阅读 · 0 评论 -
(Python)LeetCode 100:相同的树
题目:思路:这个题其实就是判断两个数是否完全相等,包括树的结构还有节点值,这里我的解决方法主要还是利用递归的方法,按照中序遍历的思路,来判断数值是否相等,所以这个方法不是从首节点开始判断,而是按照中序的左中右来判断,并且为了提高速度(递归会占用比较多的内存和时间),所以在中序遍历之前,我还加了一个标志的判断,如果在一次递归的最开始就判断到falg==0(也就是前面已经出现了不相等的情况),那么直接退出这次的递归,这样的话,如果左子树有不相等的情况了就不需要再去判断右子树是否相等。参考..原创 2022-01-21 10:39:16 · 361 阅读 · 0 评论 -
(Python) LeetCode 94:二叉树的中序遍历
题目:思路:这道题目实际上并不难,在学习数据结构的时候已经学习过了中序遍历的递归算法,这里实际上就是用Python实现一遍而已,难度不大,原理就不说了,代码仅供参考。代码:class Solution: def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]: List = [] def traversal(root:TreeNode): i原创 2022-01-21 08:56:09 · 676 阅读 · 0 评论 -
(Python)LeetCode 31:下一个排列
题目:思路:这道题在最后成功之前,我总共错了三次,都是一些情况没有考虑到,最后整理思路如下:首先,我们应该倒序去看这个列表会比较好理解,从后往前,一旦某个下标的元素比前一个元素大,那么肯定将这两个元素调换即可,但是,由于这里要求的是比原本的数大的最小值,所以,我们应该要尽可能的把小的数放在前面,大的数放在后面,而不能是简单的替换,比如:[3,1,4,2],正确的替换结果应该是[3,2,1,4],可以看到,并不是简单的把两个相邻元素(1和4)进行替换,而是把1后面的数,即:2和4中挑选比1大的原创 2021-12-06 20:14:21 · 812 阅读 · 0 评论 -
(Python)LeetCode 1005:K次取反后最大化的数组
题目:思路:为了让数组的和最大化,所以,每次进行符号变换的时候,应该选择当前数组中最小的数取反,这样的话,如果最小的数是负数,取反刚好为正,结果会变大;如果是整数,选择最小的变为负数才可以使结果最大化。代码:class Solution: def largestSumAfterKNegations(self, nums: List[int], k: int) -> int: for i in range(k): Min = min(原创 2021-12-06 18:52:05 · 85 阅读 · 0 评论 -
(Python)LeetCode 67:二进制求和
题目:思路:给出的是a和b两个字符串,倒序计算字符串对应的值,判断留在本位的是什么,是否需要进位,如果进位那么下一位的计算除了字符串对应的数还包括要进的一位,留在本位的this可以通过取模计算,进位则只要this的计算结果大于1就是要进位,另外还要注意最后一位可能还要进位,所以在a和b字符串都计算完后还要再判断一次是否有进位。代码:class Solution: def addBinary(self, a: str, b: str) -> str: a_i原创 2021-12-06 00:19:44 · 657 阅读 · 0 评论 -
(Python)LeetCode 22:有效括号
题目:思路:这个题目一开始拿到我也很懵,暴力算法肯定是会超时的,由于好久没看过数据结构的内容了,算法有些遗忘了,所以看了一下别人的解法,回忆了一下,实际上这道题目就是深度优先算法(DFS)的一个例子,关于DFS算法可以参考深度优先搜索(DFS),在了解了DFS的原理之后,这个题目实际上就很简单了,就是递归调用,得到不同的结果。代码:class Solution: def generateParenthesis(self, n: int) : List = [].原创 2021-12-04 11:16:27 · 253 阅读 · 0 评论 -
(Python)LeetCode 506:相对名次
题目:思路:先找到当前列表中最大的元素,然后再找到它的下标,找到后记录在answer列表里,同时要把已经找到的这个列表中最大的元素值设为最小的,以便找到第二大、第三大、、、的数,这里我是设置为了-1,因为所有的成绩都是大于-1的,所以-1是最小的。代码:class Solution: def findRelativeRanks(self, score: List[int]) -> List[str]: answer = [] count =原创 2021-12-02 09:48:19 · 538 阅读 · 0 评论 -
(Python)LeetCode 1446:连续字符
题目:思路:我首先想到的就是用字典来记录不同字符的最长个数,关于当前连续字符的个数,用了一个count来计数,如果一样则count加一,一旦有不一样,则进入判断,主要是判断当前key是否在列表中,如果不在直接添加,在的话要判断当前记录的连续字符的个数和字典中的值哪个大,如果当前连续个数大则更新value,当前小则不做任何处理。注意不要忽略了最后一个字符的统计,因为最后一个字符会因为循环的原因没记录到就跳出循环,所以在循环外也要再判断一次。代码:class Solution:原创 2021-12-01 22:43:52 · 213 阅读 · 0 评论 -
(Python)LeetCode 11:盛最多水的容器
题目:思路:这道题目我一开始写错了两次,第一次是本身代码逻辑少了一部分,主要是因为列表的复制这里使用错误,第二次代码应该是正确的,但是还是我一直容易忽略的问题,代码的效率,运行超出了时间限制。对这两种情况的思路都做一个总结,可以参考一下。效率低下的一种: 这个我主要是这么想的,先把列表排个序,从大到小,然后分别找到当前最大的两个元素的下标,然后计算面积,然后第二次找的时候,原本第二大的数变成现在最大的数,再找到第三大的数(也就是排序后的第三个数作为第二大的数),在作为目前最...原创 2021-11-30 15:54:57 · 645 阅读 · 0 评论 -
(Python)LeetCode 19:删除链表的倒数第N个节点
题目:思路:首先计算链表中有多少个节点,然后将对应的节点删除,主要还是指针的移动,将指针移动到要删除的结点的前一个,然后用p.next = p.next.next这样删掉倒数第n个结点。这里要注意的是:当 n == count 时,也就是删除第一个节点时,注意不能只是移动p,而是要移动头节点head,不然会出现错误。可以通过画图来理解。代码:# Definition for singly-linked list.# class ListNode:# def __in原创 2021-11-28 09:29:25 · 389 阅读 · 0 评论 -
(Python)LeetCode 66:加一
题目:思路:先转为一个数字,加上一再转为数组,避免了进位时的问题第一次提交的时候忽略了进位时位数增多的问题,比如9 加上 1就是10,原本我是直接用新的数据覆盖原来列表的内容,但是对于这种情况不能直接覆盖,因为原本列表只有一个数,现在两个,会溢出,所以改为将列表清空,然后一个个通过append的方式加上去。代码:class Solution: def plusOne(self, digits: List[int]) -> List[int]: leng原创 2021-11-27 17:00:53 · 217 阅读 · 0 评论 -
(Python)LeetCode 24:两两交换链表中的节点
题目:思路:这个题目其实不难,但是我还是写了好久,思路清晰但是到了写代码还是有逻辑写错了,,所以折腾了好久。思路其实是这样的,我们需要两个指针,分别设为p1 和 p2,这里我另外新建了一个结点,后面接交换过后的结点,这样就省去了考虑头结点head可能会丢失的问题,并且head指针应该是每次会向后移动2次,也就是p2结点的后一个结点;然后就是p1和p2指针的变化了,这里有一个要注意的问题,要避免指针循环像对方(类似于循环链表),并且当p1指向p2的下一个结点的时候要注意p2后是否还有结点,没有原创 2021-11-27 16:34:46 · 458 阅读 · 0 评论 -
(Python) LeetCode 21:合并两个有序链表
题目:思路:有两种方法:(1)创建一个新的链表,这个链表由原来的两个链表的结点组成,也就是分别将之前的两个链表的结点逐一(按照大小)添加到新的链表中。(2)以其中一个链表为基准,将另外一个链表的结点移动到这个链表中。代码:# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val#原创 2021-11-27 11:31:42 · 501 阅读 · 0 评论 -
(Python)LeetCode 35:搜索插入位置
题目:思路:这道题非常简单,其实就是判断来得数据能否在列表找到,找到则返回下标,找不到则返回其应该插入的位置,使得插入数据后仍是一个有序列表,所以只要判断列表中的当前数据和目标值的大小即可,当列表的元素小于目标target时,则继续判断列表下一个元素,直到等于(即找到)或是大于(即找不到)则直接返回此时的下标,代表找到了相等的元素或者是要插入的位置。一个要注意的就是可能整个列表遍历完了都发现没有找到元素,也就是代表要把数据插入到最后一个,所以直接在while循环后加一个return inde原创 2021-11-26 09:15:35 · 170 阅读 · 0 评论 -
(Python)LeetCode 26:删除有序数组中的重复项
题目:分析:这道题一拿到手我想的是直接通过循环来解决,实际上这样是可以的,只是可能耗时久一些,但是我想着是个简单题应该不会考虑时间的限制等等,于是,,我提交了,最开始的代码如下(傻瓜办法):class Solution: def removeDuplicates(self, nums: List[int]) -> int: i = 0 while i < len(nums): j = i + 1 .原创 2021-11-23 13:06:15 · 689 阅读 · 0 评论 -
(Python)LeetCode 12:整数转罗马数字
LeetCode 第12题,整数转罗马数字原创 2021-11-17 13:53:57 · 579 阅读 · 0 评论 -
(Python) LeetCode 27:移除元素
题目:思路:每当有一个数相等,那么就把后面所有的数往前移动一个位置,然后把列表最后一个删掉。但这里有容易出错的,在第二个while里面,如果没有 i-1 这一步,那么会导致当有一个元素相等,处理之后会跳过一个元素(因为i+1,但其实后面的元素已经往前移动一格了,所以此时还是应该比较位置 i 处,所以当有相同的时候,在删除完最后一个元素,要把 i-1,保持在当前下标出不变)代码:class Solution: def removeElement(self, nums, va.原创 2021-11-16 14:05:39 · 3652 阅读 · 0 评论 -
(Python)LeetCode 13:罗马数字转整数
题目:示例:解题思路:这道题整体思路其实不难,就是将字符转到对应的数字上,这个可以用字典实现,因为字典的结构是{key,value},那么这里实际上就是把每一个字符对应到字典的值,然后进行加和计算即可,但是这里有一个难点在于,罗马数字会有IV和VI这两个区别,V代表数值5,I代表数值1,但是如果I在V前面,那么IV代表的是5-1=4,而VI代表5+1=6,同样的 IX=10-1=9,而 XI=10+1=11,这里我的方法比较简单,将6中可能的情况直接用条件判断进行判断,但是要..原创 2021-11-16 10:01:52 · 772 阅读 · 0 评论 -
(Python)LeetCode 520:检测大写字母
题目:思路:方法一的解题思路其实很简单,就是判断第一个字母是大写还是小写,如果是大写,那么接下来还要判断第二个字母是大写还是小写,如果是大写,那么后面的都要是大写,用一个while循环来循环判断,如果第二个是小写,那么剩下的一定要都是小写才是正确的,同样也是while循环判断。如果第一个字母就是小写,那么后面的一定都是小写,判断就比较简单,只需要判断是否为小写,小写就继续判断,大写直接返回False方法二的思路其实也比较简单,和第一个有些类似,也是判断第一个是大写还是小写,如果是小写,直接.原创 2021-11-13 09:59:10 · 994 阅读 · 0 评论 -
(Python) LeetCode 7:整数反转
题目:代码:class Solution: def reverse(self, x: int) -> int: s = str(x) # 转为字符串 length = len(s) # 字符串长度 index = length-1 #用作下标索引 string = '' # 新的字符串 if s[0] == '-': string += s[0]原创 2021-11-12 16:45:08 · 357 阅读 · 0 评论 -
(Python) LeetCode 8:字符串转换整数(atoi)
题目描述:思路:思路其实比较简单,就是对字符串进行判断,如果有正负号,一定是在前面,并且只能有一个,如果有两个,那么就是一个错误的数,就返回0,所以这里做的判断是只读取一个(在第一个while处)然后再到第二个判断数字的while循环处,如果此时的字符不是一个数字,那肯定是有问题的,所以就break,然后在判断是否是合法的数那里进行判断。另外就是如果前面的字符是空格,则向后读取,直到不为空格,就会到 elif 或是直接跳出然后执行第二个while循环处,或是全部读完代表这个字符串只有空.原创 2021-11-12 16:41:33 · 495 阅读 · 0 评论 -
(Python)LeetCode 6:Z字形变换
题目:这道题目依然考察的是Python中字符串的使用,包括字符串的下标,在题目所给的条件中找到规律。思路:如果真的按照像题目说的这样,先变为一个Z字形(其实更像N),然后一行一行输出其实是很麻烦的,首先我们不知道要输出什么字母,再加上中间这些空格,最后再整合为一个字符串,非常麻烦。而这类题目实际上就像小学的找规律,一定是有规律可言的,无非就是下标的变换操作,只要找到下标的变化规律就可以很好的解决。就像以前学的输出一个等腰或者直角三角形之类的形状,无非也是下标的变化。于是,,就开.原创 2021-11-11 20:44:58 · 549 阅读 · 0 评论 -
(Python)LeetCode 1:两数之和
知识点:第一题比较简单,主要考察了Python中列表的相关操作,这里对Python的列表进行回顾:列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。列表的数据项不需要具有相同的类型,创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。list1 = ['physics', 'chemistry', 1997, 2000]list2 = [1, 2, 3, 4, 5 ]list3 = ["a", "b", "c", "d"]与字符串的索引一样,列表.原创 2021-11-10 13:55:58 · 112 阅读 · 0 评论 -
(Python)LeetCode 2:两数相加
实现的源代码如下:# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclass Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: ...原创 2021-11-10 13:35:59 · 540 阅读 · 0 评论 -
( Python)LeetCode 9:回文数
这是LeetCode里的一道简单题,拿到这个题目我第一个想的是将数据前后对比,也就是第一个数字和倒数第一个数字对比,第二个数字和倒数第二个数字对比,可能有人会疑问,数字的长度可能是奇数个也可能是偶数个,是否需要分情况讨论,实际上并不需要,并且这种前后对比的方式更快一些。比如 12321 前后对比,第一个和最后一个相等,那么可以继续对比,2和2相等,继续,那么3和3自身相比,相等,则结束判断,这是我的一个基本的思路,这里可以做一个小的改进,比如说,如果是奇数个,假设是n,实际上只需要比对 n/2(向...原创 2021-11-10 11:56:49 · 586 阅读 · 0 评论