![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法设计与分析
南方-D
乾坤未定,你我皆是黑马
展开
-
leetcode:动态规划--剑指 Offer II 088. 爬楼梯的最少成本
leetcode:动态规划–剑指 Offer II 088. 爬楼梯的最少成本:剑指 Offer II 088. 爬楼梯的最少成本数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。每当爬上一个阶梯都要花费对应的体力值,一旦支付了相应的体力值,就可以选择向上爬一个阶梯或者爬两个阶梯。请找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。来源:力扣(LeetCode)示例 1:输入:cost = [1原创 2022-01-07 09:49:13 · 120 阅读 · 0 评论 -
算法设计与分析—不同路径 II
Leetcode练习:594. 最长和谐子序列一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。示例 1:输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]输出:2解释:3x3 网格的正中间有一个原创 2021-11-22 10:30:59 · 447 阅读 · 0 评论 -
算法设计与分析—最长和谐子序列
Leetcode练习:594. 最长和谐子序列和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。示例 1:输入:nums = [1,3,2,2,5,2,3,7]输出:5解释:最长的和谐子序列是 [3,2,2,2,3]示例 2:输入:nums = [1,2,3,4]输出:2原创 2021-11-20 19:29:04 · 84 阅读 · 0 评论 -
算法设计与分析—不同路径(动态规划)
LeetCode题目练习:62. 不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:输入:m = 3, n = 7输出:28示例 2:输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。1、向右 -> 向下 -> 向下2、向下 ->原创 2021-11-19 13:16:45 · 121 阅读 · 0 评论 -
算法设计与分析—编辑距离(动态规划)
LeetCode题目练习:563. 二叉树的坡度给定一个二叉树,计算 整个树 的坡度 。一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。整个树 的坡度就是其所有节点的坡度之和。示例 1:示例 2:示例 3:输入: [“a”,“aa”,“aaa”,“aaaa”]输出: 0解释: 不存在这样的两个单词。来源:力扣(LeetCode)a) 算法思原创 2021-11-19 12:44:01 · 144 阅读 · 0 评论 -
算法设计与分析—最大单词长度乘积(二进制)
LeetCode题目练习:318. 最大单词长度乘积给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。示例 1:输入: [“abcw”,“baz”,“foo”,“bar”,“xtfn”,“abcdef”]输出: 16解释: 这两个单词为 “abcw”, “xtfn”。示例 2:输入: [“a”,“ab”,“abc”,“d”原创 2021-11-17 14:40:56 · 339 阅读 · 0 评论 -
算法设计与分析—键值映射(字典树)
LeetCode题目练习:677. 键值映射实现一个 MapSum 类,支持两个方法,insert 和 sum:MapSum() 初始化 MapSum 对象void insert(String key, int val) 插入 key-val 键值对,字符串表示键 key ,整数表示值 val 。如果键 key 已经存在,那么原来的键值对将被替代成新的键值对。int sum(string prefix) 返回所有以该前缀 prefix 开头的键 key 的值的总和。示例:输入:[“Ma原创 2021-11-14 11:26:44 · 431 阅读 · 0 评论 -
算法设计与分析—子集(回溯法)
算法设计与分析课程练习:78. 子集给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]来源:力扣(LeetCode)a) 算法思路1、采用组合数学经常使用的思路,放或不放2、比如1、2、3原创 2021-11-13 19:51:10 · 818 阅读 · 0 评论 -
算法设计与分析— 汉诺塔问题(分治法)
算法设计与分析课程练习题:汉诺塔问题(分治法)在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:(1) 每次只能移动一个盘子;(2) 盘子只能从柱子顶端滑出移到下一根柱子;(3) 盘子只能叠在比它大的盘子上。请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。你需要原地修改栈。a) 算法思路1、先推出表达式,将大问题一直分解成两个小原创 2021-11-07 11:06:39 · 508 阅读 · 0 评论 -
算法设计与分析—神奇排列(回溯法)
算法设计与分析课程练习题:题目、神奇排列对于给定的正整数,多重集S ={1,1,2,2,3,3,… . , n, n}的2n个元素的神奇排列是指满⾜如下条件的排列:对于从1到n的每个整数,其两次出现之间的中间元素的数量等于该整数。例如,当n=3时,两种可能的神奇排列是3,1,2,1,3,2和2,3,1,2,1,3。a) 基于回溯编写⼀个函数,输⼊参数是n,打印输出所有神奇排列的数量。统计并输出你的函数的调⽤次数。b) 基于回溯编写⼀个函数,输⼊参数是n,打印输出1个神奇排列。统计并输出你的函数的调⽤原创 2021-11-04 19:01:52 · 255 阅读 · 0 评论 -
算法设计与分析—全排列
课程内容回顾:回溯法递归模板class Solution: def permute(self, nums: List[int]) -> List[List[int]]: res = [] #存放符合条件结果的集合 path = [] #用来存放符合条件的结果 used = [] #用来存放已经用过的数字 def backtrack(nums,used): if len(path) == len(原创 2021-10-28 14:53:51 · 143 阅读 · 0 评论 -
算法设计与分析—栈的压入、弹出序列
题目描述:栈的压入、弹出序列输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2),原创 2021-10-27 18:15:10 · 121 阅读 · 0 评论 -
算法设计与分析—矩阵中的路径
题目描述:机器人的运动范围给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例 1:输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”输原创 2021-10-26 20:03:05 · 75 阅读 · 0 评论 -
算法设计与分析—机器人的运动范围
题目描述:机器人的运动范围地上有一个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原创 2021-10-25 19:19:43 · 125 阅读 · 0 评论 -
算法设计与分析—把数字翻译成字符串
题目描述:二叉树中和为某一值的路径给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”来源:力扣(LeetCode)算法实现:解题思路动态规划法动态规划一原创 2021-10-22 19:32:09 · 136 阅读 · 0 评论 -
算法设计与分析—二叉树中和为某一值的路径
题目描述:连续子数组的最大和输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。来源:力扣(LeetCode)算法实现:解题思路动态规划方法一:使用一个dp数组来存储每一步的最优结果,每一步的计算都只与上一步有关def maxSubArray(self, nums):原创 2021-10-18 20:06:03 · 76 阅读 · 0 评论 -
算法设计与分析—调整数组顺序使奇数位于偶数前面
题目描述:调整数组顺序使奇数位于偶数前面输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例 :输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确的答案之一。来源:力扣(LeetCode)算法实现:解题思路双指针前后分别用一个指针进行扫描,左边碰到偶数停下来,右边碰到奇数停下来,然后左右交换数据,直到左右指针相遇。def exchange(self, nums):原创 2021-10-17 22:05:41 · 209 阅读 · 0 评论 -
算法设计与分析— 斐波那契数列
题目描述:** 斐波那契数列**示例 :写一个函数,输入 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。来源:力扣(LeetCode)算法实现原创 2021-10-10 15:04:02 · 674 阅读 · 0 评论 -
算法设计与分析—树的子结构
题目描述:二维数组中的查找输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。示例 :给定的树 A:———3—— / — \ —— 4 —— 5—/— \—1 —— 2——————给定的树 B:— 4—/1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。来源:力扣(LeetCode)算法实现:解题思路1、先使用层次遍历,依次遍历A的每个节点,后使用先序遍历。原创 2021-10-10 10:25:35 · 52 阅读 · 0 评论 -
算法设计与分析—二维数组中的查找
题目描述:二维数组中的查找在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例 :[[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。给定 t原创 2021-10-03 10:33:00 · 116 阅读 · 0 评论 -
算法设计与分析—0~n-1中缺失的数字
题目描述:0~n-1中缺失的数字一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 1:输入: [0,1,3]输出: 2例 2:输入: [0,1,2,3,4,5,6,7,9]输出: 8来源:力扣(LeetCode)算法实现:解题思路方法一:采用set集合1、将循环遍历,每次循环先判断该数是否在set集合中,不在则存入集合,否则返回该数# 方法一def原创 2021-10-02 16:26:19 · 497 阅读 · 0 评论 -
算法设计与分析—复杂链表的复制
题目描述:归并排序请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。示例 1:输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]例 2:输入:head = [[1,1],[2,1]]输出:[[1,1],[2,1]]示原创 2021-10-01 13:43:00 · 123 阅读 · 0 评论 -
算法设计与分析—归并排序
题目描述:归并排序使用排序算法将数组内容进行排序,时间复杂度要低于O(n^2)示例 1:输入: nums = [2, 4, 2, 6, 7, 0, 1]输出: nums = [0, 1, 2, 2, 4, 6, 7]算法实现:解题思路归并算法类似于两个有序数组合并成一个新的有序数组的算法,1、利用递归将数组分为两半,然后再对半分,直到分成单个数据2、将两个分开的有序数据利用归并算法合并成一个新的数组。def mergeSort(nums, left, right, new_num原创 2021-09-30 16:51:07 · 288 阅读 · 0 评论 -
算法设计与分析—反转链表
题目描述:反转链表定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例 1:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL算法实现:解题思路方法一:创建一个自定义头结点,用来执行前插操作,遍历单链表,每次对结点进行前插操作,一次遍历完成。时间复杂度O(n)方法二:直接将链表就地逆序,修改指针的方向,将1->2 修改为1<-2依次修改。时间原创 2021-09-30 15:52:37 · 74 阅读 · 0 评论 -
算法设计与分析—用两个栈实现队列
题目描述:用两个栈实现队列用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”][[],[3],[],[]]输出:[null,null,3,-1]来源:力扣(LeetCode)算法实现:解题思路两个栈A原创 2021-09-29 19:56:55 · 125 阅读 · 0 评论 -
算法设计与分析—将有序数组转换为二叉搜索树
题目描述:将有序数组转换为二叉搜索树给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。示例 1:输入:nums = [-10,-3,0,5,9]输出:[0,-3,9,-10,null,5]解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:示例 2:输入:nums = [1,3]输出:[3,1]解释:[1,3]原创 2021-09-29 18:58:24 · 73 阅读 · 0 评论 -
算法设计与分析—排序算法
题目描述:给你一个整数数组 nums,请你将该数组升序排列。示例 1:输入:nums = [5,2,3,1]输出:[1,2,3,5]示例 2:输入:nums = [5,1,1,2,0,0]输出:[0,0,1,1,2,5]来源:力扣(LeetCode)算法实现:方法一:暴力解法,冒泡排序 时间复杂度O(n^2)def sortArray(self, nums): """ :type nums: List[int] :rtype: List[int]原创 2021-09-24 17:56:05 · 193 阅读 · 0 评论 -
算法设计与分析—三数之和
题目描述:给定一个整数数组 nums 和一个整数目标值 target,请给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]来原创 2021-09-24 15:36:03 · 123 阅读 · 0 评论 -
算法设计与分析—两数之和
题目描述:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。来源:力扣(LeetCode)示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] ==9 ,返回 [0, 1] 。示例 2:输入:nu原创 2021-09-24 11:51:33 · 138 阅读 · 0 评论 -
算法设计与分析— 搜索旋转排序数组
题目描述:整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。给你 旋转后 的数组 nums 和一个原创 2021-09-24 00:08:07 · 333 阅读 · 0 评论