
剑指offer
条件反射104
中国科学院大学自动化研究所
展开
-
leetcode剑指 Offer 40. 最小的k个数
文章目录题目要求解题思路方法一方法二方法三题目要求输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。解题思路方法一排序后,返回最小的k个数。class Solution(object): def getLeastNumbers(self, arr, k): """ :type arr: List[int] :type k: int :rty原创 2021-03-21 14:02:30 · 87 阅读 · 0 评论 -
leetcode 剑指 Offer 61. 扑克牌中的顺子
文章目录题目要求解题思路方法一方法二题目要求从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。解题思路方法一首先判断是否有重复,有的话直接返回False。再判断是否max_num - min_num < 5。class Solution(object): def isStraight(self, nums): """原创 2021-03-17 16:08:21 · 63 阅读 · 0 评论 -
leetcode 剑指 Offer 50. 第一个只出现一次的字符
文章目录题目要求解题思路字典题目要求在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。解题思路字典class Solution(object): def firstUniqChar(self, s): """ :type s: str :rtype: str """ dic = {} # 字典保存键值对,字符:出现次数。 for s_ i原创 2021-03-17 14:45:24 · 75 阅读 · 0 评论 -
leetcode 剑指 Offer 29. 顺时针打印矩阵
文章目录题目要求解题思路题目要求输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。解题思路关键点:把当前矩阵的上下左右边界表示出来。class Solution(object): def spiralOrder(self, matrix): """ :type matrix: List[List[int]] :rtype: List[int] """ if not matrix:原创 2021-03-17 14:22:25 · 73 阅读 · 0 评论 -
leetcode 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
文章目录题目要求解题思路双指针题目要求输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。解题思路双指针class Solution(object): def exchange(self, nums): """ :type nums: List[int] :rtype: List[int] """ i, j = 0, len(nums) - 1原创 2021-03-15 21:36:22 · 73 阅读 · 0 评论 -
leetcode 剑指 Offer 58 - I. 翻转单词顺序
文章目录题目要求解题思路方法一:双指针方法二:python字符串操作知识点题目要求输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。解题思路方法一:双指针class Solution(object): def reverseWords(self, s): """ :type s: str :rty原创 2021-03-15 18:50:57 · 90 阅读 · 0 评论 -
leetcode 剑指 Offer 59 - I. 滑动窗口的最大值
文章目录题目要求解题思路滑动窗口题目要求给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。解题思路滑动窗口class Solution(object): def maxSlidingWindow(self, nums, k): """ :type nums: List[int] :type k: int :rtype: List[int] """ if not nums原创 2021-03-14 14:01:31 · 80 阅读 · 0 评论 -
leetcode 剑指 Offer 57 - II. 和为s的连续正数序列
文章目录题目要求解题思路双指针题目要求输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。解题思路双指针设置一个left和right两个边界,不断移动两边界。class Solution(object): def findContinuousSequence(self, target): """ :type target: int :r原创 2021-03-14 13:37:40 · 75 阅读 · 0 评论 -
leetcode 剑指 Offer 57. 和为s的两个数字
文章目录题目要求解题思路双指针题目要求输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。解题思路双指针class Solution(object): def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] "原创 2021-03-14 13:32:32 · 79 阅读 · 0 评论 -
leetcode 剑指 Offer 56 - I. 数组中数字出现的次数
文章目录题目要求解题思路分组异或题目要求一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。解题思路分组异或class Solution(object): def singleNumbers(self, nums): """ :type nums: List[int] :rtype: List[int] """ #原创 2021-03-14 10:54:09 · 118 阅读 · 0 评论 -
leetcode 剑指 Offer 68 - II. 二叉树的最近公共祖先
文章目录题目要求解题思路方法一方法二题目要求给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]解题思路方法一遍历整棵树,用字典储存每个节点的父节点。利用字典得到p节点的路径并保存。从q节点向根节点开始原创 2021-03-10 21:28:04 · 153 阅读 · 0 评论 -
leetcode 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
文章目录题目要求解题思路方法一方法二题目要求给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]解题思路方法一# Definition for a binary tree node.# class原创 2021-03-09 14:47:46 · 119 阅读 · 0 评论 -
leetcode 剑指 Offer 55 - II. 平衡二叉树
文章目录题目要求解题思路方法一:方法二:知识点题目要求输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。解题思路方法一:此方法有大量重复计算,时间复杂度较高。# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.le原创 2021-03-08 21:13:13 · 214 阅读 · 0 评论 -
leetcode 剑指 Offer 55 - I. 二叉树的深度
文章目录题目要求解题思路:方法一:深度优先搜索方法二:宽度优先搜索知识点题目要求输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。解题思路:方法一:深度优先搜索树的后序遍历 / 深度优先搜索往往利用 递归 或 栈 实现,本文使用递归实现。# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):原创 2021-03-08 19:21:57 · 82 阅读 · 0 评论 -
leetcode 剑指 Offer 54. 二叉搜索树的第k大节点
文章目录题目要求解题思路利用性质迭代知识点题目要求给定一棵二叉搜索树,请找出其中第k大的节点。解题思路利用性质迭代利用性质:二叉搜索树的中序遍历是递减的,因此二叉搜索树中序遍历的倒序是递增的。二叉树的中序遍历:recursive(root.left)print(root.val)recursive(root.right)此外:每当遍历到root的时候,k要减1。k == 0时,将root.val作为结果存储。k == 0时,停止迭代。# Definition for a b原创 2021-03-08 17:26:45 · 120 阅读 · 2 评论 -
leetcode 剑指 Offer 07. 重建二叉树
文章目录题目要求解题思路递归题目要求输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。解题思路递归根据前序遍历和中序遍历的特点生成二叉树。使用字典存储中序遍历与其索引,降低查找的复杂度。注意递归时传入的参数值。# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val原创 2021-03-08 15:57:10 · 103 阅读 · 0 评论 -
leetcode 剑指 Offer 28. 对称的二叉树
文章目录题目要求解题思路递归题目要求请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。解题思路递归每次递归需要判断如下三个:l.val == r.valrecursive(l.left, r.right)recursive(l.right, r.left)# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):#原创 2021-03-08 11:32:26 · 84 阅读 · 0 评论 -
leetcode 剑指 Offer 15. 二进制中1的个数
文章目录题目要求解题思路位运算按位操作相关知识点题目要求请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。解题思路位运算class Solution(object): def hammingWeight(self, n): """ :type n: int :rtype: int """原创 2021-03-06 20:41:46 · 133 阅读 · 0 评论 -
leetcode 剑指 Offer 63. 股票的最大利润
文章目录题目要求解题思路动态规划题目要求假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?解题思路动态规划class Solution(object): def maxProfit(self, prices): """ :type prices: List[int] :rtype: int """ if not prices: return 0原创 2021-03-06 19:20:25 · 155 阅读 · 0 评论 -
leetcode 剑指 Offer 47. 礼物的最大价值
文章目录题目要求解题思路动态规划动态规划(改进空间复杂度)题目要求在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?解题思路动态规划dp[i][j]dp[i][j]dp[i][j]代表走到第i行第j列礼物的最大价值。class Solution(object): def maxValue(self原创 2021-03-06 17:22:01 · 73 阅读 · 0 评论 -
leetcode 剑指 Offer 14- II. 剪绳子 II
与leetcode 剑指 Offer 14- I. 剪绳子思路一致,只不过需要处理大数求余的问题。原创 2021-03-06 17:13:24 · 124 阅读 · 0 评论 -
leetcode 剑指 Offer 14- I. 剪绳子
文章目录题目要求解题思路方法一:贪心方法二:动态规划题目要求给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。解题思路方法一:贪心当绳子长度相等时,乘积最大。当绳子长度越接近3,其次是越接近2时,乘积最大。class Solu原创 2021-03-06 16:00:38 · 161 阅读 · 0 评论 -
leetcode 剑指 Offer 53 - II. 0~n-1中缺失的数字
文章目录题目要求解题思路分治题目要求一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。解题思路分治class Solution(object): def missingNumber(self, nums): """ :type nums: List[int] :rtype: int """ l =原创 2021-03-05 19:44:13 · 156 阅读 · 0 评论 -
leetcode 剑指 Offer 53 - I. 在排序数组中查找数字 I
文章目录题目要求解题思路分治题目要求统计一个数字在排序数组中出现的次数。解题思路分治若数组为空,则返回0。先查找包含目标数字在数组中位置的左边界。若不含目标数字,则直接返回0;若有目标数字则记录这个位置。继续查找目标数字在数组中位置的右边界。return 右边界+1-左边界,即为所求次数。class Solution(object): def search(self, nums, target): """ :type nums: List[in原创 2021-03-05 17:18:21 · 158 阅读 · 0 评论 -
leetcode 剑指 Offer 39. 数组中出现次数超过一半的数字
文章目录题目要求解题思路方法一:哈希表方法二:排序后取中间元素*方法三:摩尔投票法知识点题目要求数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。解题思路方法一:哈希表class Solution(object): def majorityElement(self, nums): """ :type nums: List[int] :rtype: int "原创 2021-02-28 08:58:38 · 99 阅读 · 0 评论 -
leetcode 剑指 Offer 18. 删除链表的节点
题目要求给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。解题思路# Definition for singly-linked list.# class ListNode(object):# def __init__(self, x):# self.val = x# self.next = Noneclass Solution(object): def deleteNode(self, head,原创 2021-02-25 23:27:35 · 72 阅读 · 0 评论 -
leetcode 剑指 Offer 22. 链表中倒数第k个节点
文章目录题目要求解题思路双指针题目要求输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。解题思路双指针# Definition for singly-linked list.# class ListNode(object):# def __init__(self, x):#原创 2021-02-25 23:10:10 · 90 阅读 · 0 评论