剑指
想飞的盗版鱼
这个作者很懒,什么都没留下…
展开
-
剑指--数据流中的中位数
剑指–数据流中的中位数1,题目:2,思路:方法一:优先队列 / 堆:算法流程:设元素总数为 N = m + n ,其中 m 和 n 分别为 A 和 B 中的元素个数。addNum(num) 函数:1.当 m=n(即 N 为 偶数):需向 A 添加一个元素。实现方法:将新元素 num 插入至 B,再将 B 堆顶元素插入至 A ;2.当 m !=n(即 N 为 奇数):需向 B 添加一个元素。实现方法:将新元素 num 插入至 A ,再将 A 堆顶元素插入至 B ;3.假设插入数字 nu原创 2020-07-09 16:25:05 · 220 阅读 · 0 评论 -
剑指--正则表达式匹配
剑指–正则表达式匹配1,题目:2,思路:方法一:(回溯法)暴力方法:所以说这算是一种暴力方法,会将所有的情况走一边,看看是否存在可以匹配的情况。3,代码:方法一:(回溯法)暴力方法:class Solution { public boolean isMatch(String s, String p) { //如果正则串p为空字符串s也为空这匹配成功,如果正则串p为空但是s不是空则说明匹配失败 if (p.isEmpty())return s.isEmpty();原创 2020-07-09 15:52:52 · 212 阅读 · 0 评论 -
剑指--队列的最大值
剑指–队列的最大值1,题目:2,思路:看下面的代码3,代码:写法一:(队列+两个栈):class MaxQueue {/* 等下,我们使用一个队列正常的存放数据, 然后使用维护一个单调栈,栈顶为最大值 再加一个辅助栈 元素插入顺序:1 3 5 5 2 6 1 2 (栈的元素最左边为栈底,最右边为栈顶,队列也一样) 插入 1: queue = {1} stack = {1} 插入 3原创 2020-07-08 21:48:23 · 120 阅读 · 0 评论 -
剑指--礼物的最大价值
剑指–礼物的最大价值1,题目:2,思路:方法一:动态规划:3,代码:方法一:动态规划:class Solution { public int maxValue(int[][] grid) { int m = grid.length, n = grid[0].length; for(int j = 1; j < n; j++) // 初始化第一行 grid[0][j] += grid[0][j - 1]原创 2020-07-08 21:01:27 · 112 阅读 · 0 评论 -
剑指--剪绳子 II
剑指–剪绳子 II1,题目:2,思路:方法一:也是通过找的规律:最后的结果只包含2和3(当然当总长度为2和3时单独处理), 那么很显然n >= 5时, 3*(n - 3) >= 2 * (n - 2) ,因此我们优先拆成3,最后剩余的拆成2。最后的结果一定是由若干个3和1或2组成.写法二:也是通过找规律出来的:循环结束的结果分为三种:1.n=2,等于说无限除以3,最后余下绳子长度为2,此时将res乘以2即可2.n=3,绳子全部用完,直接所有3相乘即可3.n=4,等于说余下绳原创 2020-07-07 17:33:08 · 130 阅读 · 0 评论 -
剑指--剪绳子
剑指–剪绳子1,题目:2,思路:方法一:这个是通过数字找规律的:第一步:定义dp[n]的值的含义为:数字n的乘积最大值n=2: 1+1 -->11=1; dp[2]=1;n=3: 2+1 -->21=2; dp[3]=2;n=4: 2+2 -->22=4; dp[4]=4;n=5: 3+2 -->32=6; dp[5]=6;貌似看不出规律,别急再多写几个n=6: 3+3 -->33=9;原创 2020-07-07 16:57:07 · 119 阅读 · 0 评论 -
剑指--机器人的运动范围
剑指–机器人的运动范围1,题目:2,思路:深度优先遍历 DFS算法解析:1.递归参数: 当前元素在矩阵中的行列索引 i 和 j ,两者的数位和 si, sj 。2.终止条件: 当 ① 行列索引越界 或 ② 数位和超出目标值 k 或 ③ 当前元素已访问过 时,返回 0 ,代表不计入可达解。3.递推工作:4.标记当前单元格 :将索引 (i, j) 存入 visited 中,代表此单元格已被访问过。5.搜索下一单元格: 计算当前元素的 下、右 两个方向元素的数位和,并开启下层递归 。6.原创 2020-07-05 12:18:23 · 173 阅读 · 0 评论 -
剑指--矩阵中的路径
剑指–矩阵中的路径1,题目:2,思路:深度优先搜索:算法剖析:1.递归参数: 当前元素在矩阵 board 中的行列索引 i 和 j ,当前目标字符在 word 中的索引 k 。2.终止条件:3.返回 false : ① 行或列索引越界 或 ② 当前矩阵元素与目标字符不同 或 ③ 当前矩阵元素已访问过 (③ 可合并至 ② ) 。4.返回 true : 字符串 word 已全部匹配,即 k = len(word) - 1 。5.递推工作:6.标记当前矩阵元素: 将 board[i][j原创 2020-07-05 11:21:31 · 146 阅读 · 0 评论 -
剑指--复杂链表的复制
剑指–复杂链表的复制1,题目:2,思路:方法一:用hashmap:1.创建HashMap2.复制结点值3.复制指向(next,random)3,代码:方法一:用hashmap:class Solution { //HashMap实现 public Node copyRandomList(Node head) { /* 1.创建HashMap 2.复制结点值 3.复制指向(next,random)原创 2020-07-05 10:15:38 · 97 阅读 · 0 评论 -
剑指--序列化二叉树
剑指–序列化二叉树1,题目:2,思路:序列化:算法流程:1.特例处理: 若 root 为空,则直接返回空列表 “[]” ;2.初始化: 队列 queue (包含根节点 root );序列化列表 res ;3.层序遍历: 当 queue 为空时跳出;4.节点出队,记为 node ;5.若 node 不为空:① 打印字符串 node.val ,② 将左、右子节点加入 queue ;6.否则(若 node 为空):打印字符串 “null” ;7.返回值: 拼接列表(用 ‘,’ 隔开,首尾原创 2020-07-04 17:08:07 · 88 阅读 · 0 评论 -
剑指--栈的压入、弹出序列
剑指–栈的压入、弹出序列1,题目:2,思路:思路:1.入栈操作: 按照压栈序列的顺序执行。2.出栈操作: 每次入栈后,循环判断 “栈顶元素 == 弹出序列的当前元素” 是否成立,将符合弹出序列顺序的栈顶元素全部弹出。算法流程:1.初始化: 辅助栈 stack ,弹出序列的索引 i ;2.遍历压栈序列: 各元素记为 num ;3.元素 num 入栈;4.循环出栈:若 stack 的栈顶元素 == 弹出序列元素 popped[i] ,则执行出栈与 i++ ;5.返回值: 若 sta原创 2020-07-03 21:53:47 · 128 阅读 · 0 评论 -
剑指--二叉搜索树与双向链表
剑指–二叉搜索树与双向链表1,题目:2,思路:方法一:中序遍历(递归版本):1.序链表: 节点应从小到大排序,因此应使用 中序遍历 “从小到大”访问树的节点;2.双向链表: 在构建相邻节点(设前驱节点 pre ,当前节点 cur )关系时,不仅应 pre.right=cur ,也应 cur.left=pre 。3.循环链表: 设链表头节点 head 和尾节点 tail ,则应构建 head.left=tail 和 tail.right=head 。算法流程:dfs(cur): 递归原创 2020-07-02 21:34:33 · 196 阅读 · 1 评论 -
剑指--重建二叉树
剑指–重建二叉树1,题目:2,思路:递归解析:1.递推参数: 前序遍历中根节点的索引pre_root、中序遍历左边界in_left、中序遍历右边界in_right。2.终止条件: 当 in_left > in_right ,子树中序遍历为空,说明已经越过叶子节点,此时返回 null 。3.递推工作:4.建立根节点root: 值为前序遍历中索引为pre_root的节点值。5.搜索根节点root在中序遍历的索引i: 为了提升搜索效率,本题解使用哈希表 dic 预存储中序遍历的值与索引的原创 2020-07-01 11:55:59 · 1008 阅读 · 0 评论 -
剑指--树的子结构
剑指–树的子结构1,题目:2,思路:写法二中的代码写的更便于理解。看写法二:解题思路:1.若树 B 是树 A 的子结构,则子结构的根节点可能为树 A 的任意一个节点。因此,判断树 B 是否是树 A 的子结构,需完成以下两步工作:2.先序遍历树 A 中的每个节点 n_A;(对应函数 isSubStructure(A, B))3.判断树 A 中 以 n_A为根节点的子树 是否包含树 B 。(对应函数 recur(A, B))recur(A, B) 函数:1.终止条件:2.当节点 B 为空原创 2020-07-01 10:34:50 · 99 阅读 · 0 评论 -
剑指--二叉树中和为某一值的路径
剑指–二叉树中和为某一值的路径1,题目:2,思路:回溯法(先序遍历+路径记录):思路:1.先序遍历: 按照 “根、左、右” 的顺序,遍历树的所有节点。2.路径记录: 在先序遍历中,记录从根节点到当前节点的路径。当路径为 ① 根节点到叶节点形成的路径 且 ② 各节点值的和等于目标值 sum 时,将此路径加入结果列表。算法流程:pathSum(root, sum) 函数:1.初始化: 结果列表 res ,路径列表 path 。2.返回值: 返回 res 即可。recur(root,原创 2020-07-01 10:06:06 · 2715 阅读 · 0 评论 -
剑指--二叉搜索树的后序遍历序列
剑指–二叉搜索树的后序遍历序列1,题目:2,思路:方法一:递归分治:解题思路:后序遍历定义: [ 左子树 | 右子树 | 根节点 ] ,即遍历顺序为 “左、右、根” 。二叉搜索树定义: 左子树中所有节点的值 < 根节点的值;右子树中所有节点的值 > 根节点的值;其左、右子树也分别为二叉搜索树。递归解析:1.终止条件: 当 i≥j ,说明此子树节点数量 ≤1 ,无需判别正确性,因此直接返回 true ;2.递推工作:3.划分左右子树: 遍历后序遍历的 [i,j] 区间原创 2020-06-30 12:13:34 · 135 阅读 · 0 评论 -
剑指--从上到下打印二叉树 III
剑指–从上到下打印二叉树 III1,题目:2,思路:层次遍历+双端队列:层数,根据层数不同,插入方式不同利用双端队列的两端皆可添加元素的特性,设打印列表(双端队列) tmp ,并规定:1.奇数层 则添加至 tmp 尾部 ,2.偶数层 则添加至 tmp 头部 。算法流程:1.特例处理: 当树的根节点为空,则直接返回空列表 [] ;2.初始化: 打印结果空列表 res ,包含根节点的双端队列 deque ;3.BFS 循环: 当 deque 为空时跳出;4.新建列表 tmp ,用原创 2020-06-30 10:26:46 · 92 阅读 · 0 评论 -
剑指--用两个栈实现队列
剑指–用两个栈实现队列1,题目:2,思路:方法一:双栈写法一:解题思路:1.栈无法实现队列功能: 栈底元素(对应队首元素)无法直接删除,需要将上方所有元素出栈。2.双栈可实现列表倒序: 设有含三个元素的栈 A = [1,2,3] 和空栈 B = []。若循环执行 A 元素出栈并添加入栈 B ,直到栈 A 为空,则 A = [] , B = [3,2,1] ,即 栈 B 元素实现栈 A 元素倒序 。3.利用栈 B删除队首元素: 倒序后,B 执行出栈则相当于删除了 A 的栈底元素,即对应队首元原创 2020-06-29 21:33:53 · 190 阅读 · 0 评论 -
leetcode(Tree)--路径总和 III
leetcode(Tree)–路径总和 III1,题目:2,思路:方法一:迭代法:以当前节点作为头结点的路径数量以当前节点的左孩子作为头结点的路径数量以当前节点的右孩子作为头结点啊路径数量方法二:用hashmap:前缀和的递归回溯思路:从当前节点反推到根节点(反推比较好理解,正向其实也只有一条),有且仅有一条路径,因为这是一棵树如果此前有和为currSum-target,而当前的和又为currSum,两者的差就肯定为target了所以前缀和对于当前路径来说是唯一的,原创 2020-06-28 20:35:17 · 147 阅读 · 0 评论 -
剑指--包含min函数的栈
剑指–包含min函数的栈1,题目:2,思路:1.push(x) 函数: 重点为保持栈 B 的元素是 非严格降序 的。2.将 x 压入栈 A (即 A.add(x) );3.若 ① 栈 B 为空 或 ② x 小于等于 栈 B 的栈顶元素,则将 x压入栈 B(即 B.add(x) )。4.pop() 函数: 重点为保持栈 A,B 的 元素一致性 。5.执行栈 A 出栈(即 A.pop() ),将出栈元素记为 y ;6.若 y 等于栈 B 的栈顶元素,则执行栈 B 出栈(即 B.pop() )原创 2020-06-26 18:41:54 · 132 阅读 · 0 评论 -
剑指--从上到下打印二叉树
剑指–从上到下打印二叉树这个题目和这个题目是很相似的,现在附上那个链接:剑指–从上到下打印二叉树 II以上这个链接的题目呢,也是打印树,就是这个一层单独放到一个数组中,最后在统一放到一个结果数组中。。1,题目:2,思路:层序遍历(用队列):(自己写的)算法流程:1.特例处理: 当树的根节点为空,则直接返回空列表 [] ;2.初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;3.BFS 循环: 当队列 queue 为空时跳出;4.出队: 队原创 2020-06-26 18:17:36 · 111 阅读 · 0 评论 -
剑指--从上到下打印二叉树 II
剑指–从上到下打印二叉树 II1,题目:2,思路:I. 按层打印: 题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。BFS 通常借助 队列 的先入先出特性来实现。II. 每层打印到一行: 将本层全部节点打印到一行,并将下一层全部节点加入队列,以此类推,即可分为多行打印。1.特例处理: 当根节点为空,则返回空列表 [] ;2.初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;3.BFS 循环: 当队列 qu原创 2020-06-26 17:33:09 · 146 阅读 · 0 评论 -
剑指--二叉树的最近公共祖先
剑指–二叉树的最近公共祖先都是寻找最近公共祖先,为什么这两道题是不一样的啊。这里附上另外一道题:剑指–二叉搜索树的最近公共祖先因为这道题是:二叉搜索树的最近公共祖先(也就是这棵树的左节点的值<root的值<右节点的值,所以这棵树寻找最近公祖先是比较简单的)。但是现在这道题的这棵树的值是没有规律的,所以寻找最近祖先是稍微麻烦点。1,题目:2,思路:方法一:递归写法1.根据以上定义,若 root 是 p,q 的 最近公共祖先 ,则只可能为以下情况之一:2.p 和 q 在 root原创 2020-06-26 16:45:39 · 199 阅读 · 0 评论 -
剑指--二叉搜索树的最近公共祖先
剑指–二叉搜索树的最近公共祖先1,题目:2,思路:方法一:迭代:根据以上定义,若 rootroot 是 p,qp,q 的 最近公共祖先 ,则只可能为以下情况之一:1.p 和 q 在 root 的子树中,且分列 root 的 异侧(即分别在左、右子树中);2.p=root,且 q 在 root的左或右子树中;3.q=root,且 p 在 root 的左或右子树中;方法一:迭代1.循环搜索: 当节点 root为空时跳出;2.当 p,q 都在 root 的 右子树 中,则遍历至 ro原创 2020-06-25 13:29:19 · 163 阅读 · 0 评论 -
剑指--二叉搜索树的第k大节点
剑指–二叉搜索树的第k大节点1,题目:2,思路:方法一:中序遍历后续+提前返回:中序遍历倒序 + 提前返回1.为求第 kk 个节点,需要实现以下 三项工作 :2.递归遍历时计数,统计当前节点的序号;3.递归到第 k 个节点时,应记录结果 res ;4.记录结果后,后续的遍历即失去意义,应提前终止(即返回)。递归解析:1.终止条件: 当节点 root 为空(越过叶节点),则直接返回;2.递归右子树: 即dfs(root.right) ;3.三项工作:4.提前返回: 若 k原创 2020-06-25 11:24:53 · 152 阅读 · 0 评论 -
剑指--平衡二叉树
剑指–平衡二叉树1,题目:2,思路:方法一:后序遍历+剪枝操作:后序遍历+剪枝操作:此树的深度 等于 左子树的深度 与 右子树的深度 中的 最大值 +1。dfs:1.返回值:2.当节点root 左 / 右子树的深度差 ≤1 :则返回当前子树的深度,即节点 root 的左 / 右子树的深度最大值 +1 ( max(left, right) + 1 );3.当节点root 左 / 右子树的深度差 >2 :则返回 -1,代表 此子树不是平衡树 。4.终止条件:5.当 root 为空原创 2020-06-24 13:26:57 · 133 阅读 · 0 评论 -
剑指--两个链表的第一个公共节点
剑指–两个链表的第一个公共节点1,题目:2,思路:方法一:两次遍历:1.考虑有公共节点的两个链表的特点:其结构看起来像一个倒下的Y,从第一个公共节点开始,之后它们所有的节点都是重合的,不可能再出现分叉。只是Y两端不重合的部分可能长度不同,我们可以采取以下方法来获得公共节点:2.首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个节点。3.在第二次遍历的时候,在较长的链表上先走若干步,接着同时在两个链表上遍历,找到的第一个相同的节点就是它们的第一个公共节点原创 2020-06-24 11:23:02 · 126 阅读 · 0 评论 -
剑指--反转链表
剑指–反转链表1,题目:2,思路:方法一:双指针:1.我们可以申请两个指针,第一个指针叫 pre,最初是指向 null 的。2.第二个指针 cur 指向 head,然后不断遍历 cur。3.每次迭代到 cur,都将 cur 的 next 指向 pre,然后 pre 和 cur 前进一位。4.都迭代完了(cur 变成 null 了),pre 就是最后一个节点了。下面是对应的图解:3,代码:方法一:双指针:class Solution { public ListNode reve原创 2020-06-24 10:51:07 · 94 阅读 · 0 评论 -
剑指--从尾到头打印链表
剑指–从尾到头打印链表1,题目:2,思路:方法一:普通方法(自己写的):先计算出链表的长度tmp重新指向开头节点从头到尾的链表的节点值从数组的最后开始往前放置方法二:栈:1.创建一个栈,用于存储链表的节点2.创建一个指针,初始时指向链表的头节点3.当指针指向的元素非空时,重复下列操作:4.将指针指向的节点压入栈内5.将指针移到当前节点的下一个节点6.获得栈的大小 size,创建一个数组 print,其大小为 size7.创建下标并初始化 index = 08.重复 si原创 2020-06-23 22:10:18 · 102 阅读 · 0 评论 -
剑指--链表中倒数第k个节点
剑指–链表中倒数第k个节点1,题目:2,思路:方法一:双指针:算法流程:1.初始化: 前指针 former 、后指针 latter ,双指针都指向头节点 head 。2.构建双指针距离: 前指针 former 先向前走 k 步(结束后,双指针 former 和 latter 间相距 k 步)。3.双指针共同移动: 循环中,双指针 former 和 latter 每轮都向前走一步,直至 former 走过链表 尾节点 时跳出(跳出后, latter 与尾节点距离为 k-1,即 latter原创 2020-06-23 21:51:05 · 91 阅读 · 0 评论 -
剑指--二叉树的镜像
剑指–二叉树的镜像1,题目:2,思路:方法一:递归:递归解析:1.终止条件: 当节点 root 为空时(即越过叶节点),则返回 null ;2.开启递归 右子节点 mirrorTree(root.right) ,并将返回值作为 root 的 左子节点 。3.开启递归 左子节点 mirrorTree(root.left) ,并将返回值作为 root 的 右子节点 。4.返回值: 返回当前节点 root;方法二:辅助栈(或队列)算法流程:1.特例处理: 当 root 为空时,直接返原创 2020-06-23 21:25:02 · 91 阅读 · 0 评论 -
剑指--合并两个排序的链表
剑指–合并两个排序的链表1,题目:2,思路:方法一:引入伪头结点(思路还是正常思路)引入伪头节点: 由于初始状态合并链表中无节点,因此循环第一轮时无法将节点添加到合并链表中。解决方案:初始化一个辅助节点 dum 作为合并链表的伪头节点,将各节点添加至 dum 之后。算法流程:1.初始化: 伪头节点 dum ,节点 cur 指向 dum。2.循环合并: 当l1或l2为空时跳出;当l1.val<l2.val 时: cur 的后继节点指定为 l1,并l1向前走一步;当 l原创 2020-06-22 21:05:01 · 131 阅读 · 0 评论 -
剑指--删除链表的节点
剑指–删除链表的节点这个和leetcode的237题思路是一样的,都是删除节点。但是写法不一样,因为给的参数不一样,所以写法是不一样的,但是实质是一样的。这里把leetcoe的237题放上,以作对比:leetcode237题:leetcode的237题的删除节点1,题目:2,思路:方法一:双指针:思路:1.定位节点: 遍历链表,直到 head.val == val 时跳出,即可定位目标节点。2,修改引用: 设节点 cur 的前驱节点为 pre ,后继节点为 cur.next ;则执行 pr原创 2020-06-21 18:52:52 · 138 阅读 · 0 评论 -
剑指--二叉树的深度
剑指–二叉树的深度1,题目:2,思路:方法一:后序遍历(DFS):关键点: 此树的深度和其左(右)子树的深度之间的关系。显然,此树的深度 等于 左子树的深度 与 右子树的深度 中的 最大值 +1 。算法解析:1.终止条件: 当 root 为空,说明已越过叶节点,因此返回 深度 0 。2.递推工作: 本质上是对树做后序遍历。3.计算节点 root 的 左子树的深度 ,即调maxDepth(root.left);4.计算节点 root 的 右子树的深度 ,即调maxDepth(roo原创 2020-06-21 10:41:41 · 98 阅读 · 0 评论 -
剑指-- 对称的二叉树
剑指-- 对称的二叉树这个和leetoce的101题是一样的,所以笔记也是和101题是一样的。1,题目:2,思路:方法一:递归:如果同时满足下面的条件,两个树互为镜像:1.它们的两个根结点具有相同的值2.每个树的右子树都与另一个树的左子树镜像对称我们可以实现这样一个递归函数,通过「同步移动」两个指针的方法来遍历这棵树,p 指针和 q 指针一开始都指向这棵树的根,随后 p 右移时,q 左移,p左移时,q 右移。每次检查当前 p 和 q 节点的值是否相等,如果相等再判断左右子树是否对称。方原创 2020-06-21 10:04:31 · 143 阅读 · 0 评论 -
剑指--数字序列中某一位的数字
剑指–数字序列中某一位的数字1,题目:2,思路:解题思路:1.将101112⋯ 中的每一位称为 数位 ,记为 n ;2.将10,11,12,⋯ 称为 数字 ,记为 num ;3.数字 10是一个两位数,称此数字的 位数 为 2 ,记为 digit ;4.每 digit 位数的起始数字(即:1,10,100,⋯),记为 start 。根据以上分析,可将求解分为三步:1.确定 n 所在 数字 的 位数 ,记为 digit ;2.确定 n 所在的 数字 ,记为 num ;3.确定 n 是 n原创 2020-06-16 21:12:48 · 178 阅读 · 0 评论 -
剑指-- 二进制中1的个数
剑指-- 二进制中1的个数1,题目:2,思路:方法一:逐位判断:1,根据 与运算 定义,设二进制数字 n, ,则有:若 n&1=0 ,则 n 二进制 最右一位 为 0 ;若 n&1=1 ,则 n 二进制 最右一位 为 1 。2,根据以上特点,考虑以下 循环判断 :判断 n 最右一位是否为 1 ,根据结果计数。将 n 右移一位(本题要求把数字 n 看作无符号数,因此使用 无符号右移 操作)。算法流程:1.初始化数量统计变量res=0 。2,循环逐位判断: 当 n=0原创 2020-06-14 09:53:53 · 164 阅读 · 0 评论 -
剑指--表示数值的字符串
剑指–表示数值的字符串1,题目:2,思路:方法一:普通方法(就是根据题意,一种情况一种情况的来判断):就是根据题意,一种情况一种情况的来判断:比如,e出现的位置有什么要求,.出现的位置有什么要求等一种情况一种情况的来判断。(题解中还有一种方法:状态机的方法,但是我没有看懂,所以就没有写这种方法,以后看懂了再补上。)3,代码:方法一:普通方法(就是根据题意,一种情况一种情况的来判断)class Solution { public boolean isNumber(String s)原创 2020-06-13 09:54:58 · 123 阅读 · 0 评论 -
剑指--股票的最大利润
剑指–股票的最大利润1,题目:2,思路:方法一:普通方法(遍历数组记录最小的值):(这个是自己写的)记录当前曾遇到过的最小值:1,遍历数组时,记录当前所遍历过的最小值。,2,若当前遍历值 < 所遍历过的最小值,则更新最小值;3,否则,用当前遍历值 - 所遍历过的最小值。方法二:动态规划:动态规划:1,状态定义: 设动态规划列表 dp ,dp[i] 代表以 prices[i] 为结尾的子数组的最大利润(以下简称为 前 i 日的最大利润)。2,转移方程:原创 2020-06-12 10:11:07 · 175 阅读 · 0 评论 -
剑指--求1+2+…+n
剑指–求1+2+…+n1,题目:2,思路:一些简单的for循环,还有数学公式n*(n+1)/2,是可以计算的,但是题意要求是不能用乘除法,for循环等。所以这种简单的方法就抛弃了。递归:(加短路效应)虽说上面这个递归写法有if不符合要求,但是可以根据这个思路来实现,难点就是怎样找出跳出递归的条件(不用if)根据这个,我们引出来下面的写法:利用逻辑运算的短路效应。其实质是递归。只不过把上面的if(n==1) return 1这个跳出递归的if条件,换成了下面的逻辑运算的短路效应。算法流程:原创 2020-06-11 18:27:36 · 357 阅读 · 0 评论