![](https://img-blog.csdnimg.cn/20190927151053287.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode&剑指offer刷题之路
刷题刷题
InceptionZ
这个作者很懒,什么都没留下…
展开
-
【LC1143】最长公共子序列
class Solution: def longestCommonSubsequence(self, text1: str, text2: str) -> int: m, n = len(text1), len(text2) dp = [[0] * (n + 1) for _ in range(m + 1)] for i in range(1, m + 1): for j in range(1, n +.原创 2021-07-26 09:46:45 · 96 阅读 · 0 评论 -
【LC003】无重复字符的最长子串
class Solution: def lengthOfLongestSubstring(self, s: str) -> int: # 哈希集合,记录每个字符是否出现过 occ = set() n = len(s) # 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动 rk, ans = -1, 0 for i in range(n): if i .原创 2021-07-26 09:39:24 · 105 阅读 · 0 评论 -
【LC23】合并K个有序链表
class Solution: def mergeKLists(self, lists: List[ListNode]) -> ListNode: n = len(lists) if n == 0: return None if n == 1: return lists[0] mid = n // 2 return self.mergeTwoLists(self.mergeKLists(list.原创 2021-07-26 09:33:48 · 66 阅读 · 0 评论 -
【LC】面试题 02.05. 链表求和
class Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: head = ListNode(-1) p = head carry = 0 while l1 or l2 or carry: n = (l1.val if l1 else 0) + (l2.val if l2 else 0原创 2021-07-19 22:07:02 · 94 阅读 · 0 评论 -
【360集团】给定无序数组A,在线性时间内找到i和j,j>i,并且保证A[j]-A[i]是最大的,要求O(n)。
给定无序数组A,在线性时间内找到i和j,j>i,并且保证A[j]-A[i]是最大的,要求O(n)。思路:1.显然,j的取值范围在(1,len(array))2.移动j,每次移动,更新差的最大值和最小值指针代码:def findMax(array): minValue = array[0] res = -2121 for j in range(1,len(array)): res = max(array[j]-minValue,minValue)原创 2021-06-28 22:07:21 · 92 阅读 · 0 评论 -
【快手】二叉树的前中后序遍历递归与非递归python
class Node(object): def __init__(self, val, left=None, right=None): self.val = val self.left = left self.right = right# 前序 递归def pre_order_recur(root): if not root: return print(root.val) pre_order_recur(原创 2021-06-27 23:20:13 · 95 阅读 · 1 评论 -
【LC92】——翻转链表II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。1. 思路2. 代码# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclass Solution: def reverseBetween(s原创 2021-02-28 16:58:22 · 117 阅读 · 1 评论 -
【LC257】——二叉树的所有路径(DFS)
给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。1. 思路2. 代码# 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 = rightclas原创 2021-02-28 16:04:51 · 98 阅读 · 0 评论 -
【LC3】——无重复字符的最长子串(滑动窗口)
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。1. 思路2. 代码class Solution: def lengthOfLongestSubstring(self, s: str) -> int: if len(s) == 0:return 0 if len(s) == 1:return 1 m = len(s) hashset = set() ans = 0 left原创 2021-02-28 15:18:32 · 202 阅读 · 1 评论 -
【LC64】——最小路径和(DP)
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。1. 思路2. 代码class Solution: def minPathSum(self, grid: List[List[int]]) -> int: m = len(grid) n = len(grid[0]) dp = [[0]*n for _ in range(m)]原创 2021-02-27 22:33:29 · 104 阅读 · 0 评论 -
【LC62】——不同路径(DP)
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?1. 思路2. 代码class Solution: def uniquePaths(self, m: int, n: int) -> int: if m == 1 or n == 1:return 1 if m == 0 or n =原创 2021-02-27 21:32:13 · 102 阅读 · 0 评论 -
【LC1306】——跳跃游戏III
这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]。请你判断自己是否能够跳到对应元素值为 0 的 任一 下标处。注意,不管是什么情况下,你都无法跳到数组之外。1. 思路1.1 广度优先遍历(BFS)1.2 深度优先遍历将给定的start当作树的根节点,将start+arr[start]和start-arr[start]当作树的左右子树,即可构造一个深度优先遍历模型。2. 代码原创 2021-02-27 16:22:37 · 150 阅读 · 0 评论 -
【LC55】——跳跃游戏I(贪心)
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。1. 思路(贪心)2. 代码class Solution: def canJump(self, nums: List[int]) -> bool: max_step = 0 # 当前能到达的最远位置 N = len(nums) for i in range(N):# i为当前位置原创 2021-02-27 14:53:56 · 102 阅读 · 0 评论 -
两个有序数组中第k小的数
1. 题目描述给定两个升序数组a和b,且两个数组的交集为空,a的数组长度为m,b的数组长度为n,求两个升序数组的全局第k小的数。(m >> k,n >> k)2. 思路2.1 双指针法为两个数组个定义一个指针,开始指向第一个元素,,然后判断大小,两个指针一共移动k步即可2.2 二分法3. 代码3.1 双指针法# -*- coding:utf-8 -*-class Solution: def Pointer_find_Kth(self, arrayA,arr原创 2021-02-24 13:14:55 · 1821 阅读 · 0 评论 -
【LC123】——股票买卖的最佳时机III(困难DP)
1. 思路明天更新,比较难2. 代码class Solution: def maxProfit(self, prices: List[int]) -> int: if prices == []:return 0 N = len(prices) dp = [[0] * N for _ in range(3)] # dp状态矩阵,在这里是利润矩阵 # 控制当天是第i次交易 for i in range(1,3.原创 2021-02-22 22:19:58 · 145 阅读 · 1 评论 -
【LC122】——买卖股票的最佳时机II
1. 思路2. 代码class Solution: def maxProfit(self, prices: List[int]) -> int: ans = 0 N = len(prices) for i in range(1,N): if prices[i] > prices[i-1]: ans += (prices[i] - prices[i-1]) .原创 2021-02-22 16:16:57 · 73 阅读 · 0 评论 -
【LC121】买卖股票的最佳时机I
1. 思路2. 代码class Solution: def maxProfit(self, prices: List[int]) -> int: max_profit = 0 min_price = int(1e9) for price in prices: max_profit = max(max_profit,price-min_price) min_price = min(min_pr.原创 2021-02-22 15:41:24 · 69 阅读 · 0 评论 -
【LC005】——最长回文子串(DP)
1. 思路——动态规划1.1 将原问题分解为子问题原问题:求最长回文子串分析:抛开最长不说,因为这是比较的问题,问题转换为判断给定字符串s的子串是否是回文子串分解问题:对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。1.2 确定状态1.3 确立边界状态对于长度为 1 的子串,它显然是个回文串;对于长度为 22的子串,只要它的两个字母相同,它就是一个回文串。因此我们就可以写出动态规划的边界条件:1.4 确立状态转移方程2. 代码.原创 2021-02-21 20:28:17 · 146 阅读 · 0 评论 -
【LC1004】——最大连续1的个数III
思路——滑动窗口2. 代码class Solution: def longestOnes(self, A: List[int], K: int) -> int: array_len = len(A) zeros = 0 left = 0 right = 0 res = 0 while right < array_len: # 记录由右指针影响‘0’的个数情况.原创 2021-02-21 16:19:18 · 101 阅读 · 0 评论 -
【LC25】——K个一组翻转链表
1. 思路2. 代码# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclass Solution: def reverseKGroup(self, head: ListNode, k: int) -> ListNode: .原创 2021-02-18 21:53:59 · 82 阅读 · 0 评论 -
剑指offer30——连续子数组的最大和
1. 思路2. 代码# -*- coding:utf-8 -*-class Solution: def FindGreatestSumOfSubArray(self, array): # write code here if not array: return # 记录以某个数字结尾的当前最大和 curSum = 0 # 记录最终返回值,初始化为数组的第一个元素 res .原创 2021-02-04 21:40:29 · 84 阅读 · 0 评论 -
剑指offer27——字符串的排列
1. 思路动态规划2. 代码# -*- coding:utf-8 -*-class Solution: def Permutation(self, ss): # write code here n = len(ss) queue = list(ss) res = [] # 固定第x位上的字符 def fix(x): # 当固定到最后一位时,当前的递归结束.原创 2021-02-04 21:13:45 · 74 阅读 · 0 评论 -
剑指offfer51——构建乘积数组
1. 思路中规中矩。直接上代码2. 代码# -*- coding:utf-8 -*-class Solution: def multiply(self, A): # write code here if len(A) <= 1:return [] B =[] for i in range(len(A)): # i对应B中的每一个元素 tmp = 1 if i == 0: .原创 2021-02-02 12:12:48 · 74 阅读 · 0 评论 -
剑指offer46——孩子们的游戏圆圈中最后剩下的数(约瑟夫环)
1. 思路认真审题,思考两个主要问题:(1) 如何解决重新开始报数问题(2) 如何解决周期问题2. 代码# -*- coding:utf-8 -*-class Solution: def LastRemaining_Solution(self, n, m): # write code here round = list(range(n)) index = -1 while len(round) > 1: .原创 2021-02-02 11:09:49 · 92 阅读 · 0 评论 -
剑指offer43——左旋转字符串
1. 思路左移循环,K可能大于字符串长度,即移动了一个周期,只要考虑到这一点就行了。2. 代码# -*- coding:utf-8 -*-class Solution: def LeftRotateString(self, s, n): # write code here if n == 0:return s if n == len(s): return s if s == '':return '' movem.原创 2021-02-02 09:55:07 · 87 阅读 · 0 评论 -
剑指offer42——和为S的两个数字(双指针思想)
1. 思路双指针法:因为数组是有序的,所以可以用双指针,指向数组的首尾,具体步骤如下:1.初始化:指针i指向数组首, 指针j指向数组尾部2. 如果arr[i] + arr[j] == sum , 说明是可能解3. 否则如果arr[i] + arr[j] > sum, 说明和太大,所以–j4. 否则如果arr[i] + arr[j] < sum, 说明和太小,所以++i代码# -*- coding:utf-8 -*-class Solution: def FindNum.原创 2021-02-01 22:54:14 · 83 阅读 · 0 评论 -
剑指offer41——和为S的连续正数序列(滑动窗口思想)
1. 思路滑动窗口(毛毛虫蠕动,窗口大小会变):如果窗口内数值加和小于目标值,则窗口右边界右移一个数;如果窗口内数值加和大于目标值,则窗口左边界右移一个数。何时停止蠕动?左边界达到目标值的一半即要停止2. 代码# -*- coding:utf-8 -*-class Solution: def FindContinuousSequence(self, tsum): # write code here if tsum == 1 or tsum == 2:.原创 2021-02-01 21:40:54 · 67 阅读 · 0 评论 -
剑指offer33——丑数
1. 思路构建三个指针,在每一个位置上,乘完一个质数后,指向该质数的指针要向后移2. 代码# -*- coding:utf-8 -*-class Solution: def GetUglyNumber_Solution(self, index): # write code here if index == 0:return 0 ulgy_num = [1] two = 0 three = 0 f.原创 2021-02-01 17:07:27 · 99 阅读 · 1 评论 -
剑指offer32——把数组排成最小的数
代码# -*- coding:utf-8 -*-class Solution: def PrintMinNumber(self, numbers): # write code here # O(n**2) for i in range(len(numbers)-1): # 找到numbers[i]的位置 for j in range(i+1,len(numbers)): if int(str(numbe.原创 2021-02-01 15:32:42 · 65 阅读 · 0 评论 -
剑指offer31——整数中1出现的次数(从1到n整数中1出现的次数)
代码# -*- coding:utf-8 -*-class Solution: def NumberOf1Between1AndN_Solution(self, n): # write code here count = 0 for i in range(1,n+1): mod = 0 while i: mod = i % 10 if .原创 2021-02-01 15:19:15 · 76 阅读 · 0 评论 -
剑指offer28——数组中出现次数超过一半的数字
代码# -*- coding:utf-8 -*-class Solution: def MoreThanHalfNum_Solution(self, numbers): # write code here dict_ = {} for item in numbers: dict_[item] = 1 if item not in dict_ else dict_[item] + 1 .原创 2021-02-01 15:11:51 · 94 阅读 · 0 评论 -
剑指offer13——调整数组顺序使奇数位于偶数前面
代码## # @param array int整型一维数组 # @return int整型一维数组#class Solution: def reOrderArray(self , array ): # write code here list_odd = [] list_even = [] for i in array: if i % 2 == 0: list_eve.原创 2021-02-01 15:06:55 · 60 阅读 · 0 评论 -
剑指offer40——数组中只出现一次的数字
代码# -*- coding:utf-8 -*-class Solution: # 返回[a,b] 其中ab是出现一次的两个数字 def FindNumsAppearOnce(self, array): # write code here dict_ = {} res = [] for item in array: dict_[item] = 1 if item not in dict_ else .原创 2021-02-01 14:58:08 · 66 阅读 · 0 评论 -
剑指offer12——数值的整数次方
1. 思路(1) 直接适用pow函数(2) 适用pow函数源码的思路2. 代码# -*- coding:utf-8 -*-class Solution: def Power(self, base, exponent): # write code here if exponent < 0: base = 1/base exponent = -exponent x = base .原创 2021-02-01 11:58:02 · 71 阅读 · 0 评论 -
剑指offer11——二进制中1的个数
1. 思路问题:如何解决负数补码问题?(与全1进行与操作)2. 代码# -*- coding:utf-8 -*-class Solution: def NumberOf1(self, n): # write code here res = 0 while n & 0xffffffff != 0: n = n & (n-1) res += 1 return re.原创 2021-02-01 11:29:51 · 98 阅读 · 0 评论 -
剑指offer10——矩形覆盖
1. 思路递推2. 代码# -*- coding:utf-8 -*-class Solution: def rectCover(self, number): # write code here x,y = 1,2 if number == 0:return 0 for i in range(number-1): y = x + y x = y - x r.原创 2021-01-31 11:32:17 · 78 阅读 · 0 评论 -
剑指offer37——数字在排序数组中出现的次数(二分查找)
1. 思路基本法或者二分法(推荐),题目说是排序,得用上2. 代码# -*- coding:utf-8 -*-class Solution: def GetNumberOfK(self, data, k): # write code here # method1 时间:O(n),空间:O(n)# if k not in data:return 0# dict_ = {}# for num in data:.原创 2021-01-29 21:53:22 · 75 阅读 · 0 评论 -
剑指offer09——变态跳台阶(DP)
1. 思路1.1 暴力1.2 找出规律2. 代码2.1 暴力int jumpFloorII(int n) { if (n==0 || n==1) return 1; vector f(n+1, 0); f[0] = f[1] = 1; for (int i=2; i<=n; ++i) { for (int j=0; j<i; ++j) { f[i] += f[j]; } } r.原创 2021-01-29 21:04:22 · 74 阅读 · 0 评论 -
剑指offer08——跳台阶(DP)
1. 思路2. 代码# -*- coding:utf-8 -*-class Solution: def jumpFloor(self, number): # write code here x,y = 1,1 for i in range(number): # x 指的是f(N-2),y指的是f(N-1) x,y = y,x+y return x...原创 2021-01-29 17:00:25 · 101 阅读 · 0 评论 -
剑指offer07——斐波那契数列
1. 思路自底向上计算2. 代码# -*- coding:utf-8 -*-class Solution: def Fibonacci(self, n): # write code here x , y = 0,1 while n != 0: y = x + y x = y - x n -= 1 return x...原创 2021-01-29 16:35:56 · 58 阅读 · 0 评论