![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leedcode刷题
MC.zeeyoung
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确的答案之一辅助法:class Solution(object): def exchange(self, nums): """ :type nums: List[int] :rtype: List[int]原创 2021-06-26 20:26:09 · 60 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树
题目请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1/ 2 2/ \ / 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1/ 2 2\ 3 3示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false思原创 2021-06-25 23:44:32 · 101 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像
题目请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入:4/ 2 7/ \ / 1 3 6 9镜像输出: 4/ 7 2/ \ / 9 6 3 1示例1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]思路:其实和互换变量一样,通过中间变量存储左子树的变量才能做镜像# Definition for a binary tree node.# class TreeNode(o原创 2021-06-23 22:32:52 · 50 阅读 · 2 评论 -
剑指 Offer 26. 树的子结构
题目输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A:3/ 4 5/ 1 2给定的树 B:4/1示例1:输入:A = [1,2,3], B = [3,1]输出:false思路:1.B为空,默认是A的子树2.A为空,或者A的根节点和B的根节点不同,False (递归头–出口)3.写判断循环函数,判断两棵树的左节点和右节点作为跟节点时是否符合1、2的情况原创 2021-06-23 21:43:27 · 43 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方
题目实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。示例1:输入:x = 2.00000, n = 10输出:1024.00000示例2:输入:x = 2.10000, n = 3输出:9.26100思路:1.将幂次n转换为二进制2.当遇到是小数形式的时候,先进行逆置转换3.判断n是奇数还是偶数,即二进制最后一位是否为1,如果是,则xres, 否则只需要x=x,然后n右移4.返回res因为这里直接累乘,会爆,所以原创 2021-06-22 22:16:29 · 37 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表
题目输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4这就是思路就是建立一个中间变量来存储两个链表对应位置较小的数字;因为题目表示要返回一个链表,所以连起来的思路就是搭建一个伪链表头,然后一个移动节点指向它,然后通过遍历两个链表,把较小的数字存储在这个移动节点,最后返回表头python:# Definition for singl原创 2021-06-22 20:37:59 · 49 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
题目请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例1输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。示例2输入:00000000000000000000000010000000输出:1解释:输入的二进制串 00原创 2021-06-20 09:26:28 · 67 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围
题目地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例1:输入:m = 2, n = 3, k = 1输出:3示例2:输入:m =原创 2021-06-19 10:05:12 · 44 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径
题目给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。示例1:输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D原创 2021-06-19 08:23:18 · 60 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字
题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例1:输入:[3,4,5,1,2]输出:1示例2:输入:[2,2,2,0,1]输出:0这里的思路是找出旋转点,旋转点就是最小值,而且整体数组是一个递增排序的数组。那么此处采用二分法来找python 版本class Solution(object): de原创 2021-06-14 11:01:29 · 106 阅读 · 1 评论 -
剑指 Offer 10- II. 青蛙跳台阶问题
题目一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例:输入:n = 7输出:21示例:输入:n = 0输出:1示例:输入:n = 2输出:2这题本质还是斐波那契数列,初始值为n=0===>1n=1===>1n=2===>2 (1,1,或2)那么我们就知道 所以循环起点应该是从1开始,因为1+2原创 2021-06-13 09:57:45 · 43 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列
题目写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例1:输入:n = 2输出:1递归法:python版本class原创 2021-06-12 20:38:43 · 38 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”][[],[3],[],[]]输出:[null,null,3,-1]输入:[“CQueue”,“deleteHead”,“appendTail”,“appendTa原创 2021-06-11 21:11:45 · 48 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。给出:前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回:3/ 9 20/ 15 7其实就是【3,9,20,null,null,15,7】递归法:记录所有节点的索引,用字典或者unordered_map存储找到根节点-》分开左右子树-》递归遍历,返回节点递归出口,左边界大于右边界pyt原创 2021-06-11 00:43:23 · 79 阅读 · 3 评论 -
剑指 Offer 06. 从尾到头打印链表
题目输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。如:输入:head = [1,3,2]输出:[2,3,1]c++的三种解法:1、递归因为它的数据结构是以结构体作为定义链表结构,所以解法是,head->next。。。。head=None,说明head到底了,然后再将指针指向的数推回新创建的vector/** * Definition for singly-linked list. * struct ListNode { * int val; *原创 2021-06-09 21:55:29 · 49 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
题目请实现一个函数,把字符串 s 中的每个空格替换成"%20"。例子:输入:s = “We are happy.”输出:“We%20are%20happy.”这说实在用python做是最简单,不过为了追求多样性解法,我还是探索了一下c++的数组迁移的思路python 解法:class Solution(object): def replaceSpace(self, s): """ :type s: str :rtype: str原创 2021-06-08 23:51:05 · 50 阅读 · 0 评论 -
剑指offer 4.二维数组中的查找
题目在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]]给定 target = 5,返回 true。给原创 2021-06-07 22:03:02 · 97 阅读 · 0 评论 -
剑指offer03: 数组重复的数字
题目找出数组中重复的数字在一个长度为n 的数组nums里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。输入:[2 , 3., 1, 0 ,2,5,3]输出:2 或 3哈希表解法建立哈希表,把重复元素返回,时间复杂度为o(n)c++版本:#include<unordered_map>#include<iostream>using namesapce std;c原创 2021-06-06 16:34:45 · 41 阅读 · 0 评论 -
leedcode-哈希表篇(7)
242. 有效的字母异位词题目给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例1:输入: s = "anagram", t = "nagaram"输出: true示例2:输入: s = "rat", t = "car"输出: false我的思路是从两方面入手,判断两个字符串长度是否一样,通过ascii码来判断,同时利用ascii码之和判断在长度一样的情况下,字母是否一样,可以筛选掉一部分字母不同的情况;另外考虑到有可能在长度一样,字母不同而恰好asc原创 2021-03-08 09:31:22 · 53 阅读 · 0 评论 -
leedcode-哈希表篇(6)
350.两个数组的交集2题目给定两个数组,编写一个函数来计算它们的交集。示例1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]示例2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[4,9]这道题我也是一次过不看答案就做出来了,不过方法有点暴力,创建了两个字典,存储两个数组的词频,然后遍历nums1映射的字典,找出它的key值是否在nums2中,并比对nums2映射的字典中该key对应的value,选出最小的原创 2021-03-07 15:59:15 · 41 阅读 · 0 评论 -
leedcode-哈希表篇(5)
349.两个数组的交集题目给定 两个数组,编写一个函数来计算它们的交集。示例1:输入:nums1=[1,2,2,1], nums2=[2,2]输出:[2]示例2:输入:nums1=[4,9,5],nums2=[9,4,9,8,4]输出:[9,4]这道题我也是一次过就做出来了,太开心了。思路是nums2作为目标数组,nums1作为查询数组,将nums1存入集合,去除重复元素,那么剩下再用num2去遍历,这样就可以找到交集元素。class Solution(object): d原创 2021-03-06 21:16:04 · 65 阅读 · 0 评论 -
leedcode-哈希表篇(4)
594. 最长和谐子序列题目和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。class Solution(object): def longestConsecutive(self, nums): """ :type nums: List[int]原创 2021-03-06 10:36:08 · 57 阅读 · 0 评论 -
leedcode-哈希表篇(3)
594. 最长和谐子序列题目和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。示例输入:nums=[1,3,2,2,5,2,3,7]输出:5解释:最长和谐子序列是[3,2,2,2,3]这道题我一开始的思路是做一个字典,把不重复的元素存进去,然后将keys相差1的key取出来,然后原创 2021-03-04 09:41:20 · 101 阅读 · 1 评论 -
leedcode-哈希表篇(2)
217. 存在重复元素题目给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。示例输入: [1,2,3,1]输出: true一开始的想法是定义哈希表,像记录词频一样记录每个列表的频次,然后遍历value,看看有没有频次超过1的。官方答案给出得更加简洁,他直接利用了集合中,键值唯一性,如果有重复就返回true,然后我尝试把集合换成列表,发现超时了,说明还是只能用集合来缩短遍历时间class Solu原创 2021-03-03 09:42:59 · 57 阅读 · 0 评论 -
leedcode-哈希表篇(1)
1.两数之和题目给定一个整数数组nums和一个整数目标值target,请你在该数组中找出 和为目标值 的那两个整数,并返回它们的数组下标你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案示例1:输入:nums=[2,7,11,15],target=9输出:【0,1】解释:nums[0]+nums[1]==9 返回【0,1】此处如果用之前指针篇的方法,显然会不太适合,因为这里的数组不是全都有序,因此如果用双指针会对无序数组无效,就是移动的规则无原创 2021-03-02 09:46:15 · 68 阅读 · 0 评论 -
leedcode-指针篇(13)
88. 合并两个有序数组题目给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]这题的思路,我只能想到原创 2021-03-01 16:32:52 · 39 阅读 · 0 评论 -
leedcode-指针篇(12)
80. 删除排序数组中的重复项 II题目给定一个增序排列数组 nums ,你需要在 原地 删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度示例:输入:nums = [1,1,1,2,2,3]输出:5, nums = [1,1,2,2,3]解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 你不需要考虑数组中超出新长度后面的元素。...原创 2021-03-01 08:35:19 · 41 阅读 · 1 评论 -
leedcode-指针篇(11)
26.删除排序数组中的重复项题目给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不用使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。示例1:给定数组nums=[1,1,2],函数应该返回新的长度2,并且原数组nums的前两个元素被修改为1,2。你不需要考虑数组中超出新长度后面的元素。示例2:给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度 5, 并且原数组 nums原创 2021-02-26 09:18:40 · 37 阅读 · 0 评论 -
leedcode-指针篇(10)
283.移除元素题目给定一个数组nums和一个值val,你需要原地移除所有数值相等于val的元素,并返回移除后数组的新长度不要使用额外的数组空间,使用O(1)额外空间并原地修改输入数组元素的顺序可以改变,你不需要考虑数组中超出新长度后面的元素说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝int len =原创 2021-02-25 12:38:48 · 50 阅读 · 0 评论 -
leedcode-指针篇(9)
283.移动零题目给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序输入: [0,1,0,3,12]输出: [1,3,12,0,0]我一开始的想法也是设置快慢指针,但是又毫无意外地陷入了死循环,代码如下class Solution: def moveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-p原创 2021-02-24 08:45:28 · 40 阅读 · 0 评论 -
leedcode-指针篇(8)
141.环形链表题目给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是-1,则在该链表中没有环。注意pos不作为参数进行传递。仅仅是为了比哦啊哈斯链表的实际情况。如果链表中存在环,则返回true。否则,返回false示例:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二原创 2021-02-23 11:22:35 · 42 阅读 · 0 评论 -
leedcode-指针篇(6)
344.反转字符串题目编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。示例:输入:["h","e","l","l","o"]输出:["o","l","l","e","h"]我想了一下,可以通过指针指向的元素地址进行交换代码如下:class Solution: def reve原创 2021-02-22 11:20:14 · 39 阅读 · 0 评论 -
leedcode-指针篇(5)
680.验证回文字符串(2)题目给定一个非空字符串s,最多删除一个字符,判断是否能成为回文字符串示例:输入:“aba”输出:True输入: "abca"输出: True解释:你可以删除c字符我一开始给那个删除的位置搞懵了,就不会写了,只写成这个样子class Solution: def validPalindrome(self, s: str) -> bool: if(len(s)<2):return True start,end=原创 2021-02-22 11:04:58 · 38 阅读 · 0 评论 -
leedcode-指针篇(7)
125. 验证回文串(1)题目给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。示例:输入:“A man, a plan, a canal: Panama”输出:true输入: "race a car"输出: false此处需要提醒自己,回文串是指从头读到尾和从尾读到头都是一样的。我一开始写的代码,竟然卡壳了,卡在这里class Solution: def isPalindrome(self, s: str) -> bool:原创 2021-02-19 21:51:12 · 34 阅读 · 0 评论 -
leedcode-指针篇(3)
345.反转字符串中的元音字母题目:编写一个函数,以字符串作为输入,反转该字符串中的元音字母。示例:输入:‘hello’输出:‘holle'初始我自己的代码class Solution: def reverseVowels(self, s: str) -> str: # assert type(s)==str start,end=0,len(s)-1 s=list(s) target_list= ['a','e','原创 2021-02-18 22:50:00 · 62 阅读 · 0 评论 -
leedcode-指针篇(2)
633.平方数之和题目给定一个非负整数c,要判断是否存在两个整数a和b,使得a2+b2=ca^2+b^2=ca2+b2=c示例:输入:c=5输出:true解释:1*1+2*2=5思路一开始我的想法是设置两个指针,范围是从0到c,然后开始遍历寻找,后来通过测试崩了,我再细细想了一下,发现,应该从最极端的结果开始入手,假设c=5,那么a=0的时候,b就只能是b\sqrt bb,由此可以得出,末位指针应该指向根号c。这样确定上界方式应该会比较有依据代码class Solution:原创 2021-02-17 15:22:54 · 161 阅读 · 1 评论