![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
汐梦聆海
過去を捨てなくては 未来の場所がない
展开
-
Leetcode 最长不含重复字符的子字符串
解题思路:本题的目的是在给定的字符串中,找出一个不含相同字母的子串。因此首先想到滑动窗口,即给定一个left和一个right,维护一个不包含相同字母子串的窗口。使用一个集合set作为辅助,每次将right向右移动一次,如果right对应的字符没有出现在set中,则无需操作;反之,则清除掉set中所有元素,重新计算滑窗,并将left移动到此时right的位置。right每次向右移动,都让结果res取 max(res, right-left+1)。 AC代码: class Solution { pub.原创 2021-08-21 11:06:43 · 135 阅读 · 2 评论 -
Leetcode 0~n-1中缺失的数字
剑指offer53题: 首先想到的应该是遍历一遍即可,时间复杂度O(n)。 但是,任何已经排好序的数组,如果要做查找功能,都可以用二分法。 本题定义一个left=0,right=length-1。每次计算一个mid=(left+right)/2,如果mid==nums[mid],说明缺失的数字在右侧数组,让left=mid+1;若不等,则说明缺失的数字在左侧数组,让right=mid-1。 AC代码如下: class Solution { public int missingNumber(int[原创 2021-08-15 15:25:09 · 114 阅读 · 0 评论 -
Leetcode复杂链表的复制
题目如下: 可以看出题意是复制带有random指针的链表,该random指针可以指向链表中的任意节点或者null。如果不含有这个random指针,则复制会非常简单,就是每次开辟一个节点前后相连即可。但现在需要时刻保存链表中所有节点的引用信息,使得random指针可以任意的指向链表中的任意节点。 所以这里使用了HashMap<Node, Node>的数据结构,key值存的是原始链表,value则是要去得到的复制后的链表。代码如下: /* // Definition for a Node. cla原创 2021-08-13 10:26:34 · 138 阅读 · 0 评论 -
Leetcode 用两个栈实现队列&包含min函数的栈
剑指offer09. 用两个栈实现队列 思路:栈的特性是先进后出,队列是先进先出。用一个栈A作为存储。另外一个栈B作为辅助。元素入队是直接A.push即可,元素出队需要将栈A的栈底元素弹出,因此先将A中所有元素倒入B中,此时B的栈顶元素就是A的栈底元素(即想要出队的元素),弹出以后再将B中所有元素倒回A中即可。 代码如下: class CQueue { Stack<Integer> s1 = new Stack<>(); Stack<Integer> s2原创 2021-08-12 16:41:09 · 162 阅读 · 0 评论 -
链表逆置Python版本
该题为leetcode剑指offer24题,AC代码如下: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def reverseList(self, head: ListNode) -> ListNode: prev = No原创 2020-09-11 00:23:10 · 837 阅读 · 1 评论 -
【剑指offer题解】leetcode18,20,21
18. 删除链表的节点 思路:数据结构基本操作,为了避免第一个节点的影响,先在开始出加一个值为空的头节点,然后就是常规的链表删除节点操作。 代码: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.nex...原创 2020-04-29 01:52:27 · 715 阅读 · 0 评论 -
【剑指offer题解】leetcode 16 快速幂
16. 数值的整数次方(快速幂) 思路一:不使用库函数pow的话,可以直接写一个循环做即可,时间复杂度为O(n),有可能超时; 思路二:快速幂方法,例如求3的10次方,即 3103^{10}310。首先由于指数是整型,可以将其转化为二进制的形式,即 3(1010)23^{(1010)_{2}}3(1010)2,这个式子可以进一步转化为 (1∗38)∗(0∗34)∗(1∗32)∗(0∗31)(1...原创 2020-04-27 00:30:32 · 708 阅读 · 0 评论 -
【剑指offer题解】leetcode 14,15
14. 剪绳子 I 思路:这个题一开始感觉是dp,但是找不准状态转移方程。看了大神的题解以后才发现这个题有一定的数学推导成分。首先当 x=2 时,只能对应1 * 1;当x=3时,显然 1 * 2 要大于 1 * 1 * 1,这两种情况很容易理解。 有趣的是我们可以得到一个不等式 3*(x-3)>x,当且仅当 x≥\ge≥ 5 时成立,这说明 x≥\ge≥ 5 时,将 x 拆出一个一个的3,...原创 2020-04-26 01:19:36 · 672 阅读 · 0 评论 -
【剑指offer题解】leetcode 12,13
12. 矩阵中的路径 思路:dfs回溯+剪枝即可。剪枝的目的是压缩无用的搜索空间,在已知不可能匹配成功的情况下应立即返回,节省非常多的搜索时间。时间复杂度O(3kMN)O(3^{k}MN)O(3kMN),因为不能往回找所以是3,空间复杂度O(MN)O(MN)O(MN)。 代码: import numpy as np class Solution: def __init__(self):...原创 2020-04-24 00:15:36 · 668 阅读 · 0 评论 -
【剑指offer题解】leetcode 10,11
10- I 斐波那契数列 思路一:打表,O(1)时间复杂度值得拥有; 思路二:每次计算出新的值判断是否大于100000007,若大于求余; 思路三:求余时间较长,可改为若大于100000007,则减掉100000007。因为前面的两个数也都小于100000007,所以新的数不会大于100000007的二倍,放心的做减法就可以了。 代码三: class Solution: def mod(...原创 2020-04-21 16:11:02 · 722 阅读 · 0 评论 -
【剑指offer题解】 leetcode 6,7,9
6. 从尾到头打印链表 思路一:顺序遍历链表,给到list以后反转list 思路二:反转链表,正向输出。个人感觉速度快一点,两个算法同样遍历一次链表,而算法一需要额外的再做list的反转。(不过提交时间反而算法一快 代码一: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # ...原创 2020-04-20 22:08:29 · 721 阅读 · 0 评论 -
【剑指offer题解】 leetcode 3,4,5
3. 数组中重复的数字 思路一:类似于桶排序,用空间换时间,开一个大小为n的bucket数组,令每个值为1。遍历一遍原始数组,遇到某个元素就在bucket数组的对应的位置减1,直到找到第一个小于0的。时间复杂度O(n),空间复杂度O(n)。 思路二:利用set的特点,遍历一遍,判断每个元素是否出现在set中。如果没出现则加入到set,若之前出现过则返回。这种做法感觉时间比前一种稍慢(多的时间是判...原创 2020-04-20 20:23:36 · 733 阅读 · 0 评论