LeetCode
strawberry47
研究方向:强化学习、推荐系统、多智能体。
qq邮箱:[email protected]
展开
-
[牛客网刷题 Day6] JZ27 二叉树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。返回的是一棵树,那得建立TreeNode吧,想到了两种方法: ① 使用队列,从右往左存node,这样读出来的顺序就是镜像的;可是答案要求输出一颗树,我不知道怎么转换成树 ② 使用递归,当孩子为叶节点时,交换左右节点的位置;可是还是写不来,o(╥﹏╥)o偷偷看了答案,用堆栈存储节点,每次取出来就交换左右节点,于是照着这个思路写了一下代码: 答案: 看了看递归: 解题步骤: 1、特判:如果pRoot为空,返回空 2、交换左右子树 3、把pRoot的左子树放到Mirro原创 2022-07-05 10:29:15 · 199 阅读 · 0 评论 -
[牛客网刷题 Day5] JZ77 按之字形顺序打印二叉树
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 拿到题目的第一想法就是–使用队列呀,奇偶的时候存的东西不一样;行不通。。。 后来又想到使用双边队列,分情况从哪边进哪边出,发现找不到什么规律。。。看了答案,发现用到了两个栈;也有使用队列,只不过每隔一层就反向打印一下 根据reverse的思路,我花了二十分钟写出来了代码: 答案: 双栈(没咋看明白):...原创 2022-07-05 09:38:40 · 95 阅读 · 0 评论 -
[牛客网刷题 Day4] JZ32 从上往下打印二叉树
不分行从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如输入{8,6,10,#,#,2,1},如以下图中的示例二叉树,则依次打印8,6,10,2,1(空节点不打印,跳过),请你将打印的结果存放到一个数组里面,返回。可以用队列的思路: 答案 答案里有递归的思路,还是搞不太明白是咋回事呢...原创 2022-07-03 20:16:41 · 86 阅读 · 0 评论 -
[牛客网刷题 Day4] JZ55 二叉树的深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。 第一次遇到树的题目,有一点点懵逼,不太懂他的构建过程 第一反应是用递归,因为结束的条件很容易想到嘛:左节点右节点都为空 but,我不知道应该怎么移动根节点耶。。。看了答案,也用到了递归的思想: 有点懵。。递归好难啊o(╥﹏╥)o 还可以用到队列的思想: 队列的思路容易理解一些,就是将每一层都存进去,看看能存多少层,就加一...原创 2022-07-03 17:09:39 · 137 阅读 · 0 评论 -
[牛客网刷题 Day4] JZ35 复杂链表的复制
看不懂题目,好像输入和输出一样?? 哦!原来是每个节点后面跟了一个next指针和random指针哦想法: 用一个list存储所有的random节点,再把他们加到常规链表后面。 但是null节点没法加next了,而且一开始dummy=pHead,那就一直有random存在。。。啊啊w(゚Д゚)w,原来我搞错题意了!!题目是要求深拷贝,并不是把节点串起来呀!思路:建立一个字典,key是当前node的值,value是random的值;然后遍历这个字典。 参考答案: 思路有点类似,也是创建了一个哈希表,key是当前原创 2022-07-03 15:10:35 · 140 阅读 · 0 评论 -
[牛客网刷题 Day4] JZ76 删除链表中重复的结点(递归)
题目描述: 思考: 刚开始的想法:弄一个set,存下所有节点的不重复val,最后再组合成链表。转头一想,组合成新链表好麻烦哦。 那就,phead往下走一步,如果值出现在set中,就再往下走,应该就可以啦~ 哎呀,好像没有我想的那么简单呢 if pHead is None: return None res = before = pHead num = set() while pHead: if pHead.v原创 2022-04-21 17:11:46 · 459 阅读 · 0 评论 -
[牛客网刷题 Day4] JZ23 链表中环的入口结点
题目描述: 思考: 建立一个list,存储节点,出现重复,就返回。 class Solution: def EntryNodeOfLoop(self, pHead): if pHead is None or pHead.next is None: return None mem = [] while pHead not in mem: mem.append(pHead) pHea原创 2022-04-21 12:25:24 · 371 阅读 · 0 评论 -
[牛客网刷题 Day3] JZ18 删除链表的节点
题目 思考: 记录目标节点前的位置before,以及目标节点以后的位置after,再用before.next=after,不过还是遇到了老问题!before走着走着,就丢掉了前面的点了!需要一个dummy=before,指向同一个地址,再让before指向after,就好啦。 其实不要after节点也可以呢,before指向cur.next也是一样的道理呢。 class Solution: def deleteNode(self , head: ListNode, val: int) ->原创 2022-04-18 21:36:16 · 194 阅读 · 0 评论 -
[牛客网刷题 Day3] JZ23 链表中倒数最后k个结点
题目描述:原创 2022-04-18 20:31:39 · 293 阅读 · 1 评论 -
[牛客网刷题 Day2] JZ52 两个链表的第一个公共结点(没做出来)双指针巧解
题目描述: 思考过程: 好像想的太复杂了,首先固定phead1,寻找val一样的phead2,找到的话,就都往右移动一位;否则phead+1。可是需要注意好多好多的边界啊,写了一两个小时,最后还是好几个用例通不过,只能根据用例慢慢改,可是怎么改都不对。 class Solution: def FindFirstCommonNode(self , pHead1 , pHead2): # write code here if pHead1==None or pHead2原创 2022-04-18 00:09:55 · 315 阅读 · 0 评论 -
[牛客网刷题 Day2] JZ25 合并两个排序的链表
题目描述 啊,这道题我在LeetCode上做过呢! 思路: 知道怎么比较,怎么排序;但是不知道链表要怎么处理,因为它只有两个属性,当head移动到next,前面的节点信息就不在了,不知道怎么保存。即,不会按照顺序添加节点。 可以使用一个列表,将所有的val按照顺序存起来,最后再转换成链表,可是题目肯定不希望我这样解决嘛,得从链表的性质入手解决才行。 偷偷看了一下答案,原来用到了递归;还发现了一个神奇的方法: 初始化的时候,使用res = dummy = ListNode(0),这样res.next后,du原创 2022-04-17 16:03:10 · 311 阅读 · 1 评论 -
[牛客网刷题 Day1] JZ24 反转链表
题目描述: 心路历程: 思路不难,但是写出来好难啊,各种边界条件都要注意 输入为空链表时,不知道怎么做。。。 原来是 head == None class Solution: def ReverseList(self , head: ListNode) -> ListNode: # write code here if head == None: return head last = ListNode(head.val)原创 2022-04-15 14:38:01 · 377 阅读 · 0 评论 -
[牛客网刷题 Day1] JZ6 从尾到头打印链表
题目描述 输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。 如输入{1,2,3}的链表如下图: 返回一个数组为[3,2,1],0 <= 链表长度 <= 10000 思考过程: 之前在LeetCode做过这道题,可是现在看到又做不来了,难受。。。 想不起来怎么构造链表了,上次也是 o(╥﹏╥)o 第一反应是,先用list列表存储ListNode的所有值,再reverse返回。需要注意一下终止条件~ 注意一下,res.reverse()可以让res反转,返回值是none哦原创 2022-04-15 13:37:53 · 292 阅读 · 0 评论 -
LeetCode 刷题小本本Day10 Search Insert Position (二分法)
题目 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法 我的答案 看到时间复杂度要求O(log n),立马想到了二分法~ 有个地方差点出错:循环的条件应该是while right>=left class Solution: def searchInsert(self, nums: List[int], target: int) -> int: left原创 2021-11-03 14:38:13 · 84 阅读 · 2 评论 -
LeetCode 刷题小本本Day9 Letter Combinations of a Phone Number (回溯)
题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 我的答案: 读懂题目之后,感觉挺简单的呀,不就是两两组合吗,可是后来仔细一想,如果一下子输入8个数字,岂不是要循环8次啊。 写的时候发现一个问题:我一开始并不知道需要循环多少次呀,不能直接写for循环呀。 想到的笨办法:建立一个字典存储每个数字的value;设置8次循环,如果数字没有出现在digits中就把字典的value设为空。原创 2021-11-02 10:30:51 · 4474 阅读 · 0 评论 -
LeetCode 刷题小本本Day8 Container With Most Water (双指针)
题目: 给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 我的答案: 转化成求min(xj,xi)∗(xj−xi)min(x_j,x_i)*(x_j-x_i)min(xj,xi)∗(xj−xi)最大值。 一开始用的是很粗暴的方法,遍历两遍列表,结果超出时间限制ε=(´ο`*)))唉 后来想到,能不能用原创 2021-10-29 16:58:46 · 3256 阅读 · 1 评论 -
LeetCode 刷题小本本Day7 Merge Two Sorted Lists(递归)
题目: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 我的方法: 第一眼看见就觉得和Day2的题目很像啊,都是链表,不过上一个是将两个链表加起来,这个是比较大小。 dummy=curr=ListNode(),中途只更改curr(curr.next = ListNode(x)),最后返回dummy.next。 因为是比较大小,所以用到了前几天学到的float('inf')正无穷,当走到节点末尾时,就赋值正无穷。 看了答案之后,原来还可以用递归的思路解。原创 2021-10-28 11:02:16 · 94 阅读 · 0 评论 -
LeetCode 刷题小本本Day6 Longest Palindromic Substring(动态规划)
题目: 给你一个字符串 s,找到 s 中最长的回文子串。 我的方法: 因为回文串肯定有重复字符,所以首先去掉无重复字符的情况。 一开始想的是,找出重复字符出现的位置,然后判断那一串是否是回文。但是,一个字符可能出现很多次,这个方法不行。 后来又想到之前做过的一道,用到了滑动窗口的题目。之前那道题是寻找最长不重复子串,每次没有循环完整个字符串。这道题目需要循环完整个字符串。 我的思路是:滑动窗口不停移动,直到找到一个值与substring[0]相同,判断是否是回文。 好不容易写出来了,但是说超时了。又试了好原创 2021-10-28 00:01:19 · 129 阅读 · 0 评论 -
LeetCode 刷题小本本Day5 Median of Two Sorted Arrays(二分法)
题目: 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 我的答案: class Solution: def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: curr1 = 0 curr2 = 0 flag1 = 0 flag2 = 0原创 2021-10-26 12:54:12 · 82 阅读 · 0 评论 -
LeetCode 刷题小本本Day4 Longest Substring Without Repeating Characters(滑动窗口)
题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 我的答案: class Solution: def lengthOfLongestSubstring(self, s:str): res_max = 0 for iter in range(len(s)): max_len = [] for i in range(len(s)-iter): if s[i+iter原创 2021-10-25 17:20:17 · 2744 阅读 · 0 评论 -
LeetCode 刷题小本本Day3 Valid Parentheses(栈)
题目 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 我的答案: class Solution: def isValid(self, s: str) -> bool: res_bool = True # 是奇数,肯定不对嘛 if (len(s)%2 != 0): res_bool =原创 2021-10-25 00:04:07 · 93 阅读 · 1 评论 -
LeetCode 刷题小本本Day2 Add Two Numbers(链表)
题目: You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list. 从八点半做到了 解题过程: 一开始题目都没看懂o原创 2021-10-24 15:36:25 · 105 阅读 · 1 评论 -
LeetCode 刷题小本本Day1 Two Sum(hashmap)
(1) Two Sum 题目: Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target. 给定一个list和target,找到list中加起来等于target的索引,不能重复使用值。 我的答案: def twoSum1(self, nums, target): """ :type nu原创 2021-10-22 23:16:17 · 972 阅读 · 2 评论