![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
钟灵毓秀M
学而知不足
展开
-
python力扣刷题记录——快慢双指针刷题汇总
以下几题的思路差不多,都是定义i,k两个快慢指针,i用来遍历,k用来表示有效范围,将符合提议的值都交换或者复制到[0, k]的范围内。283. 移动零给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。思路1:k和i指针,i用来遍历,当i的数不等于0,将k的值赋值为i的值,k++,循环结束后,将k后面的值都赋值为原创 2021-11-12 02:06:01 · 238 阅读 · 0 评论 -
python刷题记录——剑指 Offer 15. 二进制中1的个数
题目:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。方法一:利用与运算和右移,将二进制数从最右边开始,逐位与1做与位运算。0&1=0,1&1=1,累加结果,就是最后1的个数class Solution: def hammingWeight(self, n: int) -> int: res = 0 while n: res原创 2021-07-17 10:36:36 · 255 阅读 · 0 评论 -
python力扣刷题——剑指 Offer 04. 二维数组中的查找
剑指 Offer 04. 二维数组中的查找在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。方法:从右上角开始找,类似二分法。比它小就去掉当前列,比它大就去掉当前行,一次次缩小范围。当然,也可以从左下角开始找起,相反的操作。class Solution: def findNumberIn2DArray(self, matrix: List[List[.原创 2021-06-30 00:45:27 · 274 阅读 · 0 评论 -
python刷题记录——剑指 Offer 03. 数组中重复的数字
题目:找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。解法:时间优先,用字典的键来标志是否重复了。时间O(n), 空间O(n)class Solution: def findRepeatNumber(self, nums: List[int]) -> int: dictmap = {} f原创 2021-06-25 00:36:07 · 158 阅读 · 0 评论 -
python力扣刷题——946. 验证栈序列
题目:946. 验证栈序列给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop操作序列的结果时,返回 true;否则,返回 false 。方法一:利用队列和栈的特点class Solution: def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool: stack = []原创 2021-03-03 00:23:19 · 305 阅读 · 0 评论 -
python力扣刷题记录——349. 两个数组的交集
题目:349. 两个数组的交集给定两个数组,编写一个函数来计算它们的交集。方法一:执行用时: 52 ms内存消耗: 15.1 MBclass Solution: def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: return list(set(nums1) & set(nums2))方法二:执行用时: 68 ms内存消耗: 14.9 MBclass原创 2021-02-03 23:40:14 · 201 阅读 · 0 评论 -
python力扣刷题记录——260. 只出现一次的数字 III
题目:260. 只出现一次的数字 III给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序返回答案。方法一:执行用时:48 ms内存消耗:16 MBclass Solution: def singleNumber(self, nums: List[int]) -> List[int]: dict1 = {} res = [] for i in num原创 2021-02-03 23:35:37 · 225 阅读 · 0 评论 -
python力扣刷题记录——1266. 访问所有点的最小时间
题目:1266. 访问所有点的最小时间平面上有 n 个点,点的位置用整数坐标表示 points[i] = [xi, yi]。请你计算访问所有这些点需要的最小时间(以秒为单位)。你可以按照下面的规则在平面上移动:每一秒沿水平或者竖直方向移动一个单位长度,或者跨过对角线(可以看作在一秒内向水平和竖直方向各移动一个单位长度)。必须按照数组中出现的顺序来访问这些点。方法一:执行用时: 44 ms内存消耗: 14.8 MBclass Solution: def minTimeToVisi原创 2021-01-28 23:51:06 · 112 阅读 · 0 评论 -
python力扣刷题记录——509. 斐波那契数
题目:509. 斐波那契数斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n -2),其中 n > 1 给你 n ,请计算 F(n) 。方法一:用递归,但是效率低下执行用时: 716 ms内存消耗: 14.8 MBclass Solution: def fib(self, n: int) -> in原创 2021-01-27 00:53:03 · 240 阅读 · 0 评论 -
python力扣刷题记录——1299. 将每个元素替换为右侧最大元素
题目:1299. 将每个元素替换为右侧最大元素给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换。 完成所有替换操作后,请你返回这个数组。方法一:class Solution: def replaceElements(self, arr: List[int]) -> List[int]: for i in range(len(arr)): if len(arr[i:]) == 1:原创 2021-01-24 22:58:19 · 92 阅读 · 0 评论 -
python力扣刷题记录——459. 重复的子字符串
题目:459. 重复的子字符串给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。方法一:执行用时:180 ms内存消耗:15 MBclass Solution: def repeatedSubstringPattern(self, s: str) -> bool: len_s = len(s) sub_str = '' for i in s[:-1]:原创 2021-01-24 13:15:50 · 158 阅读 · 0 评论 -
python力扣刷题记录——剑指 Offer 51. 数组中的逆序对
题目:剑指 Offer 51. 数组中的逆序对在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。方法一:暴力法:时间超出限制class Solution: def reversePairs(self, nums: List[int]) -> int: count = 0 for i in range(len(nums)): for j in nums[原创 2021-01-21 08:43:43 · 180 阅读 · 0 评论 -
python力扣刷题记录——1346. 检查整数及其两倍数是否存在
题目:1346. 检查整数及其两倍数是否存在给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。更正式地,检查是否存在两个下标 i 和 j 满足:i != j0 <= i, j < arr.lengtharr[i] == 2 * arr[j]方法一:class Solution: def checkIfExist(self, arr: List[int]) -> bool: fo原创 2021-01-19 00:50:56 · 97 阅读 · 0 评论 -
python力扣刷题记录——剑指 Offer 58 - I. 翻转单词顺序
题目:剑指 Offer 58 - I. 翻转单词顺序输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am astudent. “,则输出"student. a am I”。方法一:class Solution: def reverseWords(self, s: str) -> str: list_s = s.split() list_s.reverse()原创 2021-01-15 00:33:53 · 120 阅读 · 0 评论 -
python力扣刷题记录——1592. 重新排列单词间的空格
题目:给你一个字符串 text,该字符串由若干被空格包围的单词组成。每个单词由一个或者多个小写英文字母组成,并且两个单词之间至少存在一个空格。题目测试用例保证 text至少包含一个单词 。请你重新排列空格,使每对相邻单词之间的空格数目都 相等 ,并尽可能 最大化 该数目。如果不能重新平均分配所有空格,请将多余的空格放置在字符串末尾 ,这也意味着返回的字符串应当与原 text 字符串的长度相等。返回 重新排列空格后的字符串 。方法一:好吧,写的有点挫,看方法二力扣摘抄下来class S原创 2021-01-14 00:23:59 · 346 阅读 · 0 评论 -
python力扣刷题记录——面试题 16.17. 连续数列(待补充)
题目:给定一个整数数组,找出总和最大的连续数列,并返回总和。方法一:执行用时: 32 ms内存消耗: 15.5 MB野生做法,遍历数组,求和,一边求和一边与这个数对比,如果这个数大于求的和,就从这个数往下计算,抛弃之前算的和。有点像动态规划的背包问题。class Solution: def maxSubArray(self, nums: List[int]) -> int: sum = 0 sum_list = [] for i原创 2021-01-13 00:49:03 · 189 阅读 · 0 评论 -
python力扣刷题记录——1331. 数组序号转换
题目:1331. 数组序号转换给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。 序号代表了一个元素有多大。序号编号的规则如下: 序号从 1开始编号。 一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。 每个数字的序号都应该尽可能地小。方法一:执行用时:344 ms内存消耗:34.7 MB思想:先去重,再排序,再哈希查找。字典以去重列表的值作为键,排序号的列表索引作为键。class Solution: def arrayRankTrans原创 2021-01-05 00:23:07 · 633 阅读 · 0 评论 -
python力扣刷题记录——26. 删除排序数组中的重复项
题目:给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。方法一:class Solution: def removeDuplicates(self, nums: List[int]) -> int: lenth = len(nums)-1 if lenth > 0: for原创 2020-12-31 01:10:46 · 190 阅读 · 0 评论 -
python力扣刷题记录——136. 只出现一次的数字
题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。方法一:执行用时: 48 ms内存消耗: 16.4 MB利用异或运算符异或:相同为0,不同为1. 异或同一个数两次,原数不变。class Solution: def singleNumber(self, nums: List[int]) -> int: num = 0 for i in nums: num ^=原创 2020-12-29 00:22:36 · 156 阅读 · 0 评论 -
python力扣刷题记录——389. 找不同
题目:389. 找不同给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t中被添加的字母方法一:执行用时: 44 ms内存消耗: 14.8 MB异或。将数值转为二进制数,每一位上,相同数字置0,不同数字置1python主要用在计算不重复的值,相同的都被消掉啦,消消乐~class Solution: def findTheDifference(self, s: str, t: str) -> str原创 2020-12-28 00:57:01 · 232 阅读 · 0 评论 -
python力扣刷题记录——771. 宝石与石头
题目: 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。 J 中的字母不重复,J 和S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。方法一:执行用时: 24 ms内存消耗: 14.8 MB暴力遍历:class Solution: def numJewelsInStones(self, jewels: str, stones: str) -> int.原创 2020-12-24 01:08:07 · 397 阅读 · 0 评论 -
python力扣刷题记录——1614. 括号的最大嵌套深度
题目:给你一个 有效括号字符串 s,返回该字符串的 s 嵌套深度 。方法一:利用栈class Solution: def maxDepth(self, s: str) -> int: max_depth = 0 stack_list = [] for i in s: if i == "(": stack_list.append(i) max_de原创 2020-12-23 01:13:38 · 509 阅读 · 0 评论 -
python力扣刷题记录——1684. 统计一致字符串的数目
题目:给你一个由不同字符组成的字符串 allowed 和一个字符串数组 words 。如果一个字符串的每一个字符都在 allowed中,就称这个字符串是 一致字符串 。 请你返回 words 数组中 一致字符串的数目。方法:执行用时: 76 ms内存消耗: 15.9 MBclass Solution: def countConsistentStrings(self, allowed: str, words: List[str]) -> int: count =原创 2020-12-16 01:05:41 · 264 阅读 · 0 评论 -
python力扣刷题记录——70. 爬楼梯
题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。方法一:执行用时: 36 ms内存消耗: 14.7 MB动态规划class Solution: def climbStairs(self, n: int) -> int: if n == 1 or n ==2: return n a = 1 b = 2原创 2020-12-13 07:28:05 · 413 阅读 · 0 评论 -
python力扣刷题记录——1480. 一维数组的动态和
题目:给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。 请返回nums 的动态和。方法一:执行用时: 44 ms内存消耗: 13.5 MBclass Solution: def runningSum(self, nums: List[int]) -> List[int]: for i in range(1, len(nums)): nums[i] += n原创 2020-12-10 01:05:51 · 501 阅读 · 0 评论 -
python力扣刷题记录——1636. 按照频率将数组升序排序
题目:给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。请你返回排序后的数组。方法一:执行用时: 32 ms内存消耗: 13.5 MB以字典dict_nums来记录列表中的数字和出现的个数(key:num, value:count)。再采用list()序列化字典,转为[(num, count),(num, count), …]的形式sort()排序,先按照value排序,value值相同再按照key排序cl原创 2020-12-09 00:40:05 · 576 阅读 · 0 评论 -
python力扣刷题记录——27. 移除元素
题目:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。使用双指针法方法一:执行用时: 36 ms内存消耗: 13.5 MB当nums[i] 与给定的值相等时,递增 i 以跳过该元素。只要valnums[i] != val,我们就复制 nums[i] 到 nums[j] 并同时递增两原创 2020-12-08 01:02:53 · 409 阅读 · 0 评论 -
python力扣刷题记录——344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII码表中的可打印字符。方法一:直接用reverse()函数class Solution: def reverseString(self, s: List[str]) -> None: """ Do not retur.原创 2020-12-07 23:45:51 · 321 阅读 · 0 评论 -
python力扣刷题记录——283. 移动零
题目:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。方法一:执行用时: 192 ms内存消耗: 14.1 MB用列表的内置方法很简单,就是运行太慢啦class Solution: def moveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead.原创 2020-12-07 00:57:43 · 346 阅读 · 0 评论 -
python力扣刷题记录——204. 计数质数
题目:统计所有小于非负整数 n 的质数的数量。方法一:暴力法class Solution: def countPrimes(self, n: int) -> int: count = 0 if n > 1: for i in range(2, n): flag = True for j in range(2, i):原创 2020-12-04 00:45:25 · 345 阅读 · 0 评论 -
python力扣刷题记录——1672. 最富有客户的资产总量
题目:给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。方法一:class Solution: def maximumWealth(self, accounts: List[List[int]]) -> int: m = le原创 2020-12-03 00:10:21 · 614 阅读 · 0 评论 -
python力扣刷题记录——1470. 重新排列数组
题目:给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,…,xn,y1,y2,…,yn] 的格式排列。 请你将数组按[x1,y1,x2,y2,…,xn,yn] 格式重新排列,返回重排后的数组。方法一:按重新排列的顺序依次写入新的列表中。执行用时: 28 ms内存消耗: 13.6 MBclass Solution: def shuffle(self, nums: List[int], n: int) -> List[int]: new_lis原创 2020-12-02 00:50:58 · 787 阅读 · 0 评论 -
python力扣刷题记录——1662. 检查两个字符串数组是否相等
题目:给你两个字符串数组 word1 和 word2 。如果两个数组表示的字符串相同,返回 true ;否则,返回 false 。数组表示的字符串 是由数组中的所有元素 按顺序 连接形成的字符串。方法:执行用时: 32 ms内存消耗: 13.5 MBclass Solution: def arrayStringsAreEqual(self, word1: List[str], word2: List[str]) -> bool: return ''.join(原创 2020-11-30 23:39:24 · 314 阅读 · 0 评论 -
python力扣刷题记录——LCP 01. 猜数字
题目:小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次? 输入的guess数组为 小A 每次的猜测,answer数组为 小B每次的选择。guess和answer的长度都等于3。方法:执行用时: 28 ms内存消耗: 13.5 MBclass Solution: def game(self, guess: List[int], answer: List[int])原创 2020-11-30 23:27:21 · 414 阅读 · 1 评论 -
python力扣刷题记录——删除最外层的括号
题目:有效括号字符串为空 ("")、"(" + A + “)” 或 A + B,其中 A 和 B 都是有效的括号字符串,+代表字符串的连接。例如,"","()","(())()" 和 “(()(()))” 都是有效的括号字符串。如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B都是非空有效括号字符串。给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + … + P_k,其中 P_i是有效括原创 2020-11-29 18:20:57 · 427 阅读 · 0 评论 -
python力扣刷题记录——有效的括号
题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。 有效字符串需满足:左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。方法一:利用栈的思想,先进先出class Solution: def isValid(self, s: str) -> bool: dict_symbol = {')': '(', ']': '[', '}': '{'} stac.原创 2020-11-23 00:31:55 · 275 阅读 · 1 评论 -
python力扣刷题记录——判断回文数
题目:判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。方法一:执行用时: 112 ms内存消耗: 13.3 MBclass Solution: def isPalindrome(self, x: int) -> bool: num = 0 a = x while a > 0: b = a % 10 a = a // 10原创 2020-11-22 18:34:10 · 301 阅读 · 1 评论 -
python排序算法(四)——快速排序
3.快速排序快速排序的思路是:快速排序是一种非常高效的排序算法,采用 “分而治之” 的思想,把大的拆分为小的,小的拆分为更小的。其原理是,在序列之中,选择一个元素作为”基准”(pivot),或者叫比较值。数列中所有元素都和这个基准值进行比较,如果比基准值小就移到基准值的左边,如果比基准值大就移到基准值的右边。以基准值左右两边的子列作为新数列,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。步骤:分解–递归–合并代码实现:def quickSort(array): if len(ar原创 2020-07-14 00:11:50 · 243 阅读 · 0 评论 -
python排序算法(三)——插入排序
3.插入排序插入排序:插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序思路:可以假设第一个数就是一个有序的列表, 从第2个数开始分别与第一个数做比较,直到找到比它小的数,就放在这个比它小的数后面,使之成为新的有序表,重复n-1次可完成排序过程。def inse...原创 2019-09-06 22:40:35 · 185 阅读 · 0 评论 -
python排序算法(二)——选择排序
2.选择排序选择排序的思路是:第一轮的时候,所有的元素都和第一个元素进行比较,如果比第一个元素大,就和第一个元素进行交换,在这轮比较完后,就找到了最小的元素;第二轮的时候所有的元素都和第二个元素进行比较找出第二个位置的元素,以此类推。关键字:位置交换list1 = [6, 4, 5, 1, 3, 2, 9, 8, 7]def selection_sort(list): for i...原创 2019-09-05 00:17:51 · 130 阅读 · 0 评论