
数据结构和算法
i多子妹师南
这个作者很懒,什么都没留下…
展开
-
三个线程轮流打印0到10
package ThreadTest;public class ThreeThread { static class Node{ private int flag = 1; private int index = 0; } static class Thread1 extends Thread{ Node node; private final int threadId; private fin.原创 2020-10-26 18:43:08 · 163 阅读 · 0 评论 -
二叉树两个节点最近公共祖先的解法
假设有一个二叉树、根节点为TreeNode root、p节点和 q节点均在二叉树中、求p和q的最近公共祖先节点。优雅的递归解法:对于这个问题, 我们定义一个函数、但是这个函数扩充这个问题的定义public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q)这个函数的扩充定义是什么呢?虽然题目是保证p、q均在树中、但是我们为了实现递归解法、必须要考虑p、q有一个不在或者是均不在树中的情况来应对子树的情.原创 2020-10-25 23:51:03 · 908 阅读 · 0 评论 -
二叉树的节点包含指向父节点的指针,给出树中一个元素,求出中序遍历的下一个元素
package Tree;public class SearchForNext { /** * 树的节点有指向父节点,寻找下一个中序遍历的节点 */ public static NodeWithParent searchForNext(NodeWithParent now){ if(now.rchild != null) { ...原创 2019-08-20 15:46:25 · 1199 阅读 · 0 评论 -
TopN问题
题目通常描述为:如何在很多数中(10亿)中寻找前1000个最大的数。答:构造一个1000个数的小顶堆,然后再遍历剩下的元素,假如说比堆顶还小,那么这个堆中的1000个数都比这个数大,那么直接就淘汰这个数,如果比堆顶大,那么就把这个数替换掉堆顶元素(也就是堆顶元素肯定不是前1000个最大的数)。然后重新进行堆排序。假设问题规模不定,我们把题目序数为如何在n(n>>1000)个数中...原创 2019-08-20 14:23:45 · 289 阅读 · 0 评论 -
找出一个数组中第K大元素以及找出重复率最高的100个元素
找出一个数组中第K大元素1、如果允许移动元素,那么可以采用排序的方法,时间负载度是O(nlogn);还有一种算法是select(arr,k)(这个算法实现起来还是比较麻烦的)时间复杂度是O(n),也可以使用堆排序:如果使用堆排序的话,选择第K大元素,时间复杂度也是O(k+(n -k)logk)这个时间复杂度还是不错的。另外堆排序还可以解决topk的问题。2、如果不能移动元素...原创 2019-08-20 12:50:40 · 563 阅读 · 0 评论 -
求最短路径
题目描述:一个二维矩阵由0和1构成,求从左上角跑到右下角的最短路径。解法:广度优先遍历,使用队列,队列中的元素如果不弹出的话,从队头到队尾是步数一次增加,即:走一步可以到达的节点、走两步可以达到的节点、......要设置已访问数组:目的是防止某个节点重复入队,因为如果某个元素被第二次访问,那此次走到它的步数一定大于第一次走到它的步数,所以这个节点不符合最短路径,所以没必要入队,而且这个...原创 2019-08-23 19:45:42 · 366 阅读 · 0 评论 -
头条面试题-将一亿以内的文字转换为对应的阿拉伯数字
package Other;import java.util.HashMap;import java.util.Stack;public class WordToNum { /** * 问题描述:五千三百四十三万九千一百二十一转换为53439121 */ public static int transfer(String target){ ...原创 2019-08-19 14:52:44 · 426 阅读 · 0 评论 -
把一个数组中的数分为n段,使得每段和的最大值最小
思路:递归k :要分的段数1、当k = 1,则输出该数组的和2、当k= 数组元素个数,输出数组的最大值即可3、其他情况的话,考虑第一段的所有情况,要保证第一段后面的元素大于等于k-1,不然不能分成k-1段。对后面的k-1段使用递归函数package Array;public class KPart { /** * 把一个数组分为k段,使所有段的和的最大...原创 2019-08-09 12:28:10 · 3300 阅读 · 1 评论 -
有序数组平方后有多少个不同的数
package Array;public class SquareNotEqual{ /** * 一个有序数组,平方之后,有多少个不一样的数 * 思路:先把他们全部转换为非负数,然后两个指针从两端开始向中间扫描,从大到小开始计数,此时头尾两指针的元素得比较大小,并且记录 * 上次的数据,防止重复计数。 */ public static...原创 2019-08-18 17:23:54 · 1038 阅读 · 0 评论 -
求出一个矩阵中最长递增路径
递归(深度优先遍历)package Search;import java.util.LinkedList;import java.util.Stack;public class LongestIncreasingPathInMatrix { /** * 寻找一个矩阵中最长增长路径 * 深度搜索 */ public static int ...原创 2019-08-20 20:02:33 · 397 阅读 · 0 评论 -
找出一个分割点,尽可能小,使得分割点左边的数(包括分割点)全部小于右边的数
package Array;public class MinPart { /** * 对于一个数组,找出一个最小的分割点,使得左边的数全部小于右边的数 */ public static int minPart(int[] arr){ if(arr == null || arr.length == 0){ ret...原创 2019-08-20 21:18:05 · 439 阅读 · 0 评论 -
字符串匹配问题,返回第一个匹配的下标 ,运用了KMP算法
KMP的核心是next数组next数组是依据待匹配字符串计算出来的,和待匹配字符串的长度一致。计算过程如下: int[] next = new int[ne.length]; next[0] = -1; int j = 0, k = -1; while(j < needle.length() - 1){//计算next数组 ...原创 2018-11-08 20:32:40 · 907 阅读 · 0 评论 -
字节跳动编程算法题及解答
第二题:我觉得应该先反转单链表package List;public class ListAdd { /** * 两个链表相加 */ public static Node listAdd(Node num1, Node num2){ if(num1 == null || num2 == null){ retu...原创 2019-08-17 22:01:59 · 1069 阅读 · 0 评论 -
A与B地相距n米,一个人第一步只能前进1米或者后退1米,第二步只能前进2米或者后退2米,A走到B最少需要几步
有两种解法:1、递归,实质是深度优先遍历,但是报栈溢出错误2、利用队列实现广度优先遍历,可解package Recursive;import java.util.LinkedList;import java.util.Queue;public class OneStepTwoStep { /** * 问题描述:一个人第一步只能前进一米或者是后退一米11,...原创 2019-08-17 21:03:05 · 1058 阅读 · 0 评论 -
把一个搜索二叉树展开为一个双向链表
package Tree;import java.util.LinkedList;import java.util.Stack;public class TreeToDoubleList{ /** * 把一棵搜索二叉树展开为一棵有序双向链表 * 因为二叉树节点和双向链表的节点是一样的,都是一个值+两个指针,在展开的过程时把树的左孩子节点作为last节点...原创 2019-08-21 21:02:11 · 173 阅读 · 0 评论 -
一个队列存放几千万上亿的数据,应该如何设计这个队列?只需要在头尾进行添加、删除
class Node<V>{ V value; Node<V> next; Node<V> last; public Node(V value){ this.value = value; }}public class DoubleLinkedList<V>{ Node...原创 2019-08-16 09:49:55 · 1599 阅读 · 0 评论 -
链表每K个节点进行反转
package List;public class Node<V> { V value; Node<V> next; public Node(V value){ this.value = value; } public static void printList(Node head){ Node ...原创 2019-08-15 22:40:54 · 3488 阅读 · 0 评论 -
数组中一个数字只出现一次,其他数字都出现了两次,求该数
public class AppearOneTime { /** * 一个数组中其他数字都出现了两次,只有一个数字只出现了一次 */ public static int appearOneTime(int[] arr) { int result = 0; for(int i = 0; i < arr.length;...原创 2019-07-28 20:49:05 · 288 阅读 · 0 评论 -
二叉树最长路径的非递归算法和递归算法
package BinaryTree;import java.util.Stack;import static BinaryTree.Node.createBinaryTree;import static BinaryTree.Node.inOrderNotRecursive;public class LongestRoad { /** * 求二叉树的最长路径 ...原创 2019-07-26 14:41:42 · 1002 阅读 · 0 评论 -
创建二叉树、递归/非递归 先序/中序/后序遍历二叉树算法
package BinaryTree;import java.util.Scanner;import java.util.Stack;//二叉树的节点public class Node { String value; Node left; Node right; public Node(String value){ this.val...原创 2019-06-02 21:19:37 · 497 阅读 · 0 评论 -
未排序数组中累加为给定值的最长子数组问题。
问题描述:一个数组可能包含正数、负数和0.找出和为k的最长子数组的长度。这种题目有暴力求解方法:思路:我们考虑以数组中每一个节点作为一个子数组的尾节点,然后对于该节点,从头遍历遍历到该节点位置,遇到第一个和为sum的节点,求出子数组长度...,这种算法其实也需要我们先遍历一遍,算出每个节点到头结点和才行。最优解法:利用HashMap,时间复杂度仅为O(n),空间复杂度也是O(n)思...原创 2019-06-05 14:00:51 · 236 阅读 · 0 评论 -
调整一棵二叉树,使得每个节点的右子树的最大值大于左子树的最大值
思路:递归、分别计算左右子树的最大值,如果左子树的最大值较大就交换两棵子树,然后对左右子树递归调用该算法。package BinaryTree;import java.util.Stack;import static BinaryTree.BiggestSubBST.biggestSubBST;import static BinaryTree.Node.createBinaryTr...原创 2019-07-06 10:20:26 · 1783 阅读 · 0 评论 -
递归二叉树
1、对于二叉树写递归算法时:1、考虑根节点为空的情况2、考虑只有根节点、根节点的左右子树均为空的情况3、考虑根节点只有一个子树的情况4、考虑根节点左右子树均存在的情况...原创 2019-07-06 14:00:09 · 153 阅读 · 0 评论 -
N个人都不坐自己位置的情况有几种
* 问题描述:n个人每个人都有自己的位置,问每个人都不坐自己的位置有几种情况* 思路很简单:递归* 第一个人可以做其他n-1个位置,当第一个人做每一个位置,比如说第一个人坐2号位置和3号位置的情况是一样多的。* 然后当第一个人坐2号位置,剩下的情况和原问题并不等价* 因为原问题每个人都有自己的位置,但是现在子问题2号没有自己的位置,只有多了一个1号位置* 我们暂时把1号位置认为就是2号...原创 2019-08-03 22:38:58 · 3989 阅读 · 0 评论 -
二分法、牛顿法开根号
package Array;public class SqrtN { /** * 用二分法开根号必定涉及精度问题,而且精度肯定比较小,比如0.00000001 * 那总不至于我用一次二分法,也叫开根号了吧,比如说根号3,二分法用一次等于2,那么能说根号3等于2吗 * @param value * @return */ pu...原创 2019-08-03 22:11:52 · 519 阅读 · 0 评论 -
全排列、按字典序全排序
单纯全排列public class FullSort { public static void fullSort(char[] arr, int start, int end){ if(arr == null || arr.length == 0){ return; } int len = arr.length;...原创 2019-08-03 13:12:00 · 588 阅读 · 0 评论 -
链表有环问题及入环节点数学原理解析
先上代码:下面这段代码仅判断一个链表是否有环,有环的话,单链表的形状只可能是”O”型或者是“P”型class Node{ int value; Node next; public node(int value){ this.value = value; }}public class Circle { /** * ...原创 2019-07-25 20:22:25 · 577 阅读 · 0 评论 -
纸牌博弈先手最优问题
问题描述:一个纸牌明牌显示,牌上的数值就是分数:(就是一个数组,每个数均为非负整数),设置一个数为M,每个人都是绝顶聪明,都是按最优策略顺序拿牌,一次可拿的牌数是大于等于1,小于等于M,问先手拿牌的人最多可以得几分。答:这题使用贪心法绝对是不行的。比如 1,1,1,100,设置M=2那么第一个人绝对不能第一次拿两张牌,否则第二个人就可以拿到100.这涉及到两个人博弈问题,但...原创 2019-07-21 11:03:51 · 722 阅读 · 0 评论 -
二叉树的最近公共祖先
给出一个二叉树以及该二叉树的两个节点,求出该二叉树的最近祖先节点先看代码,下面给出一些个人看法 public Node nearestAncestor(Node root, Node node1, Node node2){ if(root == null || root == node1 || root == node2){ return ro...原创 2019-07-28 23:34:02 · 127 阅读 · 0 评论 -
两个栈实现一个队列
1、一个栈进元素、一个栈出元素2、当出栈和入栈均为空,表明该队列中没有元素3、如果说出栈中有元素,要poll的话,直接pop即可,如果说出栈中没有元素,把入栈中所有元素弹出到出栈,再pop即可4、对于入队操作,直接push进入栈即可。package StackAndQueue;import java.util.Stack;//我们使用两个栈来实现一个队列,这个队列是一个类...原创 2019-07-07 13:40:53 · 135 阅读 · 0 评论 -
2*1的积木和1*1的积木搭成n行m列的问题
package DynamicAndRecursive;public class BuildBlock { /** * 对于两种积木:2*1型和1*1型,搭n行m列有几种搭法。 * 思路:先考虑搭一列的情况,再递归调用即可。 * 对于搭一列的问题,就是走楼梯问题,一次可以走一步或者两步,总共有多少种走法。 */ public stati...原创 2019-07-06 14:01:23 · 3099 阅读 · 1 评论