顺时针打印矩阵
顺时针打印矩阵&螺旋矩阵
问题陈述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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]
思路分析
空值处理:当matrix为空时,直接返回空列表。
初始化:左右上下四个边界l,r,t,b。
循环打印:
代码实现
123456789101112131415161718public class Cirlcle_printMatrix { public int[] spiralOrder(int[][] matrix){ if(matrix.length == 0) return new int[0]; int l = 0, r = matrix[0].length - 1, t = 0, b = matrix. ...
二叉树的镜像
二叉树的镜像
问题陈述
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
123456789101112例如输入: 4 / \ 2 7 /\ /\ 1 3 6 9 镜像输出: 4 / \ 7 2 / \ / \ 9 6 3 1
思路分析
如何实现镜像反转,其实就是从上到下对每个结点的左右结点进行交换,如果存在左(右)结点一个为空,则同样与空结点进行交换。
考虑栈结构的特性,可以用栈暂存结点。先根结点入栈,当栈不空,定义输出镜像为弹出的栈顶元素。继续,如果根结点的左结点不空,加入左结点;右结点不空,加入右结点。然后实现交换左右结点。
如此,实现。
代码实现
1234567891011121314151617public class BinaryTree_Mirror { public TreeNode treeMirror(TreeNode root){ if(root==null) return null; ...
从上到下打印二叉树
从上到下打印二叉树
问题陈述
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
12345678910例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回:[3,9,20,15,7]
思路分析
按层遍历输出的话可想到BFS(宽度优先遍历)。由此可用LinkedList结构的队列存储TreeNode,结点值存在ArrayList,然后以数组方式遍历输出。
具体步骤:
若为空,直接返回一个空数组。
根结点入队,根(首次为根,后续为队列下一结点)结点出队存入ArrayList,判断根结点的左右结点是否为空,不空则加入队列。这样不断入队出队,直到队列为空。
以数组方式打印出ArrayList元素。
代码实现
123456789101112public class BFS_printBT { public List<Integer> levelPrint(TreeNode root){ Lis ...
对称二叉树
对称二叉树
问题陈述
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
1234567891011121314例如,二叉树 [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
思路分析
考虑递归实现,先判断树是否为空,不空继续,递归判断其左结点和右结点是否相同。如果其左和右为空,返回true;如果左为空或者右为空或者左与右不相等,返回false;不空的话继续判断左的左和右的右,左的右和右的左。
代码实现
123456789101112131415161718192021public class Symmetric_BinaryTree { public boolean isSymmetric(TreeNode root){ if(root==null) return true;//空也是对 ...
包含min函数的栈
包含min函数的栈
问题陈述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
思路分析
普通栈的push和pop操作的时间复杂度为O(1),但是获取min则需要遍历一遍,复杂度为O(n)。
如此,我们考虑使用一个辅助栈来实现。
主栈:用于存储所有元素,实现正常的出入栈操作,获取栈顶元素等。
辅助栈:用于另存入主栈元素出现的最小元素,如先存入第一个入主栈元素,后面入栈元素依次与之比较,若更小,则继续存入,确保最小元素永远在辅助栈的栈顶。
代码实现
12345678 ...
自叙
他到底是一个什么样的人他自己也说不明白,他是一个有着和三毛一样心思的男子,痴迷古典文化,向往人世间一切美好的情愫,他念旧他深情他平庸他另类。关于他的故事,实在多的如长夏夜夜满天的繁星,望去点点的璀璨亦是同样的神秘且遥不可及。
他喜欢明末的张岱。崇祯五年十二月,余住西湖。大雪三日,湖中人鸟声俱绝。是日更定矣,余拏一小舟,拥毳衣炉火,独往湖心亭看雪……
为景而痴,为遇陌路相谈者欢,莫说相公痴,更有痴似相公者!
他喜欢林黛玉,是一个彻底的红楼迷,红楼和诗词铺就了他青春的色彩,他自诩为书中的贾宝玉,可他却又未有过贾宝玉的身世遭逢,他是一个辛苦遭逢的红尘畸零客。他更对林黛玉有莫名的好感,那种好,就像是前世的已然相知,她的音容笑貌一颦一蹙一言一行他都如数家珍呀!是呆了傻了!是一生的相思病呀!他只记得花明月暗,薄雾轻笼的秋夜,他和她相偎相诺自此一万年也舍不去的深情呀!
他喜欢沈三白 ,沈三白何其有幸,遇上芸娘。何其有幸 ,得葆一片痴心赤性。他实在喜欢《浮生六记》里的每一个字,闺房记乐,闲情记趣,坎坷记愁,浪游记快……一生的起承转合都在里头了,他的记忆又何尝不丰,他以后也是要写一部《浮生六记》的,《红 ...
读《琅嬛文集》录
读《琅嬛文集》录
近来读张岱《琅嬛文集》,遇见许多赏心悦目的文字,摘录此篇分享给大家。
故知世间山川、云物、水火、草木、色声、香味,莫不有冰雪之气;其所以恣人挹取受用之不尽者,莫深于诗文。
山之有空翠,气之有沆瀣,月之有烟霜,竹之有苍蒨,食味之有生鲜,古铜之有青绿,玉石之有胞浆,诗之有冰雪,皆是物也。苏长公曰:“子由近作《栖贤僧堂记》,读之惨凉,觉崩崖飞瀑,逼人寒栗。”噫!此岂可与俗人道哉!笔墨之中,崖瀑何从来哉!
——一卷冰雪文序
余幼遵大父教,不读朱注。凡看经书,未尝敢以各家注疏横据胸中。正襟危坐,朗诵白文数十余过,其意义忽然有省。间有不能强解者,无意无义,贮之胸中。或一年,或二年,或读他书,或听人议论,或见山川云物鸟兽虫鱼,触目惊心,忽于此书有悟,取而出之,名曰《四书遇》。盖“遇”之云者,谓不于其家,不于其寓,直于途次之中邂逅遇之也。古人见道旁蛇斗而悟草书,见公孙大娘舞剑器而笔法大进,盖真有以遇之也。古人精思静悟,钻研已久,而石火电光,忽然灼露,其机神摄合,政不知从何处着想也。举子十年攻苦 ...
反转链表
反转链表
问题陈述
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
思路分析
先将结点一个个存入栈,然后逐次弹栈取出。
代码实现
123456789101112131415161718192021222324252627public class Reverse_LinkList { public ListNode reverseLinklist(ListNode head){ if(head==null||head.next==null) return head; //判断链表是否为空,非常重要。 Stack<ListNode> stack=new Stack(); //定义一个ListNode类型的栈 ListNode first=head; //定义一个初始化结点等于head while(first!=null){ stack.push(first); first=fi ...
斐波那契数列及旋转数组找最小值
斐波那契数列及旋转数组找最小值
问题陈述一
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
代码实现
12345678910111213141516//动态规划的思想class Solution { public int fib(int n) { if(n<0) return -1; if(n==0) return 0; if(n==1) return 1; int[] dp=new int[n+1]; dp[0]=0; dp[1]=1; for(int i=2;i<=n; ...
合并两个排序的链表
合并两个排序的链表
问题陈述
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
限制:0 <= 链表长度 <= 1000
思路分析
先判断是否L1、L2为空。
比较L1,L2的值,小的加入新链表mergeLinklist。
当一方已经为空,是否另一方还有未比较的元素,然后直接加入mergeLinklist。
代码实现
12345678910111213141516171819202122232425262728293031public class Merge_Two_Linklist { public ListNode mergeTwoLinklists(ListNode l1,ListNode l2){ if(l1==null) return l2; if(l2==null) return l1; ListNo ...