- 博客(39)
- 收藏
- 关注
原创 三维形体的表面积
我们可以用2n个机器人,分别两队,从左到右(每行一个),从上到下(每列一个)走过每个网格顶部,加上所有相邻顶部的落差,这便是所有的侧表面积,同时判断此网格不为0,不为0便多加2,这是顶底表面积。刚碰到这道题时,并没有特别思路,经过作图和一些启发,我们可以用累加重叠,算出单独的表面积,求和,在减去覆盖的面积。直到一幅水从上到下,从左到右流过表面的图像出现在脑海,有了新的启发。在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。输入:[[2,1],[1,0]]输出:18。
2023-02-14 13:19:09 388
原创 Java 模态窗口改变大小
首先设计一个JFrame,上面有一个按钮,文字是 “打开一个模态窗口”。点击该按钮后,随即打开一个模态窗口。在这个模态窗口中有一个按钮,文本是 “锁定大小”, 点击后,这个模态窗口的大小就被锁定住,不能改变。 再次点击,就回复能够改变大小代码:import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;public class 对话框 { public static
2020-10-26 20:39:18 525 1
原创 201. 数字范围按位与——lecot
给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。示例 1:输入: [5,7]输出: 4示例 2:输入: [0,1]输出: 0思路:1.这道题刚看见时,很容易想到迭代所有的数字进行按位与,但因为次数太多会超时解题规律:【sss0xxxx,sss1xxxx】,(二进制表示,其中s表示两数的该位相同,x表示两数的该位可同可不同)那么答案为sss00000证明:1.现在考虑到我们按位与
2020-09-01 13:17:15 267
原创 力扣——1139. 最大的以 1 为边界的正方形
给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在,则返回 0。示例 1:输入:grid = [[1,1,1],[1,0,1],[1,1,1]]输出:9示例 2:输入:grid = [[1,1,0,0]]输出:1提示:1 <= grid.length <= 1001 <= grid[0].length <= 100grid[i][j] 为 0 或 1思路:1.如何遍历
2020-08-18 11:20:56 184
原创 第k个排列——回溯和全排列规律谁更胜一筹
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:“123”“132”“213”“231”“312”“321”给定 n 和 k,返回第 k 个排列。说明:给定 n 的范围是 [1, 9]。给定 k 的范围是[1, n!]。示例 1:输入: n = 3, k = 3输出: “213”示例 2:输入: n = 4, k = 9输出: “2314”思路:1.先来看回溯:依次递归全排列
2020-08-07 08:58:36 211
原创 力扣——格雷码
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案,你也只需要返回其中一种。格雷编码序列必须以 0 开头。示例 1:输入: 2输出: [0,1,3,2]解释:00 - 001 - 111 - 310 - 2对于给定的 n,其格雷编码序列并不唯一。例如,[0,2,3,1] 也是一个有效的格雷编码序列。00 - 010 - 211 - 301 - 1示例 2:输入: 0输出
2020-08-02 21:24:41 226
原创 力扣——黄金矿工
你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0。为了使收益最大化,矿工需要按以下规则来开采黄金:每当矿工进入一个单元,就会收集该单元格中的所有黄金。矿工每次可以从当前位置向上下左右四个方向走。每个单元格只能被开采(进入)一次。不得开采(进入)黄金数目为 0 的单元格。矿工可以从网格中 任意一个 有黄金的单元格出发或者是停止。示例 1:输入:gr
2020-07-31 18:39:36 319
原创 199. 二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释:1 <—/ \2 3 <—\ \5 4 <—思路:本题目的是找每层的最有个节点所以采用宽度优先遍历的到每层的队列将最后一个元素加入队列代码:class Solution: def rightSi
2020-07-22 17:52:52 98
原创 117. 填充每个节点的下一个右侧节点指针 II
给定一个二叉树struct Node {int val;Node *left;Node *right;Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。进阶:你只能使用常量级额外空间。使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。示例:输入:root = [1,2,3,4,5,null,7]输出:[1
2020-07-22 17:18:53 92
原创 D/BFS之二叉树展开为链表
给定一个二叉树,原地将它展开为一个单链表。本题是将原树1变为先序遍历不变的只含右子树的树2所以我们要先保证先序遍历不变,将他全转到一侧,当全部的右节点都完成此操作时,便是所求。规律:将右子树接到左子树的最右子树的右子树位置将新左子树接到原右子树位置虑新的右子树的根节点,一直重复上边的过程,直到新的右子树为 None def dg(root): if not root: return if ro
2020-07-08 18:20:39 104
原创 力扣之路径总和 II
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:[[5,4,11,2],[5,8,4,5]]思路:要找出所有正确路径,我们就要遍历所有的路径,所有使
2020-07-08 16:15:19 198
原创 单词接龙
给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。示例 1:输入:beginWord = “hit”,endWord = “
2020-07-07 18:53:50 184
原创 从前序与中序(中序和后序)遍历序列构造二叉树
题1:根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树:题2:根据一棵树的中序遍历与后序遍历构造二叉树。这两道题的解法是一样的,模板也是一样的我们以题1为例思路:前序排列意义图 根|左子树|右子树后序排列意义图 左子树|根|右子树而我们要找根1和左右孩子根2的位置分别在哪前序遍历中,根总是在所在子树
2020-07-06 17:28:01 242
原创 力扣 103. 二叉树的锯齿形层次遍历
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例如:给定二叉树 [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回锯齿形层次遍历如下:[[3],[20,9],[15,7]]思路:逐层遍历,所以优先选择BFS(宽度优先)如果正常顺序(统一从左到右)的话,可以先看这个二叉树的层序遍历锯齿遍历的话,解题思路如下:1.我们不改变进队列的顺序,下层一直按从左到右进队。2.
2020-07-03 18:51:57 224 1
原创 力扣 二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],3/ 9 20/ 15 7返回其层次遍历结果:[[3],[9,20],[15,7]]思路:这道题要求将树每一层的值存一个列表,所有层的列表存一个列表中所以使用BFS(广度优先),逐层遍历(同时确定遍历的层数)是可行的同时DFS(深度优先),可以使用字典记录 层数:[数值]。也是可行的1.BFS模板遍历时不用明
2020-07-03 17:14:55 231
原创 层数最深叶子节点的和之超简单
给你一棵二叉树,请你返回层数最深的叶子节点的和。示例:输入:root = [1,2,3,4,5,null,6,7,null,null,null,null,8]输出:15提示:树中节点数目在 1 到 10^4 之间。每个节点的值在 1 到 100 之间。思路:我们只需要搜索所有的叶子结点,并把相同层数的叶子节点值加在一起最后输出层数最大的值数据:用字典:键为层数,值为数值设计:参数传递:子结点,字典,层数基例:如果是叶子结点则根据层数增加值,返回字典其它操作:无递归:深度优先,
2020-06-25 22:48:01 440
原创 祖父节点值为偶数的节点和
给你一棵二叉树,请你返回满足以下条件的所有节点的值之和:该节点的祖父节点的值为偶数。(一个节点的祖父节点是指该节点的父节点的父节点。)如果不存在祖父节点值为偶数的节点,那么返回 0 。示例:输入:root = [6,7,8,2,7,1,3,9,null,1,4,null,null,null,5]输出:18解释:图中红色节点的祖父节点的值为偶数,蓝色节点为这些红色节点的祖父节点。提示:树中节点的数目在 1 到 10^4 之间。每个节点的值在 1 到 100 之间。思路:本题中,我们要找的
2020-06-25 17:59:29 221
原创 不同路径之深度遍历模型
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11
2020-06-25 16:17:42 192
原创 链表之超直白的两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。这道题并不难,不过写代码之前一定先搞清楚这两种情况两链表不等长两链表等长不等长时我们要选择最长的链表保存结果还要计算进位,和后续位的相加等长时哪个链表都可以保存同样进位计算,只不过仅有一位这样看来不等长的计算包含了等长
2020-06-07 16:04:25 148
原创 单调递增的数字之贪心算法
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)贪心策略:情况1:1234的递增的,直接不变情况2:12321的3>2,所以3要减一,后面的所有位变成9,满足最大有递增,满足题意情况3:特例,123321,中要为122999,而非123299,所以要记录本位连续相同个数从左到右,当高位等于次高位,重复数k加一;否则,小于,不变,
2020-06-06 18:37:12 326
原创 划分数组为连续数字的集合
给你一个整数数组 nums 和一个正整数 k,请你判断是否可以把这个数组划分成一些由 k 个连续数字组成的集合。如果可以,请返回 True;否则,返回 False。现在做了几十到贪心算法之后,发现贪心策略并不难找,而是用什么样数据结构,以及怎样用数据实现贪心逻辑,所以以后贪心算法我分为三部分讲解贪心策略:讲解本题解题思路数据结构:介绍本题会用到几组数据,分别什么类型,普遍作用。代码:几组数据如何,相互协作,完成逻辑贪心策略:以112233 k=3为例,发现开始的最小值i总是和,i+1~i+k
2020-06-05 18:40:42 290
原创 最长快乐字符串——zkp~
如果字符串中不含有任何 ‘aaa’,‘bbb’ 或 ‘ccc’ 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s:s 是一个尽可能长的快乐字符串。s 中 最多 有a 个字母 ‘a’、b 个字母 ‘b’、c 个字母 ‘c’ 。s 中只含有 ‘a’、‘b’ 、‘c’ 三种字母。如果不存在这样的字符串 s ,请返回一个空字符串 “”。现在做了几十到贪心算法之后,发现贪心策略并不难找,而是用什么样数据结构,以及怎样用数
2020-06-05 18:05:10 255
原创 有效括号的嵌套深度之简单方法
**有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。详情参见题末「有效括号字符串」部分。嵌套深度 depth 定义:即有效括号字符串嵌套的层数,depth(A) 表示有效括号字符串 A 的嵌套深度。详情参见题末「嵌套深度」部分。有效括号字符串类型与对应的嵌套深度计算方法如下图所示:给你一个「有效括号字符串」 seq,请你将其分成两个不相交的有效括号字符串,A 和 B,并使这两个字符串的深度最小。不相交:每个 seq[i] 只能分给 A 和 B 二者中的一个,不能既属于 A
2020-06-04 15:18:38 727
原创 贪心算法——移除K位数字
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。注意:num 的长度小于 10002 且 ≥ k。num 不会包含任何前导零。例子:输入: num = “1432219”, k = 3输出: “1219”解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。问题:贪心策略数据转换解决:贪心策略:有很多种移除一位的结果,但每种结果的位数都是相同的。相同位数的两个数判断大小的方法是什么? 较高位的大小所以每次移除都要尽量使
2020-06-04 10:53:50 987
原创 给懒人写的优势洗牌
给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。返回 A 的任意排列,使其相对于 B 的优势最大化。难点分析:如何贪心匹配如何保存匹配结果贪心匹配:田忌赛马:总是在A中找到最小能大于B的元素与其匹配这会剩下B[i]>max(A)的元素,将其和A未匹配元素任意匹配即可保存匹配元素:注意题目要按B原排列输出,而对B排序后,匹配结果顺序已变,所以一组数据记录原排序,一组数据记录匹配结果。;两组数据生成原排
2020-06-04 09:14:52 161
原创 LeetCode 767. 秒懂重构字符串
给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。若可行,输出任意可行的结果。若不可行,返回空字符串。例子:输入: S = “aab”输出: “aba”难点分析:如何断定是否可构若可构,如何贪心排列思路:如何断定是否可构:对于任何一种字符,从自身角度看,仅分为同种和不同种。所以只要每种字符都不大于长度的一半(奇数个时,入ababa,向上取整),变可重构如何贪心排列:总是将数量最多元素,优先散列开来。将数量由多到少的同种元素,依次先放到奇数位,当奇数位满后,在排满
2020-06-03 22:36:38 206
原创 重叠区间问题之逆思维的贪心算法
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。注意:可以认为区间的终点总是大于它的起点。区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。本题主要有两个难点:如何找到贪心策略如何断定两区间重叠贪心策略:问题转化:移除那个区间,转化为选择哪些区间贪心选择: 根据每个区间的末尾排序,由小到大,这样下一个元素更不可能与其重叠,我们选择的便就更多。当新区间和上一个选择的重叠时,因为他的结尾更大,我们只需记录移除加一,不选择他当新区间未和上一个选
2020-06-03 16:52:31 255
原创 跳跃游戏之超简单的贪心算法
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。例子:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。思路:不考虑每一步的如何向后跳跃考虑是否可以到本位置,如果可以则计算本位置可跳跃的最远位置选择记录最大的max_now遍历完后,若max_now不小于末尾位置,return True代码:cl
2020-06-03 12:12:34 171
原创 检查一个字符串是否可以打破另一个字符串
给你两个字符串 s1 和 s2 ,它们长度相等,请你检查是否存在一个 s1 的排列可以打破 s2 的一个排列,或者是否存在一个 s2 的排列可以打破 s1 的一个排列。字符串 x 可以打破字符串 y (两者长度都为 n )需满足对于所有 i(在 0 到 n - 1 之间)都有 x[i] >= y[i](字典序意义下的顺序)。贪心策略:s1,s2分别递增(递减)排序,将较小的与较小的字母比较。算法1:比较整个字符串,检测是否全为s1[i]>=s2[i],或者s1[i]<=s2[i
2020-06-03 11:22:18 206
原创 摇摆序列之找拐点
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来
2020-06-02 15:59:38 860
原创 交换字符使得字符串相同之超易懂的贪心算法问题
有两个长度相同的字符串 s1 和 s2,且它们其中 只含有 字符 “x” 和 “y”,你需要通过「交换字符」的方式使这两个字符串相同。每次「交换字符」的时候,你都可以在两个字符串中各选一个字符进行交换。交换只能发生在两个不同的字符串之间,绝对不能发生在同一个字符串内部。也就是说,我们可以交换 s1[i] 和 s2[j],但不能交换 s1[i] 和 s1[j]。最后,请你返回使 s1 和 s2 相同的最小交换次数,如果没有方法能够使得这两个字符串相同,则返回 -1 。例子:输入:s1 = “xx”,
2020-06-02 09:30:16 496
原创 坏了的计算器之逆向思维的贪心问题
在显示着数字的坏计算器上,我们可以执行以下两种操作:双倍(Double):将显示屏上的数字乘 2;递减(Decrement):将显示屏上的数字减 1 。最初,计算器显示数字 X。返回显示数字 Y 所需的最小操作数。例如:输入:X = 2, Y = 3输出:2解释:先进行双倍运算,然后再进行递减运算 {2 -> 4 -> 3}.思路(首先,你一定要记住X到Y,这能用2增加和-1减少,这便要求最后一次2后,一定要X>=Y)当X>Y时,那就很简单了,直接返回X-Y
2020-06-02 08:26:29 322
原创 行相等的最少多米诺旋转之贪心问题
在一排多米诺骨牌中,A[i] 和 B[i] 分别代表第 i 个多米诺骨牌的上半部分和下半部分。(一个多米诺是两个从 1 到 6 的数字同列平铺形成的 —— 该平铺的每一半上都有一个数字。)我们可以旋转第 i 张多米诺,使得 A[i] 和 B[i] 的值交换。返回能使 A 中所有值或者 B 中所有值都相同的最小旋转次数。如果无法做到,返回 -1.例子:输入:A = [2,1,2,4,2,2], B = [5,2,6,2,3,2]输出:2思路:如果存在满足题意的话,那么任意多米诺骨牌的A[i]和
2020-06-01 16:20:24 155
原创 删列造序之省存的递归解法
给定由 N 个小写字母字符串组成的数组 A,其中每个字符串长度相等。你需要选出一组要删掉的列 D,对 A 执行删除操作,使 A 中剩余的每一列都是 非降序 排列的,然后请你返回 D.length 的最小可能值。删除 操作的定义是:选出一组要删掉的列,删去 A 中对应列中的所有字符,形式上,第 n 列为 [A[0][n], A[1][n], …, A[A.length-1][n]])。(可以参见 删除操作范例)例子:输入:[“cba”, “daf”, “ghi”]输出:1解释:当选择 D = {
2020-06-01 10:49:41 132
原创 模拟行走机器人之略有技巧的贪心算法
机器人在一个无限大小的网格上行走,从点 (0, 0) 处开始出发,面向北方。该机器人可以接收以下三种类型的命令:-2:向左转 90 度-1:向右转 90 度1 <= x <= 9:向前移动 x 个单位长度在网格上有一些格子被视为障碍物。第 i 个障碍物位于网格点 (obstacles[i][0], obstacles[i][1])机器人无法走到障碍物上,它将会停留在障碍物的前一个网格方块上,但仍然可以继续该路线的其余部分。返回从原点到机器人所有经过的路径点(坐标为整数)的最大欧式
2020-06-01 09:04:22 375
原创 两地调度之超易懂的贪心算法问题
公司计划面试 2N 人。第 i 人飞往 A 市的费用为 costs[i][0],飞往 B 市的费用为 costs[i][1]。返回将每个人都飞到某座城市的最低费用,要求每个城市都有 N 人抵达。例如:输入:[[10,20],[30,200],[400,50],[30,20]]输出:110解释:第一个人去 A 市,费用为 10。第二个人去 A 市,费用为 30。第三个人去 B 市,费用为 50。第四个人去 B 市,费用为 20。思路每人必去一个城市,只不过两个城市之间有一个差价 cos
2020-05-31 21:03:17 1605
原创 递归乘法之位运算
递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。例题:输入:A = 1, B = 10输出:10思路:1.递归加法两个数相乘,a*b等价于将b加个a次 def dg(self,a,b): if a==1: return b return self.dg(a-1,b)+b但是这样计算的,当输入1001,1时,会出现一下错误提示:RecursionError: max
2020-05-31 08:03:13 784
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人