![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
开发
文章平均质量分 53
zhuxiaohai68
这个作者很懒,什么都没留下…
展开
-
leetcode151 翻转字符串里的单词
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。说明:输入字符串 s 可以在前面、后面或者单词间包含多余的空格。翻转后单词间应当仅用一个空格分隔。翻转后的字符串中不应包含额外的空格。示例 1:输入:s = “the sky is blue”输出:“blue is sky the”示例 2:输入:s = " hello world "输出:“worl原创 2022-06-09 18:14:16 · 88 阅读 · 0 评论 -
leetcode491 递增子序列
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。示例 1:输入:nums = [4,6,7,7]输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]示例 2:输入:nums = [4,4,3,2,1]输出:[[4,4]]原创 2022-06-01 16:38:31 · 90 阅读 · 0 评论 -
leetcode 674 最长递增子串
无原创 2022-05-31 21:04:48 · 272 阅读 · 0 评论 -
leetcode 300. 最长递增子序列
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例 1:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例 2:输入:nums = [0,1,0,3,2,3]输出:4示例 3:输入:nums = [7,7,7,7,7,7,7原创 2022-05-31 17:31:59 · 100 阅读 · 0 评论 -
leetcode 718 最长公共子串
给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。示例 1:输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]输出:3解释:长度最长的公共子数组是 [3,2,1] 。示例 2:输入:nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0]输出:5和子序列不一样的是‘abc’ 与’abd’最长公共子串为’ab’,长度为2,但是添加一位以后,‘abcd’与’abdd’即便最后一位相同,原创 2022-05-31 16:39:09 · 527 阅读 · 0 评论 -
leetcode 647. 回文子串
给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:输入:s = “abc”输出:3解释:三个回文子串: “a”, “b”, “c”示例 2:输入:s = “aaa”输出:6解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”状态:dp[i][j] 表示字原创 2022-05-31 15:24:16 · 75 阅读 · 0 评论 -
leetcode 1143 最长公共子序列
给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。示例 1:输入:text1 = “abcde”, text2 = “ace”原创 2022-05-20 13:35:55 · 156 阅读 · 1 评论 -
堆的python实现
from binary_tree import Nodeclass PerfectBinaryTree(Node): def is_empty(self): if not self.item: return True def add_one(self, data): if self.is_empty(): self.item = data return queue原创 2022-05-20 09:55:08 · 213 阅读 · 0 评论 -
二叉树的python实现
二叉class Node(object): def __init__(self, item=None, lchild=None, rchild=None): self.item = item self.lchild = lchild self.rchild = rchilddef build_tree1(preorder, inorder): if len(preorder) == 0: return None原创 2022-05-20 09:51:42 · 285 阅读 · 0 评论 -
leetcode392 判断子序列
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。进阶:如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?致谢:特别感谢 @pbrother 添加此问题并且创建所有测试用例。示例 1:输入:s = “abc”, t原创 2022-05-19 14:57:32 · 106 阅读 · 0 评论 -
leetcode 125 验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例 1:输入: “A man, a plan, a canal: Panama”输出: true解释:“amanaplanacanalpanama” 是回文串示例 2:输入: “race a car”输出: false解释:“raceacar” 不是回文串class Solution(object): def isPalindrome(self, s)原创 2022-05-19 11:28:00 · 81 阅读 · 0 评论 -
单链表的python实现_无头结点
无头结点的单链表class ListNode(object): def __init__(self, value=0, next=None): self.value = value self.next = nextdef BuildListNode(l: list): if not l: return None head = ListNode(l[0]) temp = head for elem in l[1:]原创 2022-05-18 19:00:52 · 303 阅读 · 0 评论 -
链表的python实现_带头结点
单链表的增删改查class ListNode(object): def __init__(self, value=0, next=None): self.value = value self.next = nextdef BuildListNode(l: list): head = ListNode() temp = head for elem in l: temp.next = ListNode(elem)原创 2022-05-18 18:56:53 · 439 阅读 · 0 评论 -
插入排序算法
def insertion_sort_v2(nums): n = len(nums) # 从第二个数开始往后遍历 for i in range(1, n, 1): # 加速方法: 既然i-1之前的所有元素都是有序的,如果i比i-1的大,则不用多次一举从前到后了 # 只有i比i-1对应的元素小,才需要与前面的比较 if nums[i-1] <= nums[i]: continue temp原创 2022-04-21 09:45:38 · 321 阅读 · 0 评论 -
leetcode 1 twosum
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]使用查找表记录元素的值与...原创 2022-03-31 09:14:46 · 55 阅读 · 0 评论 -
二分查找法
由于每次查找都会将查找范围缩小一半,因此二分查找的时间复杂度是O(logN) ,二分查找的条件是查找范围不为空,即left<=right 。class Solution: def search(self, nums: List[int], target: int) -> int: left = 0 right = len(nums) - 1 while left <= right: mid = (rig原创 2022-03-26 16:43:30 · 5517 阅读 · 0 评论 -
leetcode 230 二叉搜索树中第K小的元素
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。输入:root = [3,1,4,null,2], k = 1输出:1因为二叉搜索树和中序遍历的性质,所以二叉搜索树的中序遍历是按照键增加的顺序进行的。于是,我们可以通过中序遍历找到第 k 个最小元素。# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, lef原创 2022-03-26 16:28:40 · 726 阅读 · 0 评论 -
leetcode112 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true解释:等于目标和的根节点到叶节点路径如上图所示。广度优先记录从根节点到当前节点的路径和原创 2022-03-22 15:45:21 · 533 阅读 · 0 评论 -
leetcode 111 二叉树的最小深度
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。首先可以想到使用后序深度优先搜索的方法,对于每一个非叶子节点,我们只需要分别计算其左右子树的最小叶子节点深度。这样就将一个大问题转化为了小问题,可以递归地解决该问题。时间复杂度O(n), n为节点个数, 空间复杂度O(logn)取决于栈空间# Definition for a binary tree node.# class TreeNode:# def __in原创 2022-03-21 22:49:11 · 510 阅读 · 0 评论 -
leetcode231 2的幂
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。示例 1:输入:n = 1输出:true解释:20 = 1示例 2:输入:n = 16输出:true解释:24 = 16示例 3:输入:n = 3输出:false示例 4:输入:n = 4输出:true示例 5:输入:n = 5输出:false思路与算法一个数n是 2的幂,当且仅当 n是正整原创 2022-03-16 12:56:06 · 313 阅读 · 0 评论 -
leetcode394 字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。示例 1:输入:s = “3[a]2[bc]”输出:“aaabcbc”示例 2:输入:s = “3[原创 2022-03-16 10:31:43 · 104 阅读 · 0 评论 -
leetcode 680 验证回文字符串II
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。示例 1:输入: s = “aba”输出: true示例 2:输入: s = “abca”输出: true解释: 你可以删除c字符。示例 3:输入: s = “abc”输出: false首先判断原始字符串是否是回文串,如果是,就返回 True, 用双指针的时间复杂度O(n);如果不是,则枚举每一个位置作为被删除的位置,再判断剩下的字符串是否是回文串。这种做法的渐进时间复杂度是n-1 + n-2+ …1=n(n-1)/2原创 2022-03-15 21:57:32 · 70 阅读 · 0 评论 -
leetcode 147 对链表进行插入排序
给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。输入: head = [4,2,1,3]输出: [1,2,3,4]插入排序的基本思想是,维护一个有序序列,初始时有序序列只有一个元素,每次将一个新的元素插入到有序序列中,将有序序列的长度增加 ,直到全部元素都原创 2022-03-13 22:49:14 · 114 阅读 · 0 评论 -
leetcode 148 排序链表
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。输入:head = [4,2,1,3]输出:[1,2,3,4]插入排序的时间复杂度是 O(n2),这道题考虑时间复杂度更低的排序算法。题目的进阶问题要求达到 O(nlogn) 的时间复杂度和 O(1) 的空间复杂度,时间复杂度是 O(nlogn) 的排序算法包括归并排序、堆排序和快速排序,其中最适合链表的排序算法是归并排序。归并排序基于分治算法。最容易想到的实现方式是自顶向下的递归实现,考虑到递归调用的栈空间,自顶向下归并排序的原创 2022-03-13 17:39:01 · 860 阅读 · 0 评论 -
leetcode 83 删除排序链表中的重复元素
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。输入:head = [1,1,2]输出:[1,2]由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。具体地,我们用指针 cur 指向链表的头节点,随后开始对链表进行遍历。如果当前 cur与 cur.next 对应的元素相同,那么我们就将cur.next从链表中移除, 但是注意这个时候cur位置没有变,继续判断cur与cur原创 2022-03-12 17:38:30 · 236 阅读 · 0 评论 -
leetcode 227 基本计算器II
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。示例 1:输入:s = “3+2*2”输出:7示例 2:输入:s = " 3/2 "输出:1示例 3:输入:s = " 3+5 / 2 "输出:5首先 s一定是个正确的表达式,不存在4 / 0这样的式子由于乘除优先于加减计算,因此不妨考虑先进行所有乘除运算,并将这些乘除运算后的整数值放回原表达式的相应位置,则随后整个表达式的值,就等于一系列整数加减后的值。基于此,我们可以用一个栈,保存这些(原创 2022-03-12 13:44:36 · 256 阅读 · 0 评论 -
leetcode 844 比较含退格的字符串
给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,请你判断二者是否相等。# 代表退格字符。如果相等,返回 true ;否则,返回 false 。注意:如果对空文本输入退格字符,文本继续为空。示例 1:输入:s = “ab#c”, t = “ad#c”输出:true解释:S 和 T 都会变成 “ac”。示例 2:输入:s = “ab##”, t = “c#d#”输出:true解释:s 和 t 都会变成 “”。示例 3:输入:s = “a##c”, t = “#a#c”原创 2022-03-11 19:41:48 · 397 阅读 · 0 评论 -
leetcode155 最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,null,-3,原创 2022-03-11 18:37:35 · 103 阅读 · 0 评论 -
leetcode 82 删除排序链表中的重复元素 II
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。输入:head = [1,2,3,3,4,4,5]输出:[1,2,5]输入:head = [1,1,1,2,3]输出:[2,3]思路与算法由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。由于链表的头节点可能会被删除,因此我们需要额外使用一个哑节点(dummy node)指向链表的头节点。具体地,我们用 c原创 2022-03-10 21:47:21 · 337 阅读 · 0 评论 -
leetcode 160 相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。自定义评测:评测系统 的输入如下(你设计的程序 不适用 此输入):intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0listA - 第一个链表listB - 第二个链表skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数原创 2022-03-10 21:14:33 · 338 阅读 · 0 评论 -
leetcode516 最长回文子序列
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。示例 1:输入:s = “bbbab”输出:4解释:一个可能的最长回文子序列为 “bbbb” 。示例 2:输入:s = “cbbd”输出:2解释:一个可能的最长回文子序列为 “bb” 。什么叫回文,收尾相等即回文。子序列和子串不一样,子串值的是原始序列不能有任何增删而框选出来的会回文,而子序列的意思是可以在原始序列上增删某些元素得到一原创 2022-03-09 14:46:39 · 180 阅读 · 0 评论 -
leetcode 771 宝石与石头
给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。字母区分大小写,因此 “a” 和 “A” 是不同类型的石头。示例 1:输入:jewels = “aA”, stones = “aAAbbbb”输出:3示例 2:输入:jewels = “z”, stones = “ZZ”输出:0如果暴力求解,则时间复杂度为O(MN),可以利用哈希表用空间换时间。时间复原创 2022-03-09 10:43:11 · 142 阅读 · 0 评论 -
leetcode 219 存在重复元素II
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。示例 1:输入:nums = [1,2,3,1], k = 3输出:true示例 2:输入:nums = [1,0,1,1], k = 1输出:true示例 3:输入:nums = [1,2,3,1,2,3], k = 2输出:false哈希表当遍历到原创 2022-03-09 10:34:48 · 169 阅读 · 0 评论 -
leetcode 1122. 数组的相对排序
给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中。对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。示例 1:输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]输出:[2,2,2,1,4,3,3,9,6,7,19]示例 2:输入:arr1 = [28,6,22,8,4原创 2022-03-07 19:10:43 · 342 阅读 · 0 评论 -
leetcode 977 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例 1:输入:nums = [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]示例 2:输入:nums = [-7,-3,2,3,11]输出:[4,9,9,49,121]显然,如果数组中的所有数都是非负数,那么将每个数平方数组仍然保持升序;如果数组中的所有数都是负数,原创 2022-03-07 15:55:40 · 59 阅读 · 0 评论 -
leetcode 27 删除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。思路:数组原地修改,并且考虑数组中两个元素的比较,则用双指针比较合适。双指针:右指针fast指向当前将要处理的元素,左指针slow指向下一个将要赋值的位置。如果右指针指向的元素不等于val,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左原创 2022-03-07 11:20:04 · 172 阅读 · 0 评论 -
排序-冒泡排序
def bubble_sort(nums): n = len(nums) # 遍历每个位置i for i in range(n): # 对于每个位置i,将这个位置之后(含i本身)的最小值冒到最前面, # 使得这个位置是全局第i个最小值 for j in range(n-2, i-1, -1): if nums[j] > nums[j+1]: nums[j], nums[j+1原创 2022-03-01 17:35:26 · 55 阅读 · 0 评论 -
排序-堆排序
def heapify(nums, root_index, max_index): temp = nums[root_index] # 看子树根节点的左子节点 i = 2 * root_index + 1 while i < max_index: # 看左子节点和右子节点的值谁大 if i < max_index and nums[i+1] > nums[i]: i += 1 # 如果都原创 2022-03-01 17:34:36 · 201 阅读 · 0 评论 -
排序-快排
def quick_sort(nums): # q_sort(nums, 0, len(nums)-1) q_sort3ways(nums, 0, len(nums)-1)def q_sort(nums, l, r): if l >= r: return # 对于数组nums以l和r为边界的一段来说 # 在中间选则一个枢轴点,使得它左边的数都比它小,它右边的数都比它大 p_index = partition(nums, l, r)原创 2022-03-01 17:33:02 · 119 阅读 · 0 评论 -
排序-归并排序
def merge_sort(lists): if len(lists) <= 1: return lists # 把这个序列分成左右两个部分,每个部分都递归调用函数本身, # 分别返回一个有序数组,最后将两个有序数组再合并成一个有许数组 middle = len(lists)//2 left = merge_sort(lists[:middle]) right = merge_sort(lists[middle:]) retur原创 2022-03-01 17:32:18 · 76 阅读 · 0 评论