algorithm practice
海绵宝宝去哪儿了
目前在字节做android,慢慢干吧哈哈哈
展开
-
JZ 20 表示数值的字符串:抽象与逻辑练习
题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"-1E-16"、"0123"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。思路:面对情况较多并且前后顺序混乱的这种问题,我们应该先抽象出合理数字的模型,再拆分问题进行解决;举个例子:对于数字**-16.321E-16**可以说是这种情况下所有条件都加上了;对这个数字进行拆分:【-16】【.】【321】【E/原创 2020-08-17 16:15:10 · 349 阅读 · 0 评论 -
最小公倍数与最大公约数求法:辗转相除
题目:正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。思路:最小公倍数 = 两数之和 / 最大公约数所以如何求最大公约数呢辗转相除:A与B(A>B)A / B = C .....D;(if D != 0)next..A = B;B = D; A / B = C ....D;重复这个过程,直到D == 0;此时,B即为最大公约数代码:#include <bits/stdc++.h&g.原创 2020-07-29 11:26:34 · 218 阅读 · 0 评论 -
LC 116/117填充每个节点的下一个右侧节点指针(层序遍历的应用)
题目:给定一个二叉树struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为NULL。初始状态下,所有next 指针都被设置为NULL。进阶:你只能使用常量级额外空间。 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。示例:输入:r...原创 2020-07-28 09:52:10 · 144 阅读 · 0 评论 -
LC 二叉树通过两种遍历创建二叉树问题
**题目1 :从中序与后序遍历序列构造二叉树 **根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7思路:这类问题的解法是统一的,使用递归来完成比较方便,唯一不同的是在建树过程中, 传入的参数可能因为入参的改变而改变;// 1.原创 2020-07-26 22:28:08 · 227 阅读 · 0 评论 -
LC101 对称二叉树(三种解法:递归、迭代、层序遍历后比较字符)
题目:给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [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 进阶:你可以运用递归和迭代两种方法解决这个问题吗?思路:方案一:递归通过递归解决的思路是:传入根节点的左右结点分别为 p 和原创 2020-07-24 10:28:07 · 178 阅读 · 0 评论 -
JZ 16:数值的整数次方(mid)
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。 示例 1:输入: 2.00000, 10输出: 1024.00000示例 2:输入: 2.10000, 3输出: 9.26100示例 3:输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 = 1/4 = 0.25 说明:-100.0 < x < 100原创 2020-07-02 20:40:32 · 197 阅读 · 0 评论 -
JZ :14 剪绳子-I (动态规划 or 贪心)
题目:给你一根长度为 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。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4原创 2020-07-01 15:28:22 · 192 阅读 · 0 评论 -
JZ 13: 机器人运动范围(DFS / 回溯)
题目:地上有一个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:原创 2020-07-01 14:16:44 · 170 阅读 · 0 评论 -
JZ:12 矩形中的路径(回溯/ DFS)
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[["a","b","c","e"],["s","f","c","s"],["a","d","e","e"]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵原创 2020-07-01 00:25:48 · 275 阅读 · 0 评论 -
JZ: 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思路:方案一:简单的知己遍历查找:时间复杂度:O(n),空间O(1)因为题目中所提供的是一个排序的原始数组,因此我们只要循环一次,找到变小的那个元素,这个元素原创 2020-06-24 21:46:30 · 184 阅读 · 0 评论 -
JZ 07重建二叉树(利用前序遍历和中序遍历还原整个二叉树)
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7 限制:0 <= 节点个数 <= 5000思路:前序遍历:根左右(例如:【1, 2, 4,7, 3, 5, 6, 8】)中序遍历原创 2020-06-22 15:02:49 · 169 阅读 · 0 评论 -
JZ 05. 替换空格
题目:思路:方法一:暴力复制:从前向后遍历整个字符串,遇到空格,将后面的全部元素向后移动两个位置并在空格处添加“20%”; 时间复杂度:O(n*m)(对于长度为m,含有n个空格的字符串)方法二:原地复制:从后向前复制,遇到空格就复制20%,直到最初的起点;需要获得字符串的长度并通过遍历一次来得知,替换后的字符串长度为多少;需要注意的是:对于string类型字符串,不可以通过索引直接访问未初始化的内存;这也是为什么在第一次循环时,将s+=“00”*,其目的是将字符串的内存初始化;如果未初始化直接写原创 2020-06-21 19:06:44 · 226 阅读 · 0 评论 -
JZ:04二维数组中的查找
题目:在一个 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,返原创 2020-06-21 13:52:17 · 153 阅读 · 0 评论 -
字母异位词分组: 中等难度(设计hash键值)
题目:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"]输出:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]说明:所有输入均为小写字母。不考虑答案输出的顺序。思路:分析题目含义:字母相同的即为一个类别,期望分到一个组中并在return vec中组成一个vec如何实现辨别是否为同一组:使用原创 2020-06-18 21:53:53 · 127 阅读 · 0 评论 -
两个数组的交集 II
题目:给定两个数组,编写一个函数来计算它们的交集。示例 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 的大小比 nums2 小很多,哪种方法更优原创 2020-06-17 21:03:11 · 144 阅读 · 0 评论 -
两个列表的最小索引总和:unordered_map
题目:假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设总是存在一个答案。示例 1:输入:["Shogun", "Tapioca Express", "Burger King", "KFC"]["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakho原创 2020-06-17 20:00:18 · 231 阅读 · 0 评论 -
两数之和:使用unordered_map遍历一次实现
题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]思路:方法1 :暴力遍历,遍历每一个元素以及其后面的所有元素,找到符合条件的;时间复杂度:n + n -1 +原创 2020-06-17 18:58:06 · 2378 阅读 · 0 评论 -
三维 背包问题:DP求解
题目:小v是公司的运维工程师,现有一个有关应用程序部署的任务如下:1、一台服务器的磁盘空间、内存是固定的,现在有N个应用程序要部署;2、每个应用程序所需要的磁盘、内存不同,每个应用程序允许访问的用户数也不同,且同一个应用程序不能在一台服务器上部署多个。对于一台服务器而言,如何组合部署应用程序能够使得单台服务器允许访问的用户数最多?输入描述:输入包括三个参数,空格分隔,分别表示服务器的磁盘大小、内存大小,以及应用程序列表;其中第三个参数即应用程序列表,表述方式为:多个应用程序信息之间用 '#'原创 2020-06-06 15:22:46 · 1716 阅读 · 0 评论 -
复制带随机指针的链表
题目:给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的 深拷贝。 我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:val:一个表示 Node.val 的整数。random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。示例 1:输入:head = [[7,null],[13,0],[11,4],[1原创 2020-05-25 23:55:26 · 189 阅读 · 0 评论 -
扁平化多级双向链表(利用DFS建立新的链表)
题目:多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。给你位于列表第一级的头节点,请你扁平化列表,使所有结点出现在单级双链表中。示例 1:输入:head = [1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12]输出:[1,2,3,7,8,11,12,9,10,4,5,6]解释:输入的多级列表如原创 2020-05-17 21:14:29 · 254 阅读 · 0 评论 -
两数相加(链表综合练习:在一个while中分治处理各个链表;)
题目:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807思路:最初的想法:链表的起点相当于个位,后面原创 2020-05-15 21:04:19 · 323 阅读 · 0 评论 -
合并两个有序链表
题目:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路:设置一个起始点作为头结点,最后返回这个节点的nextwhile循环(l1 和 l2都不为空):向返回的链表中添加小节点循环结束后将剩下的部分连接到返回链表的尾部;代码:/** * Definition for singly-linked li原创 2020-05-15 20:03:02 · 120 阅读 · 0 评论 -
设计链表(双链表)
题目:设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成原创 2020-05-15 11:49:16 · 458 阅读 · 1 评论 -
判断回文链表(方1:用vector存储每个结点的指针 方2:翻转链表前半段)
题目:请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true思路:方一:遍历整个链表一次,利用vector存储每个链表结点元素的指针利用数组前后指针遍历一次,判断是否相同;见代码1方二:使用快慢指针遍历一次链表,找到中间结点;将链表的前半部分翻转,然后从中...原创 2020-05-05 21:39:50 · 211 阅读 · 0 评论 -
奇偶链表
题目:给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例 1:输入: 1->2->3->4->5->NULL输出: 1->3->5...原创 2020-05-05 16:54:06 · 151 阅读 · 0 评论 -
移除链表中的某个元素(简单的哨兵作为伪头结点的思想)
题目:删除链表中等于给定值 val 的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5思路:方法一:设置一个pre结点,指向当前结点的前一个结点,需要判断是否为头结点,进行不同的处理;见下方代码方法二:类似方1,设置一个哨兵结点(伪头结点),这样每一个结...原创 2020-05-05 15:59:31 · 206 阅读 · 0 评论 -
删除链表的倒数第N个节点(方1:利用vector存储位置 方2:利用双指针间隔N)
题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。进阶:你能尝试使用一趟扫描实现吗?思路:方法一: 使用vector记录每一个位置元素的指针...原创 2020-05-05 14:55:22 · 150 阅读 · 0 评论 -
环形链表I II,判断链表是否有环(代码实现)
理论推导见之前的:快慢指针判断链表是否有环,找到环的入口,公式推导;题目1:给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第...原创 2020-05-05 13:23:42 · 351 阅读 · 0 评论 -
移动零(方1:利用vector erase实现,方2:利用双指针思想实现)
题目:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。分析:方法一: 直接遍历,遇到0就删除,并在数组末尾添加见代码1方法二: 与上一篇文章相似,方法一比较耗时,如果能够只针对非0元素进行移...原创 2020-04-25 15:49:52 · 120 阅读 · 0 评论 -
删除排序数组中的重复项(方法一:利用vector.erase时间较慢 方法二:利用双指针思路,替换前指针数据)
题目:给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1:给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面...原创 2020-04-25 15:13:25 · 340 阅读 · 0 评论 -
翻转字符串里的单词(方法一:利用额外空间,方法二:原地翻转,空间复杂度O1):花了好长时间调试第二种方法。
题目:给定一个字符串,逐个翻转字符串中的每个单词。示例 1:输入: "the sky is blue"输出: "blue is sky the"示例 2:输入: " hello world! "输出: "world! hello"解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入: "a good example"输出...原创 2020-04-21 20:07:09 · 1148 阅读 · 1 评论 -
杨辉三角II:两层循环(方1:两个容器 方2:一个容器
题目:给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 3输出: [1,3,3,1]分析:杨辉三角下一层元素(除去第一个和最后一个)是上一层相应索引 i 和 i-1两个元素的和;但是一层循环无法即控制层数,又控制当前层数的元素;因此使用两层循环,分别对应层数 和 当前层的元素;使用两个容器...原创 2020-04-21 16:59:54 · 190 阅读 · 0 评论 -
旋转数组(方法一:循环链表的思想 方法二:纯粹的旋转数组)
题目:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例 1:输入: [1,2,3,4,5,6,7] 和 k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]示例 2:输入: [-1,-100,3,...原创 2020-04-21 14:41:23 · 152 阅读 · 0 评论 -
长度最小的子数组(方1:暴力循环(不推荐) 方2:双指针思路(左右窗口滑动:一个意思))
题目:给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。示例: 输入: s = 7, nums = [2,3,1,2,4,3]输出: 2解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。进阶:如果你已经完成了O(n) 时间复杂度的解法, 请尝试 O(n log n) ...原创 2020-04-19 19:21:12 · 253 阅读 · 0 评论 -
移除元素(暴力(使用STL:vector.erase);双指针)
题目:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums...原创 2020-04-19 15:58:16 · 411 阅读 · 0 评论 -
双指针应用:反转字符串、数组拆分I、两数之和II-输入有序数组;
题目:数组拆分给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。示例 1:输入: [1,4,3,2]输出: 4解释: n 等于 2, 最大总和为 4 = min(1, 2) + min(3, 4).提示:n 是正整数,范围在 [1,...原创 2020-04-19 13:58:34 · 239 阅读 · 0 评论 -
最长公共前缀(循环)
题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。示例 1:输入: ["flower","flow","flight"]输出: "fl"示例 2:输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。说明:所有输入只包含小写字母 a-z 。分析:最先想到的就是暴力循环:将每个元素...原创 2020-04-19 13:33:31 · 144 阅读 · 0 评论 -
二进制求和
题目:给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。 示例 1:输入: a = "11", b = "1"输出: "100"示例 2:输入: a = "1010", b = "1011"输出: "10101" 提示:每个字符串仅由字符 '0' 或 '1' 组成。1 <= a.length, b.len...原创 2020-04-13 13:37:38 · 288 阅读 · 0 评论 -
螺旋矩阵(数学问题= - =)
题目:给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:输入:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]示例 2:输入:[ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12]]...原创 2020-04-12 16:18:44 · 548 阅读 · 0 评论 -
对角线遍历(按照斜着的层次进行遍历)解法
题目:给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。示例:输入:[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]]输出: [1,2,4,7,5,3,6,8,9]解释:说明:给定矩阵中的元素总数不会超过 100000 。分析思路:根据题目的提示,甚至是题目的名字,我...原创 2020-04-12 13:33:28 · 1990 阅读 · 0 评论