算法练习总结
LeetCode日常练题和一些有趣的算法题解
吉诺比利20
每天进步一点点
展开
-
[LeetCode]231.给定一个整数,编写一个函数来判断它是否是 2 的幂次方。(扩展:给定一个数,判断它是否是完全平方数)
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。示例 1:输入: 1输出: true解释: 20 = 1示例 2:输入: 16输出: true解释: 24 = 16示例 3:输入: 218输出: false思路1.将数字循环除以2,到最后判断是余1还是0,余1则不是2的幂次方。public boolean isPowerOfTwo(int n) { if (n == 0) return false; while (n % 2 == 0) {原创 2020-06-14 23:29:40 · 625 阅读 · 0 评论 -
[LeetCode]451. 根据字符出现频率排序
根据字符出现频率排序给定一个字符串,请将字符串里的字符按照出现的频率降序排列。示例 1:输入:"tree"输出:"eert"解释:'e'出现两次,'r'和't'都只出现一次。因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。示例 2:输入:"cccaaa"输出:"cccaaa"解释:'c'和'a'都出现三次。此外,"aaaccc...原创 2020-04-30 23:54:08 · 434 阅读 · 0 评论 -
[LeetCode]445. 两数相加 II(使用链表翻转或两个辅助栈)
两数相加 II给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例:输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 8 -> 0 -> 7思路1.要求从链...原创 2020-04-14 23:26:40 · 129 阅读 · 0 评论 -
[LeetCode]40.最小的k个数(TopK问题。通过维护堆、优先队列、快排思想等解决方法)
最小的k个数输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 1:输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]示例 2:输入:arr = [0,1,2,1], k = 1输出:[0]限制:0 <= k <= arr.length <...原创 2020-04-10 23:20:21 · 584 阅读 · 0 评论 -
[LeetCode]01.07 旋转矩阵
旋转矩阵给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。不占用额外内存空间能否做到?示例 1:给定 matrix = [ [1,2,3], [4,5,6], [7,8,9]],原地旋转输入矩阵,使其变为:[ [7,4,1], [8,5,2], [9,6,3]]示例 2:给定 matri...原创 2020-04-07 23:03:19 · 112 阅读 · 0 评论 -
[LeetCode]946. 验证栈序列
验证栈序列给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2),...原创 2020-04-06 22:26:25 · 1694 阅读 · 0 评论 -
[LeetCode]42. 接雨水(使用单调栈处理)
接雨水给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6思路1.使用单调栈,加入元素好...原创 2020-04-04 23:15:16 · 716 阅读 · 0 评论 -
找到一个平面内最近的两个点的坐标和之间距离(分治法)
平面上有n个点P1,P2,…,Pn,n>1,Pi的直角坐标为(Xi,Yi),i=1,2,…,n.求距离最近的两个点及他们之间的距离。分治法:将一个大问题缩减到一定的规模变成若干个相同的小问题一一解决。它与动态规划法类似,都是将问题分而治之,变成若干个能够解决小问题,但是动态规划一般分解问题后问题间会互相连续和依赖,而分治法分解后变成一个个独立的问题。思路1.在一个平面内的点,先将他们...原创 2020-04-04 18:32:36 · 3013 阅读 · 0 评论 -
[LeetCode]104. 二叉树的最大深度
二叉树的最大深度给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最大深度 3 。思路1.使用递归分别计算左右两边的层数的最大值。 ...原创 2020-04-03 20:34:29 · 85 阅读 · 0 评论 -
[LeetCode]912. 排序数组
排序数组给你一个整数数组 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]提示:1 <= nums.length <= 50000-50000 <= nums[i] <= 50000思路1.8大排序都...原创 2020-03-31 23:57:54 · 248 阅读 · 0 评论 -
[LeetCode]62. 圆圈中最后剩下的数字
圆圈中最后剩下的数字0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入: n = 5, m = 3输出: 3示例 2:输入: n = 10, m = 17输...原创 2020-03-30 22:26:07 · 174 阅读 · 0 评论 -
[LeetCode]1162. 地图分析(图的广度优先遍历)
地图分析你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗?请返回该海洋区域到离它最近的陆地区域的距离。我们这里说的距离是『曼哈顿距离』( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个区域之间的距离是 |...原创 2020-03-29 23:24:57 · 290 阅读 · 0 评论 -
[LeetCode]820. 单词的压缩编码(扩展:实现 Trie (前缀树))
单词的压缩编码给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。例如,如果这个列表是 [“time”, “me”, “bell”],我们就可以将其表示为 S = “time#bell#” 和 indexes = [0, 2, 5]。对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 “#” 结束,来恢复我们之前的单词列表。那么成功对给定单...原创 2020-03-28 23:44:56 · 276 阅读 · 0 评论 -
[LeetCode]21. 合并两个有序链表
合并两个有序链表将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路1.先创建一个节点作为链表头,再创建一个节点用来操作后面的链表。依次判断l1和l2的节点大小,当其中一个为空时,将另一个链表连接到尾部把...原创 2020-03-27 23:09:53 · 113 阅读 · 0 评论 -
[LeetCode]914. 卡牌分组(辗转相除法求公约数)
卡牌分组给定一副牌,每张牌上都写着一个整数。此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:每组都有 X 张牌。组内所有的牌上都写着相同的整数。仅当你可选的 X >= 2 时返回 true。示例 1:输入:[1,2,3,4,4,3,2,1]输出:true解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]示例 2:输入:[...原创 2020-03-27 22:36:24 · 173 阅读 · 0 评论 -
[LeetCode]905. 按奇偶排序数组(双指针法的应用)
按奇偶排序数组给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。你可以返回满足此条件的任何数组作为答案。示例:输入:[3,1,2,4]输出:[2,4,3,1]输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。提示:1 <= A.length <= 50000 <= A[i] <=...原创 2020-03-26 23:36:53 · 143 阅读 · 1 评论 -
[LeetCode]232. 用栈实现队列(扩展:用队列实现栈)
使用栈实现队列的下列操作:push(x) – 将一个元素放入队列的尾部。pop() – 从队列首部移除元素。peek() – 返回队列首部的元素。empty() – 返回队列是否为空。示例:MyQueue queue = new MyQueue();queue.push(1);queue.push(2); queue.peek(); // 返回 1queue.pop(...原创 2020-03-25 21:54:51 · 132 阅读 · 0 评论 -
[LeetCode]17.按摩师(扩展:打家劫舍II、斐波那契数、最长回文子串、爬楼梯等动态规划题)
17. 按摩师一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。注意:本题相对原题稍作改动示例 1:输入: [1,2,3,1]输出: 4解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。示例 2:输...原创 2020-03-24 23:48:10 · 233 阅读 · 0 评论 -
[LeetCode]15. 三数之和(扩展:两数之和、四数之和)
15. 三数之和给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[ [-1, 0, 1], [-1, -1, 2]]思...原创 2020-03-24 00:49:36 · 190 阅读 · 0 评论 -
[LeetCode]876. 链表的中间结点(扩展:判断链表是否有环并返回入环节点)
876. 链表的中间结点给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = ...原创 2020-03-23 22:51:39 · 132 阅读 · 0 评论 -
[Leetcode]144. 二叉树的前序遍历(扩展:二叉树的中序、后序、层序遍历)
144. 二叉树的前序遍历给定一个二叉树,返回它的 前序 遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3]思路1.前序遍历的规律为根节点-左节点-右节点,使用的是深度优先遍历,即先获取到某个确定的子节点,再返回根节点到达另一个子节点,知道遍历完成。使用递归法根据根节点–>左子树–>右子树...原创 2020-03-23 00:36:51 · 511 阅读 · 0 评论 -
[LeetCode]945. 使数组唯一的最小增量
945. 使数组唯一的最小增量给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。返回使 A 中的每个值都是唯一的最少操作次数。示例 1:输入:[1,2,2]输出:1解释:经过一次 move 操作,数组将变为 [1, 2, 3]。示例 2:输入:[3,2,1,2,1,7]输出:6解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2,...原创 2020-03-22 23:18:07 · 109 阅读 · 0 评论 -
[LeetCode]409. 最长回文串
409. 最长回文串给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。注意:假设字符串的长度不会超过 1010。示例 1:输入: "abccccdd"输出: 7解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。思路1.使用hashmap,统计重复的字符...原创 2020-03-21 00:30:44 · 165 阅读 · 0 评论 -
[LeetCode]1365. 有多少小于当前数字的数字
1365. 有多少小于当前数字的数字给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。以数组形式返回答案。示例 1:输入:nums = [8,1,2,2,3] 输出:[4,0,1,1,3] 解释...原创 2020-03-21 00:00:22 · 265 阅读 · 0 评论