数据结构与算法
记录我的刷题之路
慢慢来不要急
多总结多思考
Ga_Lip
计算机硕士在读。
展开
-
剑指Offer-打印从1到最大的n位数
49.打印从1到最大的n位数输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]思路要打印的范围其实1到是10的n次幂-1。求幂,可以使用快速幂加快速度。将时间复杂度降低到O(logN)class Solution { pu...原创 2020-04-02 11:58:58 · 182 阅读 · 0 评论 -
剑指Offer-顺时针打印矩阵
48.顺时针打印矩阵输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]...原创 2020-03-30 13:32:38 · 174 阅读 · 0 评论 -
剑指Offer-n-1中缺失的数字
47.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思路二分。二分的条件是数组下标与其对应的元素是否相等。如果发现不相等,则...原创 2020-03-30 11:09:47 · 296 阅读 · 0 评论 -
剑指Offer-在排序数组中查找数字 I
46.在排序数组中查找数字 I统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0思路一双指针。首尾各放一个指针,由于数组是排好序的,所以找到与target相等的那个范围即可。注意返回值,如果i和j相遇也...原创 2020-03-30 10:50:46 · 182 阅读 · 0 评论 -
剑指Offer-二叉搜索树第K大的节点
45.二叉搜索树第K大的节点给定一棵二叉搜索树,请找出其中第k大的节点。示例 1:输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2输出: 4示例 2:输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ ...原创 2020-03-24 14:06:52 · 110 阅读 · 0 评论 -
剑指Offer-二叉搜索树的最近公共祖先
43.二叉搜索树的最近公共祖先给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q ...原创 2020-03-24 13:10:41 · 139 阅读 · 0 评论 -
剑指Offer-数组中出现次数超过一半的数字
剑指Offer-数组中出现次数超过一半的数字数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2思路一HashMap解决。遇到统计次数的题目,往map想。统计数组中元素频率超过数组一半的元素即可。class Solution { ...原创 2020-03-22 13:04:34 · 102 阅读 · 0 评论 -
剑指Offer-把数组排成最小的数
剑指Offer-把数组排成最小的数输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: "102"示例 2:输入: [3,30,34,5,9]输出: "3033459"思路将其转换为一个排序问题,考查API的使用。如果数组中的两个数s1和s2转化成字符串后,满足(s1+s2)<(s2+s1),...原创 2020-03-22 11:15:06 · 196 阅读 · 0 评论 -
剑指Offer-剪绳子(一)
剑指Offer-剪绳子(一)给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] 。请问 k[0]*k[1]*...*k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例 1:输入: 2输出: 1解释: 2...原创 2020-03-20 11:35:43 · 112 阅读 · 0 评论 -
剑指Offer-机器人的运动范围
剑指Offer-机器人的运动范围地上有一个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...原创 2020-03-19 16:43:46 · 120 阅读 · 0 评论 -
剑指Offer——矩阵中的路径
剑指Offer——矩阵中的路径请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”...原创 2020-03-19 13:12:40 · 138 阅读 · 0 评论 -
LeetCode-面试题57.和为s的连续正数序列
LeetCode-面试题57.和为s的连续正数序列输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]]...原创 2020-03-15 11:41:38 · 138 阅读 · 0 评论 -
LeetCode-200. 岛屿数量
LeetCode-200. 岛屿数量给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。示例 1:输入:11110110101100000000输出: 1示例 2:输入:11000110000010000011输出: 3思路遍历二维数组,...原创 2020-03-15 10:52:59 · 223 阅读 · 0 评论 -
剑指Offer-替换空格
请实现一个函数,把字符串中的每个空格替换成`"%20"`。你可以假定输入字符串的长度最大是1000。注意输出字符串的长度可能大于1000。样例输入:"We are happy."输出:"We%20are%20happy."思路最朴素的想法就是,新开一个字符串,遍历原始字符串,遇到空格就在新字符串中追加“%20”。但是这种做法需要额外的空间,事实上可以利用双指针的思想在原始字符串...原创 2020-03-02 13:23:55 · 92 阅读 · 0 评论 -
LeetCode-347. 前 K 个高频元素
LeetCode-347. 前 K 个高频元素给定一个非空的整数数组,返回其中出现频率前 k 高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]思路TopK的问题优先想到用堆。堆的特点是,每一棵子树的root都是这棵子树中最大或最小的值。如果我们建立一个K大小...原创 2020-02-02 13:14:14 · 155 阅读 · 0 评论 -
堆排序
堆排序对于一个数组,我们可以用完全二叉树来表示.其第一个元素是它的根节点.下标i的元素,其左孩子节点是2i+1,右孩子节点是2i+2,根节点是(i-1)/2大根堆:任何一棵子树的root都是这棵子树的最大值小根堆:任何一棵子树的root都是这棵子树的最小值建堆(自下而上)给定一个数组,如果想利用堆结构去进行逻辑运算,首先要建立一个堆(大根堆or小根堆)。建堆的时候应该自行脑补一...原创 2020-02-01 12:45:13 · 128 阅读 · 0 评论 -
LeetCode-94. 二叉树的中序遍历
LeetCode-94. 二叉树的中序遍历给定一个二叉树,返回它的中序 遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3输出: [1,3,2]思路分为递归版本和非递归版本。递归/** * Definition for a binary tree node. * public class TreeNode { * ...原创 2020-01-31 12:50:05 · 200 阅读 · 0 评论 -
LeetCode-20. 有效的括号
LeetCode-20. 有效的括号给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true示例 2:输入: "()[]{}"输出: true示例 3:输入: "(]"输出...原创 2020-01-31 11:13:28 · 155 阅读 · 0 评论 -
LeetCode-108. 将有序数组转换为二叉搜索树
LeetCode-108. 将有序数组转换为二叉搜索树将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 /...原创 2020-01-30 16:37:55 · 117 阅读 · 0 评论 -
LeetCode-53. 最大子序和
LeetCode-53. 最大子序和给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。思路使用动态规划求解。首先将要求解的大集合分解成一个个小集合。如果我们知道每个以nums数组中当前元素结尾的子...原创 2020-01-29 14:10:53 · 126 阅读 · 0 评论 -
LeetCode-64. 最小路径和
LeetCode-64. 最小路径和给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[ [1,3,1], [1,5,1], [4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。思路经典动态规划问题。在行进的过程中,我们应时刻记录每到一个...原创 2020-01-29 12:02:45 · 187 阅读 · 0 评论 -
LeetCode-213. 打家劫舍 II
LeetCode-213. 打家劫舍 II你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入...原创 2020-01-29 11:05:58 · 115 阅读 · 0 评论 -
LeetCode-198. 打家劫舍
LeetCode-198. 打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房...原创 2020-01-29 10:23:37 · 144 阅读 · 0 评论 -
LeetCode-241. 为运算表达式设计优先级
LeetCode-241. 为运算表达式设计优先级给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。示例 1:输入: "2-1-1"输出: [0, 2]解释: ((2-1)-1) = 0 (2-(1-1)) = 2示例 2:输入: "2*3-4*5"输出: [-34...原创 2020-01-09 22:26:41 · 257 阅读 · 0 评论 -
LeetCode-540. 有序数组中的单一元素
LeetCode-540. 有序数组中的单一元素给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。示例 1:输入: [1,1,2,3,3,4,4,8,8]输出: 2示例 2:输入: [3,3,7,7,10,11,11]输出: 10注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。思路这道题非常有意思。限制...原创 2020-01-08 00:17:56 · 297 阅读 · 0 评论 -
LeetCode-744. 寻找比目标字母大的最小字母
LeetCode-744. 寻找比目标字母大的最小字母给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母。数组里字母的顺序是循环的。举个例子,如果目标字母target = ‘z’ 并且有序数组为 letters = [‘a’, ‘b’],则答案返回 ‘a’。示例:输入:letters = ["c", "f", "j"]...原创 2020-01-07 21:07:26 · 142 阅读 · 1 评论 -
LeetCode-69. x 的平方根
LeetCode-69. x 的平方根实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。思路首先明确,所要寻找的x的开方...原创 2020-01-07 20:18:27 · 121 阅读 · 0 评论 -
LeetCode-452. 用最少数量的箭引爆气球
LeetCode-452. 用最少数量的箭引爆气球在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了。开始坐标总是小于结束坐标。平面内最多存在104个气球。一支弓箭可以沿着x轴从不同点完全垂直地射出。在坐标x处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xe...原创 2020-01-06 21:17:51 · 171 阅读 · 0 评论 -
LeetCode-455. 分发饼干
LeetCode-455. 分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。...原创 2020-01-06 19:48:34 · 226 阅读 · 0 评论 -
LeetCode-88. 合并两个有序数组
LeetCode-88. 合并两个有序数组给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:输入:nums1 = [1,2,3,0,0...原创 2019-12-26 11:24:31 · 84 阅读 · 0 评论 -
LeetCode-680. 验证回文字符串
LeetCode-680. 验证回文字符串给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。示例 1:输入: "aba"输出: True示例 2:输入: "abca"输出: True解释: 你可以删除c字符。思路首先,验证回文字符串使用的是双指针的思路。头尾指针指向的字符是否相同,如果到相遇之前都相同,那么说明是回文的。如何验证删除之后是回文字符串呢?还...原创 2019-12-26 10:31:36 · 137 阅读 · 0 评论 -
LeetCode-345.翻转字符串中的元音字母
LeetCode-345.翻转字符串中的元音字母编写一个函数,以字符串作为输入,反转该字符串中的元音字母。示例 1:输入: "hello"输出: "holle"示例 2:输入: "leetcode"输出: "leotcede"思路此题考查双指针思想以及对字符串API的熟练使用。我们可以利用双指针分别从字符串的头和尾部遍历整个字符串,遇到非元音字母就填充到结果集中,遇到元音字...原创 2019-12-25 11:12:02 · 272 阅读 · 0 评论 -
LeetCode-633.判断一个数是否是两个数的平方和
LeetCode-633.判断一个数是否是两个数的平方和描述给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a^2 + b^2 = c。示例1:输入: 5输出: True解释: 1 * 1 + 2 * 2 = 5示例2:输入: 3输出: False思路与TwoSum那道题一个思路。还是使用双指针,此题可以看成“在0-c的有序数组中,是否可以找到两个数,使他...原创 2019-12-25 10:26:44 · 1274 阅读 · 0 评论 -
LeetCode-167.两数之和
LeetCode-167.两数之和描述给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入: numbers = ...原创 2019-12-25 10:09:58 · 108 阅读 · 0 评论 -
剑指Offer-二叉搜索树的第K个节点
36.二叉搜索树的第K个节点给定一棵二叉搜索树,请找出其中的第k小的结点。你可以假设树和k都存在,并且1≤k≤树的总结点数。样例输入:root = [2, 1, 3, null, null, null, null] ,k = 3 2 / \ 1 3输出:3思路中序遍历二叉树序列的第k个节点就是第k小的节点。class Solution { //计...原创 2019-12-24 10:17:02 · 78 阅读 · 0 评论 -
剑指Offer-两个链表的第一个公共节点(延伸——判断链表有无环以及两链表相交问题)
35.两个链表的第一个公共节点(延伸——判断链表有无环以及两链表相交问题)1.如何判断一个单链表是否有环?若有环返回第一个入环节点,无环返回空。思路一:从头遍历链表,用HashSet存储此链表的各个节点。如果此节点出现过,则返回它,若直到遍历到null都没有重复节点,就返回null,即不存在这样的结构。public static Node findFirstIntersectNode(...原创 2019-12-24 09:58:22 · 193 阅读 · 0 评论 -
剑指Offer-连续子数组的最大和
34.连续子数组的最大和输入一个 非空 整型数组,数组里的数可能为正,也可能为负。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。样例输入:[1, -2, 3, 10, -4, 7, 2, -5]输出:18思路首先要读懂题意。说的是连续子数组的最大和。还要求时间复杂度是O(n)也就是一次遍历能求出max来。我们先假定数组第一个元...原创 2019-12-24 08:33:09 · 87 阅读 · 0 评论 -
剑指Offer-连续子数组的最大和
34.连续子数组的最大和输入一个 非空 整型数组,数组里的数可能为正,也可能为负。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。样例输入:[1, -2, 3, 10, -4, 7, 2, -5]输出:18思路首先要读懂题意。说的是连续子数组的最大和。还要求时间复杂度是O(n)也就是一次遍历能求出max来。我们先假定数组第一个元...原创 2019-12-24 08:29:49 · 98 阅读 · 0 评论 -
剑指Offer-数组中出现次数超过一半的数字
33.数组中出现次数超过一半的数字数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。假设数组非空,并且一定存在满足条件的数字。思考题:假设要求只能使用 O(n)O(n) 的时间和额外 O(1)O(1) 的空间,该怎么做呢?样例输入:[1,2,1,1,3]输出:1思路最优解可以实现时间复杂度是O(n),空间复杂度O(1)。如果一个数组中元素的个数严格大于此数组长...原创 2019-12-23 20:04:59 · 104 阅读 · 0 评论 -
剑指Offer-序列化和反序列化二叉树
32.序列化和反序列化二叉树请实现两个函数,分别用来序列化和反序列化二叉树。您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。样例你可以序列化如下的二叉树 8 / \ 12 2 / \ 6 4为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"注意:以...原创 2019-12-23 13:40:15 · 106 阅读 · 0 评论