算法
牛客、leetccode等刷题笔记
Andamons
这个作者很懒,什么都没留下…
展开
-
剑指Offer面试题-45 把数组排成最小的数(自定义排序)
题目描述输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: "102"示例 2:输入: [3,30,34,5,9]输出: "3033459"提示:0 < nums.length <= 100说明:输出结果可能非常大,所以你需要返回一个字符串而不是整数拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0题解自定义一个排序规则,来对数组进行排序,最后拼接。常规做法是将两个比原创 2020-07-22 12:30:13 · 210 阅读 · 0 评论 -
剑指Offer面试题-41 数据流中的中位数(中位数、堆)
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。示例 1:输入原创 2020-07-19 10:50:13 · 182 阅读 · 0 评论 -
剑指Offer-40 最小的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 <= 10000 0 <= arr[i] <= 10000题解一(快排思想)对于原创 2020-07-18 17:17:17 · 176 阅读 · 0 评论 -
剑指Offer面试题-39 数组中出现次数超过一半的数(哈希记录、正负抵消)
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2限制:1 <= 数组长度 <= 50000题解一(哈希记录)class Solution { public int majorityElement(int[] nums) { HashMap<Integer, Integer> ma原创 2020-07-18 11:29:39 · 238 阅读 · 0 评论 -
Java实现排列、组合
排列根据给定字符串,打印其所有排列串。输入:s = "abc"打印:["abc","acb","bac","bca","cab","cba"]public static void permutation(String s){ if (s == null || s.length() == 0) { return; } dfs(0, s, new char[s.length()], new int[s.length()]);}/** * 输出字符串的全排列 * @param la原创 2020-07-17 21:02:14 · 461 阅读 · 0 评论 -
剑指Offer面试题-37 序列化二叉树(二叉树、序列化)
题目描述请实现两个函数,分别用来序列化和反序列化二叉树。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Codec { private int index; //原创 2020-07-17 11:32:30 · 167 阅读 · 0 评论 -
剑指Offer面试题-31 栈的压入、弹出序列(栈、模拟)
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2), push(3), p原创 2020-07-13 19:52:32 · 197 阅读 · 0 评论 -
剑指Offer面试题-25 合并两个排序的链表(链表)
题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4题解创建新链表并返回。class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode first = l1, second = l2;原创 2020-07-09 12:44:30 · 119 阅读 · 0 评论 -
剑指Offer面试题-20 表示数值的字符串(有限自动机)
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。题解这题的状态定义10种(幂符号为e或E):开始的空格幂符号前的正负号小数点前的数字小数点(前面不包含数字)小数点(前面包含数字)小数点后的数字幂符号幂符号后的正负号幂符号后的数字结尾的空格状态的合法转换有(表中内容原创 2020-07-07 21:01:01 · 244 阅读 · 2 评论 -
剑指Offer面试题-17 打印从1到最大的n位数(全排列,递归)
题目描述输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1打印: 1,2,3,4,5,6,7,8,9注意:n为正整数。每打印一个数用换行分隔。题解第一想法是,求出n位数的最大值,然后从1循环到那个值,并打印每个数。public void printNumbers(int n) { int last = (int)Math.pow(10, n); int [] num原创 2020-06-30 12:14:23 · 333 阅读 · 0 评论 -
剑指Offer面试题-16 数值的整数次方(细节)
题目描述实现函数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.0-100.0 <原创 2020-06-29 11:49:02 · 177 阅读 · 0 评论 -
剑指Offer面试题-15 二进制中1的个数(位运算)
题目描述请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例 1:输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。示例 2:输入:00000000000000000000000010000000输出:1解释:输入的二进制串 0000000原创 2020-06-28 10:40:25 · 270 阅读 · 0 评论 -
剑指Offer-11 旋转数组中的最小数字(二分法)
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[1,1,1,0,1]输出:0示例3:输入:[1,0,1,1,1]输出:0示例4:输入:[1,2,3,4,5]输出:1题解根据题目描述得出:给定数组由两个排好序的数组组成,而且满足左数原创 2020-06-26 13:18:57 · 124 阅读 · 0 评论 -
剑指Offer面试题-05 替换空格(字符串)
题目描述请实现一个函数,把字符串 s 中的每个空格替换成"%20"。输入:s = "We are happy."输出:"We%20are%20happy."限制:0 <= s 的长度 <= 10000题解class Solution { public String replaceSpace(String s) { if (s == null || s.length() == 0) { return s; }原创 2020-06-22 17:20:02 · 359 阅读 · 0 评论 -
剑指Offer面试题-03 数组中的重复数字(数组)
题目描述找出数组中重复的数字。在一个长度为 nnn 的数组 nums 里的所有数字都在 000 ~ n−1n-1n−1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 限制:2 <= n <= 100000数组中保证有重复元素题解由于元素大小限定,所以定义数组来当作哈希表。class Solution { public in原创 2020-06-22 16:44:49 · 253 阅读 · 0 评论 -
剑指Offer面试题-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]]题解一核心思路:从右上原创 2020-06-22 11:23:17 · 205 阅读 · 0 评论 -
leetcode-206 反转链表(链表翻转)
题目描述反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL给定代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */cl原创 2020-06-21 12:13:36 · 182 阅读 · 0 评论 -
leetcode-42 接雨水(双指针)
题目描述给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6给定代码class Solution { public int trap(int[] height) { }}题解一按列统计考虑原创 2020-06-20 16:17:09 · 285 阅读 · 0 评论 -
leetcode-11 盛水最多的容器(双指针)
题目描述给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例:输入:[1,8,6,2,5,4,8,3,7]输出:49给定代码原创 2020-06-19 19:51:49 · 210 阅读 · 0 评论 -
PTA 公路村村通(Prim & Kruskal)
题目描述现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。输入格式:输入数据包括城镇数目正整数N(≤1000)N(≤1000)N(≤1000)和候选道路数目M(≤3N)M(≤3N)M(≤3N);随后的MMM行对应MMM条道路,每行给出 3 个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从 111 到 NNN 编号。输出格式:输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出原创 2020-06-08 22:32:21 · 1055 阅读 · 0 评论 -
leetcode-128 最长连续序列(哈希表)
题目描述给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)O(n)O(n)。输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。给定代码class Solution { public int longestConsecutive(int[] nums) { }}题解一将数组排序,然后从左往右遍历,遇到连续的就将计数器加一,遇到不连续的就将计数器清零,遇到相同的原创 2020-06-07 09:44:58 · 218 阅读 · 0 评论 -
leetcode-310 最小高度树(拓扑排序变式,Floyd)
题目描述对于一个具有树特征的无向图,我们可选择任何一个节点作为根。图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树。给出这样的一个图,写出一个函数找到所有的最小高度树并返回他们的根节点。格式:该图包含 n 个节点,标记为 0 到 n - 1。给定数字 n 和一个无向边 edges 列表(每一个边都是一对标签)。你可以假设没有重复的边会出现在 edges 中。由于所有的边都是无向边, [0, 1]和 [1, 0] 是相同的,因此不会同时出现在 edges 里。示例:输入: n原创 2020-06-06 22:58:47 · 266 阅读 · 0 评论 -
PTA 哈利·波特的考试(Floyd计算最短距离并输出路径)
题目描述哈利·波特要考试了,他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如ahah可以将老鼠变成猫。另外,如果想把猫变成鱼,可以通过念一个直接魔咒lalala,也可以将猫变老鼠、老鼠变鱼的魔咒连起来念:hahahehe。现在哈利·波特的手里有一本教材,里面列出了所有的变形魔咒和能变的动物。老师允许他自己带一只动物去考场,要考察他把这只动物变成任意一只指定动物的本事。原创 2020-06-06 21:04:19 · 482 阅读 · 0 评论 -
leetcode-54 螺旋矩阵(Medium)
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 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] 限制:0 <= matrix.length <= 1000 <= matrix[i].length原创 2020-06-05 21:50:18 · 192 阅读 · 0 评论 -
迪杰斯特拉算法及变式(最短距离,打印路径,最短经过节点数)
问题描述给定一个图,图的节点名称用(000 ~ N−1N - 1N−1)表示。NNN为图的节点个数,MMM为边的个数,SSS为起始点。输入条件:第一行输入 NMSN M SNMS。其后MMM行,每行输入三个数,分别代表源节点、目标节点、边的距离。输出条件:请输出SSS到所有点的最短距离,并打印出每一步经过的节点名称(中间以空格隔开)。测试样例:输入:4 5 00 1 11 3 20 3 40 2 22 3 1输出:从 0 到 0 的最短距离是:0所经过的路径是:0 -原创 2020-06-05 12:42:31 · 1207 阅读 · 0 评论 -
PTA 旅游规划(有权单源最短路径)
题目描述有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。输入格式:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中原创 2020-06-04 23:15:30 · 890 阅读 · 0 评论 -
leetcode-133 克隆图(BFS)
题目描述给你无向连通图中一个节点的引用,请你返回该图的 深拷贝(克隆)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。class Node { public int val; public List<Node> neighbors;}测试用例格式:简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。邻接列表 是用原创 2020-05-31 14:11:05 · 259 阅读 · 0 评论 -
leecode-84 柱状图中的最大矩形(单调栈)
题目描述给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。示例:输入: [2,1,5,6,2,3]输出: 10给定代码class Solution { public int largestRectangleArea(int[] heights原创 2020-05-30 22:01:45 · 195 阅读 · 0 评论 -
leetcode-287 寻找重复数(Medium)
题目描述给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]输出: 2示例 2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组(假设数组是只读的)。只能使用额外的 O(1)O(1)O(1) 的空间。时间复杂度小于 O(n2)O(n^2)O(n2) 。数组中只有一个重复的数字,但它可能不止重复出现一次。给定原创 2020-05-27 11:39:48 · 228 阅读 · 0 评论 -
leetcode-146 LRU缓存机制(Medium)
题目描述运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字/值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值(最久未获取/未更新),从而为新的数据值留出空间原创 2020-05-26 22:55:50 · 198 阅读 · 0 评论 -
leetcode-4 寻找两个正序数组的中位数(Hard)
题目描述给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。 示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.5给定代码class Solution {原创 2020-05-24 18:29:43 · 281 阅读 · 0 评论 -
leetcode-76 最小覆盖字串(Hard)
题目描述给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。示例:输入: S = "ADOBECODEBANC", T = "ABC"输出: "BANC"输入: S = "AA", T = "AA"输出: "AA"说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,我们保证它是唯一的答案。给定代码class Solution { public String minWindow(St原创 2020-05-24 00:09:39 · 240 阅读 · 0 评论 -
leetcode-105 从前序与中序遍历序列构造二叉树(Medium)
题目描述根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7给定代码/** * Definition for a binary tree node. * public class TreeNode { * int val;原创 2020-05-23 08:58:43 · 189 阅读 · 0 评论 -
leecode-1371 每个元音包含偶数次的最长子字符串(Medium)
题目描述给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 'a','e','i','o','u' ,在子字符串中都恰好出现了偶数次。示例 1:输入:s = "eleetminicoworoep"输出:13解释:最长子字符串是 "leetminicowor" ,它包含 e,i,o 各 2 个,以及 0 个 a,u 。示例 2:输入:s = "leetcodeisgreat"输出:5解释:最长子字符串是 "leetc" ,其中包含 2 个 e 。示原创 2020-05-20 23:38:17 · 232 阅读 · 0 评论 -
leecode-210 课程表Ⅱ(Medium)
题目描述现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。示例 1:输入: 2, [[1,0]] 输出: [0,1]解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序原创 2020-05-20 14:34:48 · 288 阅读 · 0 评论 -
leetcode-1 两数之和(Easy)
题目描述给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]给定代码class Solution { public int[] twoSum(int[] nums, int ta原创 2020-05-16 23:47:41 · 132 阅读 · 0 评论 -
剑指Offer面试题-66 构建乘积数组(Easy)
题目描述给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i] = A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1], B[n-1] = A[0] * A[1] * ... * A[n-2];)给定代码public class Solution { public int[] multiply(int[] A)原创 2020-05-14 12:28:47 · 179 阅读 · 0 评论 -
剑指Offer面试题-59 滑动窗口的最大值(Easy)
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3原创 2020-05-14 00:48:50 · 271 阅读 · 0 评论 -
剑指Offer面试题-09 用两个栈实现队列(Easy)
题目描述:题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。给定代码:import java.util.Stack;public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); public void pu原创 2020-05-13 19:19:46 · 141 阅读 · 1 评论