![](https://img-blog.csdnimg.cn/2d9a08295d8f4731a2cf3e1b98a28e80.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构 | 算法
文章平均质量分 77
算法与数据结构专题
HoryC
这个作者很懒,什么都没留下…
展开
-
递归的本质
递归并没有那么神秘,这篇文章就带你解开递归的神秘面纱原创 2022-08-08 09:58:11 · 754 阅读 · 1 评论 -
LeetCode系列之「反转链表」
剑指 Offer 24. 反转链表ListNode// Definition for singly-linked list.public class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}一、迭代解法:class Solution { public ListNode reverseList(ListNode head) { if(h原创 2021-01-24 16:50:02 · 235 阅读 · 0 评论 -
JavaOJ训练——输入一串以逗号隔开数字然后存入数组中并输出
代码:public class OJ { public static void main(String[] args){ Scanner sc = new Scanner(System.in); System.out.println("请输入一串用英文逗号隔开的整数:"); String input = sc.next(); String[] strArr = input.split(","); int[] nu原创 2021-01-23 21:22:56 · 2642 阅读 · 1 评论 -
LeetCode系列之「用队列实现栈」
225. 用队列实现栈总的来说有两种方法:用两个队列实现用一个队列实现方法一:用两个队列实现最好的方法就是让两个队列q1(入栈队列)和q2(出栈队列)分别充当入栈和出栈的角色,即:push 操作内部将元素添加到q1pop 从q2中poll元素q1和q2只是一个指针,在 push 内部利用一个临时变量来时刻交换q1和q2的指向,使得q1和q2分别指向的队列始终分别指向 入栈队列和 出栈队列。这样做的好处是,可以简化pop()与top()的实现,因为s2是出栈队列,所以只需要分别执原创 2020-12-04 15:38:43 · 228 阅读 · 1 评论 -
LetCode系列之「用栈实现队列」
232. 用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty)直接上最优解两个栈分别充当不同的角色:一个只负责存(push)一个只负责取(pop)假设负责存和取的栈分别为s1和s2:当存的时候只需要直接push到s1即可,不需要考虑其他的情况当取的时候,肯定直接从s2中取,如果s2不为空有则直接s2.pop(),如果s2为空呢,就只能将s1中的所有元素添加到s2中,然后再执行s2.pop()peek()的原创 2020-12-03 14:49:17 · 112 阅读 · 0 评论 -
从造轮子开始彻底理解LRU缓存机制
Leetcode146. LRU缓存机制造轮子在面试中,面试官一般会期望读者能够自己实现一个简单的双向链表,而不是使用语言自带的、封装好的数据结构。所以,造轮子还是很有必要的。LRU 缓存淘汰算法就是一种常用策略。LRU 的全称是 Least Recently Used,翻译过来就是最近最久未使用。力扣第 146 题「LRU缓存机制」就是让我们来设计这样一个数据结构:首先要接收一个 capacity 参数作为缓存的最大容量,然后实现两个 API,一个是 put(key, val) 方法存入键值对,原创 2020-11-16 14:31:01 · 378 阅读 · 0 评论 -
动态规划系列之「编辑距离」
72. 编辑距离给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')示例 2:输入:word1原创 2020-10-24 23:13:43 · 305 阅读 · 0 评论 -
LeetCode系列之「回文子串」
647. 回文子串给定一个字符串,返回这个字符串中有多少个回文子串。两个相同的回文子串出现在不同的位置,认为是2个回文串。a、aa、aaa、aba、aabaa、abcba均认为是回文子串。示例1:输入"aaa"输出6说明a、a、a、aa、aa、aaa示例2:输入"abcb"输出5说明a、b、c、b、bcb函数签名:import java.util.*;public class Solution{ public int palindromeCou原创 2020-10-23 21:46:16 · 350 阅读 · 0 评论 -
动态规划系列之「最大子序和」
53. 最大子序和给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。这道题不能用滑动窗口来做,因为数组中含有复数,这样就无法决定窗口的大小。和为S的连续正数序列 中便用到了滑动窗口思路可看官方题解,讲的很清楚,这里不再赘述…也可参考 labuladong方法一:动态规划class Solution { public int maxSubArray(int[] nums) { int tmp = 0; // tmp原创 2020-10-20 20:56:58 · 275 阅读 · 0 评论 -
OJ在线编程常见输入输出练习场-Java版本
OJ在线编程常见输入输出练习场Java 处理输入输出import java.util.Scanner;/** * @Author Hory * @Date 2020/10/19 */public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("input name:");原创 2020-10-19 20:59:44 · 781 阅读 · 0 评论 -
动态规划系列之「最长公共子序列」
1143. 最长公共子序列给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。最长公共子序列(Longest Common Su原创 2020-10-19 00:21:32 · 248 阅读 · 0 评论 -
动态规划系列之「零钱兑换II」
给定不同面额的硬币coins和一个总金额amount。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。这道题是在0-1背包问题的变形,是完全背包问题,那么什么是完全背包问题呢?再来回顾一下0-1背包的题目:给你一个可装载重量为W的背包和N个物品(每个物品不一样),每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为val[i],现在让你用这个背包装物品,最多能装的价值是多少?0-1背包问题中物品的数量是有限的,准确来说每个物品都是独一无二的,而这里的每一种.原创 2020-10-17 13:53:36 · 526 阅读 · 0 评论 -
动态规划系列之「0-1背包问题」
给你一个可装载重量为W的背包和N个物品(每个物品不一样),每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为val[i],现在让你用这个背包装物品,最多能装的价值是多少?示例:输入:W = 4, N = 3wt = [2, 1, 3]val = [4, 2, 3]输出:6解释:选择前两件物品装进背包,总重量 3 小于W,可以获得最大价值 6。这个题目中的物品不可以分割,要么装进包里,要么不装,不能说切成两块装一半。这也许就是 0-1 背包这个名词的来历。动态规划.原创 2020-10-16 14:23:35 · 282 阅读 · 0 评论 -
动态规划系列之「最长回文子序列」
516. 最长回文子序列给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。注意:子序列是不要求连续的示例 1:输入"bbbab"输出 4一个可能的最长回文子序列为 "bbbb"。示例 2:输入"cbbd"输出 2一个可能的最长回文子序列为 "bb"。这里对 dp 数组的定义是:在子串 s[i..j] 中,最长回文子序列的长度为 dp[i][j]。具体来说,如果我们想求 dp[i][j],假设知道子问题 dp[i+1][原创 2020-10-15 13:38:33 · 2362 阅读 · 2 评论 -
动态规划系列之「最长连续递增序列」
674. 最长连续递增序列给定一个未经排序的整数数组,找到最长且连续的递增序列,并返回该序列的长度。示例 1:输入: [1,3,5,4,7]输出: 3解释: 最长连续递增序列是 [1,3,5], 长度为3。尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在原数组里被4隔开。 示例 2:输入: [2,2,2,2,2]输出: 1解释: 最长连续递增序列是 [2], 长度为1。**注意:**数组长度不会超过10000。思路:连续递增,那么只考虑nums[i]原创 2020-10-14 15:49:01 · 222 阅读 · 0 评论 -
动态规划系列之「最长递增子序列的个数」
673. 最长递增子序列的个数给定一个未排序的整数数组,找到最长递增子序列的个数。示例 1:输入: [1,3,5,4,7]输出: 2解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。示例 2:输入: [2,2,2,2,2]输出: 5解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。「最长递增子序列」那道题谁让求最长子序列的长度,这道题是求个原创 2020-10-13 16:27:34 · 576 阅读 · 1 评论 -
动态规划系列之「最长递增子序列」
给定一个无序的整数数组,找到其中最长上升子序列的长度。注意: 这里没要求子序列连续。示例:输入:[10, 9, 2, 5, 3, 7, 101, 18]输出:4解释:最长的上升子序列是[2, 3, 7, 101],长度为4说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。算法的时间复杂度应该为O(n^2)进阶:你能将算法的时间复杂度降到O(nlgn)吗?方法一: 动态规划思路:首先要定义 dp 数组的含义:dp[i] 表示以 nums[i] 这个数结.原创 2020-10-12 16:23:27 · 681 阅读 · 0 评论 -
动态规划系列之「leetcode322.零钱兑换」
322. 零钱兑换给定不同面额的硬币coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。零钱兑换问题符合最优子结构,比如你想求 amount = 11 时的最少硬币数(原问题),如果你知道凑出 amount = 10 的最少硬币数(子问题),你只需要把子问题的答案加一(再选一枚面值为 1 的硬币)就是原问题的答案。因为硬币的数量是没有限制的,所以子问题之间没有相互制,是互相独立的。如何列出正确的状态转移方程原创 2020-10-11 17:33:17 · 137 阅读 · 0 评论 -
剑指Offer系列之「翻转单词顺序列」
给定一个首尾可能带空格的字符串,请让你翻转该字符串。首尾不能有多余空格。如果全部是空格,请返回原字符串。例如将 “student. a am I” 翻转为 “I am a student.”首先需要进行预处理,判断输入字符串是不是全部空格,如果是,直接输出字符串。把每个单词拆分出来,然后以单词为翻转单元,即可得到结果串。一个单词为:从不是空格的字符开始到是空格的前一个字符结束,即为一个单词。public class Solution { public String ReverseSen.原创 2020-10-09 20:45:57 · 124 阅读 · 0 评论 -
剑指Offer系列之「表示数值的字符串」
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16","+10.5E-3"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。使用正则表达式就很容易:import java.util.regex.Pattern;public class Solution{ public static boolean isNumeric(char[] str){ .原创 2020-10-08 21:54:02 · 272 阅读 · 0 评论 -
剑指Offer系列之「字符流中第一个不重复的字符」
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。如果当前字符流没有存在出现一次的字符,返回#字符。只使用一个数组,数组中不仅可以判断是否出现了多次,并且在出现一次时,数组中存放字符在字符流中出现第一次的位置,而数组索引和字符的ASCII码对应起来,由于ASCII码有128个字符,因此数组大小为128即可。 将数组初值赋值-1,某个字符.原创 2020-10-07 23:14:30 · 65 阅读 · 0 评论 -
剑指Offer系列之「扑克牌顺子」
LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你.原创 2020-10-06 21:11:07 · 77 阅读 · 0 评论 -
剑指Offer系列之「左旋转字符串」
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!方法一:使用Stringpublic class Solution { public String LeftRotateString(String str, int n) { int len.原创 2020-10-06 20:02:34 · 101 阅读 · 0 评论 -
剑指Offer系列之「滑动窗口的最大值」
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,4,2,6,[2.原创 2020-10-05 19:41:40 · 81 阅读 · 0 评论 -
剑指Offer系列之「数据流中的中位数」
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。方法一:暴力法暴力法无非就是每次插入一个元素,不做操作,但是取的时候,每次都要排序,然后取中位数。这里不再赘述。时间复杂度:Insert()为O(1), GetMedian()为O(nlogn)空间复杂度:O(n).原创 2020-10-04 21:37:13 · 79 阅读 · 0 评论 -
Java堆实现之「PriorityQueue<>()」
堆简介Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。前面以Java ArrayDeque为例讲解了Stack和Queue,其实还有一种特殊的队列叫做PriorityQueue,即优先队列。优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Comparator,类.原创 2020-10-04 14:30:08 · 274 阅读 · 0 评论 -
谈谈「堆排序」
关于堆在学习堆排序直线先来看看堆这个数据结构堆的一个经典的实现是完全二叉树(complete binary tree),这样实现的堆称为二叉堆(binary heap)。满二叉树:除了叶子节点,所有的节点的左右孩子都不为空,就是一棵满二叉树,如下图:可以看出:满二叉树所有的节点都拥有左孩子,又拥有右孩子。完全二叉树:不一定是一个满二叉树,但它不满的那部分一定在右下侧,如下图:关于堆详细的描述及实现方式这里不再赘述,网上资源很多,这里重点说一下堆的特性。堆的特性:必须是完全二叉树任.原创 2020-10-03 21:32:56 · 110 阅读 · 0 评论 -
键值Offer系列之「二叉搜索树的第k个节点」
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。递归实现:/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solut.原创 2020-10-02 10:38:56 · 116 阅读 · 0 评论 -
剑指Offer系列之「和为S的连续正数序列」
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序滑动窗口解法:什么是滑动窗口?顾名思义,首先是一个窗口,既然是一个窗口,就需要用窗口的左边界i和右边界j来唯一表示一个窗口,其次,滑动代表,窗口始终从左往右移动,这也表明左边界i和右边界j始终会往后移动,而不会往左移动。这里我用左闭右开区间来表示一个窗口。滑动窗口的操作:扩大窗口,j += 1缩小窗口,i += 1算法步骤:初始化,i=1,j=1, 表示窗口大小为0如果窗口中值的和小于目标值.原创 2020-10-02 01:02:21 · 52 阅读 · 0 评论 -
剑指Ofeer系列之「和为S的两个数字」
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。因为数组是有序的,所以可以用双指针,指向数组的首尾,具体步骤如下:1.初始化:指针i指向数组首, 指针j指向数组尾部因为数组是有序的,所以可以用双指针,指向数组的首尾,具体步骤如下:初始化:指针left指向数组首, 指针right指向数组尾部如果arr[left] + arr[right] == sum , 说明是可能解否则如果arr[left] + a.原创 2020-10-01 23:34:52 · 81 阅读 · 0 评论 -
剑指Offer系列之「孩子们的游戏(圆圈中最后剩下的数)」
孩子们的游戏(圆圈中最后剩下的数)这是一个约瑟夫问题,题解百度上都有,这里直接上代码public class Solution { public int LastRemaining_Solution(int n, int m) { if(n <= 0) return -1; int index = 0; for(int i=2; i<=n; i++){ index = (index + m)%i;原创 2020-10-01 23:15:46 · 51 阅读 · 0 评论 -
剑指Offer系列之「数组中的逆序对」
数组中的逆序对在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述:题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100的数据,size<=2*10^5示例:输入 1,2,3,4,5,6,7,0输出 7思考:其原创 2020-09-30 22:36:56 · 64 阅读 · 0 评论 -
剑指Offer系列之「第一次只出现一次的字符」
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)对于出现次数这种问题,hash表的思想是万能的。这里也不例外,只是这里的实现方式是用一个int数组来代替哈希表申请一个256的int数组,将字符串中的字符作为int数组数字的下标,这里是按照字符在字符串中的顺序依次保存的,取的时候,也是按照这个顺序取的,而不是按照int数组的下标来存取。Java实现如下:public .原创 2020-09-29 21:09:51 · 56 阅读 · 0 评论 -
剑指Offer系列之「数字在升序数组中出现的次数」
统计一个数字在升序数组中出现的次数。方法一:暴力解查找数组中某个目标,不管数组是否有序,直接遍历一遍即可。显然方法一没有把数组有序的条件利用上。时间复杂度:O(N)空间复杂度:O(1)方法二:伪二分先用二分找到该值,然后分别往左和往右遍历该方法与方法一没有本质区别,极限情况下,需要遍历的次数为数组的长度(当数组中只有k时)public class Solution { public int GetNumberOfK(int[] array, int k) { .原创 2020-09-29 20:03:20 · 123 阅读 · 0 评论 -
剑指Offer系列之「丑数」
把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。也就是说,丑数能够分解成 2x3y5z2^{x}3^{y}5^{z}2x3y5z前 20个丑数为:1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36。判断一个数是否为丑数:首先除2,直到不能整除为止,然后除5到不能整除为止.原创 2020-09-28 09:57:58 · 87 阅读 · 0 评论 -
剑指Offer系列之「最小的k个数」
最小的K个数输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。方法一:直接排序直接对数组进行全排序,这种方式总是有效的,但是其实不用全部排序。时间复杂度:O(nlongn)空间复杂度:O(1)方法二:堆排序时间复杂度:O(nlongk), 插入容量为k的大根堆时间复杂度为O(longk), 一共遍历n个元素空间复杂度:O(k)方法二:快排import java.util.*;public class S原创 2020-09-25 21:34:48 · 56 阅读 · 0 评论 -
LeetCode系列之「有序链表转换二叉搜索树」
有序链表转换二叉搜索树给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5思路:分治思想快慢指针找出中间节点mid,将中原创 2020-09-25 21:27:31 · 1621 阅读 · 0 评论 -
剑指Offer系列之「整数中1出现的次数」
整数中1出现的次数(从1到n整数中1出现的次数)求出 1~13 的整数中 1 出现的次数,并算出 1001300 的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有 1、10、11、12、13 因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路看这里 leetcode43. 1~n 整数中 1 出现的次数(清晰图解)实现一:public class Solut原创 2020-09-24 16:03:17 · 65 阅读 · 0 评论 -
剑指Offer系列之「数组中出现次数超过一半的数字」
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。法一:哈希法哈希法比较简单,这里不再赘述时间复杂度:O(n)空间复杂度:O(n)法二:排序法先将数组排序,然后可能的众数肯定在数组中间,然后选出中间的数,然后统计该数字的个数,如果大于数组长度的一半,则该数字即为所求。import java.util.*;public cla.原创 2020-09-23 21:41:46 · 63 阅读 · 0 评论 -
剑指Offer系列之「顺时针打印矩阵」
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下 4 X 4 矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.Java实现如下:import java.util.ArrayList;public class Solution { public ArrayList<Integer> printMatrix(int[][.原创 2020-09-23 20:00:02 · 66 阅读 · 0 评论