
数据结构&算法
Yaphat
这个作者很懒,什么都没留下…
展开
-
二叉树最大路径和
题目描述给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和)思路首先我们分析一下对于指定某个节点为根时,最大的路径和有可能是哪些情况。第一种是左子树的路径加上当前节点,第二种是右子树的路径加上当前节点,第三种是左右子树的路径加上当前节点(相当于一条横跨当前节点的路径),第四种是只有自己的路径。乍一看似乎以此为条件进行自下而上递归就原创 2017-09-04 13:32:58 · 1799 阅读 · 0 评论 -
链表去重
题目在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路1、链表头可能被删除,在前面再加一个head节点, 2、如果当前元素没有重复的,则加入列表中 3、如何判断当前元素有没有重复,使用一个指针记录当前元素第一次出现的节点,然后第二个指针遍历具有相同元素的节点,便利完之后,原创 2017-04-25 13:59:02 · 1592 阅读 · 0 评论 -
数组中出现次数超过一半的数字
问题描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路一最容易想到的思路就是对数据排序,那么中间的数字就是要求的数字。时间复杂度就是排序的复杂度思路二下面说一下复杂度是O(n)的解法 如果有符合条件的数字,则它出现的次数比其他所有数原创 2017-08-28 14:36:58 · 445 阅读 · 0 评论 -
翻转链表
翻转链表的两种情况翻转单链表很简单public ListNode reverseList(ListNode head) { ListNode tmp=null; ListNode dummy=new ListNode(0); dummy.next=null; while(head!=null){ tmp=head原创 2017-08-23 18:45:12 · 483 阅读 · 0 评论 -
数组奇偶划分
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。情况一不需要保证奇数和偶数之间相对位置不变。 这里可以用快排的思想。时间复杂度为O(n)public static int[] reOrderArray(int[] array) { int left = 0; int right =原创 2017-08-28 15:06:42 · 2720 阅读 · 0 评论 -
两数之和
题目描述给定一个整型数组,找出其中的两个数使其和为某个指定的数,并返回两个数的下标。思路这里其实要考虑数组可能出现相同值的情况。public int[] twoSum(int[] nums, int target) { int[] result=new int[2]; Map<Integer,Integer> map=new HashMap<Integer,Integ原创 2017-09-01 11:03:19 · 430 阅读 · 0 评论 -
最大下标距离
题目描述给定一个整形数组,找出最大下标距离j−i, 当且A[i]解法public static int maxindexdistance(int A[]) { boolean[] isDes = new boolean[A.length]; int min = A[0]; isDes[0] = true; for (int i = 0;原创 2017-09-01 15:34:12 · 630 阅读 · 0 评论 -
螺旋矩阵顺时针打印
问题描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.解法需要注意四个边界。import java.util.ArrayList;public class Solution {原创 2017-09-01 15:49:21 · 1044 阅读 · 0 评论 -
二叉树
二叉树的常见操作import java.util.LinkedList;import java.util.Queue;import java.util.Stack;import javax.swing.LayoutStyle;import java.util.ArrayList;class TreeNode { int val; TreeNode left; Tre原创 2017-09-01 16:02:48 · 537 阅读 · 0 评论 -
二叉搜索树转为双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。实现中序遍历二叉搜索树就可以,需要记录节点的前一个指针。同时需要标记下是否是双向链表的头节点public TreeNode Convert(TreeNode root) { Stack<TreeNode> stack=new Stack<TreeNode>();原创 2017-09-01 17:26:20 · 581 阅读 · 0 评论 -
二叉树序列化和反序列化
题目描述请实现两个函数,分别用来序列化和反序列化二叉树实现public class Solution { String Serialize(TreeNode root) { StringBuffer sb=new StringBuffer(); if(root==null){ sb.append("#,"); r原创 2017-09-01 18:32:36 · 662 阅读 · 0 评论 -
重建二叉树
问题描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路这道题还是有点绕的,尤其是索引值的确定,多想想吧。 递归思想,每次将左右两颗子树当成新的子树进行处理,中序的左右子树索引很好找,前序的开始结束索引通过计原创 2017-08-25 15:03:17 · 413 阅读 · 0 评论 -
搜索排序数组
问题描述假设有一个排序的按未知的旋转轴旋转的数组(比如,0 1 2 4 5 6 7 可能成为4 5 6 7 0 1 2)。给定一个目标值进行搜索,如果在数组中找到目标值返回数组中的索引位置,否则返回-1。解决对于这种部分有序的数组都可以使用二分法 public int search(int[] A, int target) { int low=0; int hi原创 2017-08-24 17:17:30 · 656 阅读 · 0 评论 -
最大公共子串&&最大公共子序列
问题描述最大公共子序列给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。 状态转移方程为:如果A[i]=A[j],则dp[i][j]=dp[i-1][j-1]+1,如果不等,则dp[i][j]=Math.max(dp[i][j-1],dp[i-1][j])public class Solution { /** * @param A, B: Two strings.原创 2017-08-18 16:32:13 · 496 阅读 · 0 评论 -
动态规划
每个阶段只有一个状态->递推; 每个阶段的最优状态都是由上一个阶段的最优状态得到的->贪心; 每个阶段的最优状态是由之前所有阶段的状态的组合得到的->搜索; 每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到而不管之前这个状态是如何得到的->动态规划。每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到 这个性质叫做最优子结构;而不管之前这个状态是如何得到的 这个性质叫做原创 2016-08-25 10:30:22 · 925 阅读 · 0 评论 -
二叉查找树中搜索区间
题目描述:给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点。找到树中所有值在 k1 到 k2 范围内的节点。即打印所有x (k1 <= x <= k2) 其中 x 是二叉查找树的中的节点值。返回所有升序的节点值。样例 如果有 k1 = 10 和 k2 = 22, 你的程序应该返回 [12, 20, 22].20 / \ 8 22 / \ 4 12解原创 2017-04-09 21:11:11 · 707 阅读 · 0 评论 -
对称的二叉树
题目描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解题思路左子树的左子树和右子树的右子树相同,左子树的右子树和右子树的左子树相同,则为对称。/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null;原创 2017-04-10 15:39:05 · 452 阅读 · 0 评论 -
按之字形打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。解题思路以题目中的二叉树为例,一步步分析。1、当二叉树的根结点(结点1)打印之后,它的左子结点(结点2)和右子结点(结点3)先后保存到一个容器中。值得注意的是,在打印第二层的结点时,先打印结点3,后打印结点2。由此可见结点在这个容器中是后进先出的,原创 2017-04-10 16:56:49 · 730 阅读 · 0 评论 -
最近公共父节点
1、二叉树最低公共父节点题目描述: 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中某两个结点的最低公共父结点。public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root==null || root==p ||原创 2017-04-18 15:35:19 · 849 阅读 · 0 评论 -
从上到下打印二叉树
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。解题思路类似之子形打印,但这里是顺序打印,所以可以用两个队列。java实现代码:import java.util.ArrayList;import java.util.Queue;import java.util.LinkedList;/*public class TreeNode { int val = 0;原创 2017-04-10 17:02:07 · 404 阅读 · 0 评论 -
递归
对递归程序一直是一知半解,对于简单的递归程序,我大致能弄懂整个流程,但是复杂点的递归程序(比如说树的各种递归)就一头雾水。今天在看知乎时,看到一个非常不错的建议。大致如下。写递归函数要处理好递归的3个主要点: a) 出口条件,即递归通常什么时候结束,这个通常在递归函数的开始就写好; b) 如何由”情况 n” 变化到”情况 n+1”, 也就是非出口情况,也就是一般情况——”正在”递归中的情况;原创 2017-03-10 16:31:46 · 757 阅读 · 0 评论 -
排序算法和java实现
一、冒泡排序1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2、 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 3、针对所有的元素重复以上的步骤,除了最后一个。 4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。public static void bubblesort(int[] array){原创 2017-02-10 14:52:27 · 522 阅读 · 0 评论 -
Top K
问题描述:在一维数组中找到第K大的数。 比如说: 数组[3,2,1,5,6,4] k = 2, 返回 5.解法一:最容易想到的就是排序整个数组。可以用快速排序的方法。public int findKthLargest(int[] nums, int k) { final int N = nums.length; Arrays.sort(nums);原创 2017-04-24 11:06:03 · 786 阅读 · 0 评论 -
寻找旋转排序数组中的最小值
问题描述假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2)。 你需要找到其中最小的元素。没有重复值public class Solution { /** * @param nums: a rotated sorted array * @return: the minimum number in the arr原创 2017-08-18 15:53:44 · 510 阅读 · 0 评论 -
最长上升子序列
问题描述给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。public class Solution { /** * @param nums: The integer array * @return: The length of LIS (longest increasing subsequence) */ public int long原创 2017-08-18 16:24:38 · 437 阅读 · 0 评论 -
二叉树中和为某值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路这道题有好几个需要注意的细节。public class Solution { ArrayList<ArrayList<Integer>> listall=new ArrayList<ArrayList<Integer>>(); Arr原创 2017-09-03 17:06:35 · 678 阅读 · 0 评论