![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法题
Java算法题
w011m
这个作者很懒,什么都没留下…
展开
-
算法题(5):最长回文子串
最长回文子串 难度:中等 题目描述:找到字符串中最长的回文子串。 思路:“最……”等问题常见思路之一就是动态规划,回文子串减去头尾也是回文子串,故考虑可以由短到长,每个字符本身就可以认为是回文子串,相邻的两个字符如果相同也是回文子串,接下来依次判断长度为3,4直到字符串本身的长度的子串,若其为回文子串,其首尾字符应相同且其内部子串为回文子串。 优化:若当前得到的最长回文子串的长度+2小于当前寻找子串的长度,不可能有更长的回文子串,可跳出循环。 状态转移方程:P(i, j) = P(i+1, j−1) ∧ (原创 2020-06-03 16:56:24 · 87 阅读 · 0 评论 -
算法题(4):合并两个有序链表
问题描述:合并两个有序链表,使得合并后的链表仍然有序。 难易度:简单 思路分析:获得两个链表较小的结点,将该结点作为头结点,与两个链表剩余结点的合并链表连接起来,即为要求的链表。即通过递归可实现两个有序链表的合并。 递归终止条件:两个链表有一个为空。 代码如下: public class O16 { public ListNode merge(ListNode list1, ListNode list2) { if(list1 == null) return l原创 2020-05-26 15:00:20 · 168 阅读 · 0 评论 -
算法题(3):单向链表倒数第k个结点
单向链表倒数第k个结点 难易度:简单 使用两个引用指向链表中的结点,并使两者之间相隔(k-1)个结点,如此,当快的引用指向尾结点时,慢的引用指向倒数第k个结点。 代码如下: public class Main { public ListNode FindKthToTail(ListNode head,int k) { ListNode node1 = head; ListNode node2 = head; for(int i = 1;原创 2020-05-25 15:47:36 · 109 阅读 · 0 评论 -
算法题(2):青蛙跳台阶
青蛙跳台阶变形题 问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 难易度:简单 传统青蛙跳台阶问题(一次跳一阶或两阶)通过递归、动态规划可轻易解决。 本题对每次跳的阶数不做限制,得方程: f(n) = f(0) + f(1) + …… + f(n -1) f(0), f(1)=1 即跳到第n阶可直接跳到第n阶,可先跳到第1阶,再直接跳(n-1)阶,可跳到第2阶,再直接跳(n-2)阶等。 由方程易得f(2)=2,f(3) =4,……,原创 2020-05-22 16:05:48 · 352 阅读 · 0 评论 -
算法题(1):用两个栈实现队列
用两个栈实现队列的pop与push 难易度:简单 问题分析:无非利用一个栈压入另一个栈的弹出,实现栈中数据的翻转,只是需要考虑如何调高效率。 现有两个栈,栈1用于队列push,栈2用于队列pop。当队列pop时候发现栈2为空,将栈1数据弹出压入栈2,此时栈2数据即为先进先出;若栈2不空,直接弹出栈顶数据即可。 以避免频繁两个栈之间相互出栈入栈。 具体代码如下: import java.util.Stack; public class Main { Stack<Integer> st原创 2020-05-21 10:35:50 · 121 阅读 · 0 评论