
数据结构与算法
文章平均质量分 63
在云端123
这个作者很懒,什么都没留下…
展开
-
美团点评研发笔试题
最大差值有一个长为n的数组A,求满足0≤a≤b给定数组A及它的大小n,请返回最大差值。测试样例:[10,5],2返回:0解题思路:遍历数组的每个数与他后面的数的差值,用max比较,存放最大差值import java.util.*;public class LongestDistance { public int getDis(int[] A, int n)原创 2017-03-21 11:28:02 · 1479 阅读 · 0 评论 -
最容易看懂的红黑树演变
前言 红黑树,对不少人来说是个比较头疼的名字,在网上搜资料也很少有讲清楚其演变来源的,多数一上来就给你来五条定义,红啊黑啊与根节点距离相等之类的,然后就开始进行旋转、插入、删除这些操作。一通操作下来,连红色和黑色怎么来的,是什么含义,有什么作用都云里雾里的,能搞清楚就怪了。 本文介绍红黑树,暂时不涉及任何代码,只是帮助你理解红黑树的演变来源,树结构中红黑色具体含义,保证你理解了过转载 2017-08-08 15:00:33 · 804 阅读 · 0 评论 -
Java如何输入不确定长度的数组
public static void main(String[] args) { Scanner in = new Scanner(System.in); List<Integer> list=new ArrayList<Integer>(); while (in.hasNext()) { String s=in.nextLin原创 2017-08-26 17:00:37 · 35799 阅读 · 6 评论 -
二分查找的变种
关于二分查找,如果条件稍微变换一下,比如:数组之中的数据可能可以重复,要求返回匹配的数据的最小(或最大)的下标;更近一步, 需要找出数组中第一个大于key的元素(也就是最小的大于key的元素的)下标,等等。 这些,虽然只有一点点的变化,实现的时候确实要更加的细心。 二分查找的变种和二分查找原理一样,主要就是变换判断条件(也就是边界条件),如果想直接看如何记忆这些变种的窍门,请直接翻到本文最后。原创 2017-10-14 21:59:02 · 938 阅读 · 0 评论 -
反转单向链表的几种方法
1、非递归 public Node reverse(Node current){ Node previousNode =null; Node nextNode=null; while(current!=null){ nextNode=current.next; current.next=previo原创 2017-10-26 22:14:44 · 433 阅读 · 0 评论 -
二叉树的非递归遍历
一、前序遍历public void PreOrderUnrec(TreeNode root){ Stack s=new Stack<>(); TreeNode p=root; while(p!=null||!s.empty(){ while(p!=null){ System.out.println(p.val); s.push(p);原创 2017-05-09 09:54:28 · 773 阅读 · 0 评论 -
一个很有意思的并查集详解
这个文章是几年前水acm的时候转的, 当时也不知道作者是谁, 要是有人知道的话说一下吧并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定。不分享出来真是对不起party了。(party:我靠,关我嘛事啊?我跟你很熟么?)来看一个实例,杭电1232畅通工程...转载 2018-04-23 00:33:22 · 300 阅读 · 0 评论 -
LeetCode题型总结(Java)
LeetCode of algorithms with Java solution二分查找[704] Binary Search[441] Arranging Coins[222] Count Complete Tree Nodes[162] Find Peak Element[744] Find Smallest Letter Greater Than Target[2...原创 2019-01-09 18:55:39 · 2622 阅读 · 0 评论 -
360笔试题-粉笔组合
import java.util.Scanner;public class Test360 { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int n = in.nextInt()原创 2017-08-26 22:55:57 · 903 阅读 · 1 评论 -
笔试题-动态规划系列
1、 最长递增子序列时间限制:3秒 空间限制:32768K 对于一个数字序列,请设计一个复杂度为O(nlogn)的算法,返回该序列的最长上升子序列的长度,这里的子序列定义为这样一个序列U1,U2…,其中Ui < Ui+1,且A[Ui] < A[Ui+1]。 给定一个数字序列A及序列的长度n,请返回最长上升子序列的长度。 测试样例: [2,1,4,3,1,5,6],7 返回:4privat原创 2017-08-24 15:28:43 · 1087 阅读 · 0 评论 -
leetcode-wordbreak
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words. For example, given s =”leetcode”, dict =[“leet”, “co原创 2017-08-21 00:12:52 · 379 阅读 · 0 评论 -
美团点评笔试-拼凑钱币
给你六种面额 1、5、10、20、50、100 元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数。 输入描述: 输入包括一个整数n(1 ≤ n ≤ 10000)输出描述: 输出一个整数,表示不同的组合方案数 输入例子: 1 输出例子: 1解题思路:http://blog.youkuaiyun.com/htq__/arti原创 2017-07-30 22:57:17 · 3802 阅读 · 3 评论 -
动态规划入门
首先,我们看一下这道题 输入格式:5 //表示三角形的行数 接下来输入三角形73 88 1 02 7 4 44 5 2 6 5在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大 我们使用D(i,j)来表示第i行的第j个数 MaxNum(i,j)来表示D(i,j)到底边的原创 2017-04-21 00:23:49 · 736 阅读 · 0 评论 -
分治算法之大数相乘
分治算法的思想就是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同,求出子问题的解就可得到原问题的解 求解步骤: 1、分解,将要解决的问题划分成若干规模较小的同类问题 2、求解,当子问题划分得到足够小时,用较简单的方式解决 3、合并,按原问题的要求,将子问题的解逐层合并构成原问题的解例子:大数乘法原创 2017-08-01 23:11:00 · 742 阅读 · 0 评论 -
冒泡排序、快速排序、选择排序
1、冒泡排序原理:临近的两个数字比较,按照从小到大或者从大到小进行排序,一共进行N趟排序(N是数组的长度) 时间复杂度:O(n^2)@Test public void bubbleSort() { int a[]={18,4,26,3,99,54}; int length=a.length; for(int j=0;jl原创 2017-04-16 10:46:27 · 824 阅读 · 0 评论 -
剑指offer-请写程序找出这两个只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路: 1、异或思想,一个数与自己异或为0,一个数与0异或为自己 2、由于其它数字两两相同,所以所有数异或则得到这两个不同数的异或结果。取这个结果的第一个1作为标志位 3、这个标志的1,必须是:这两个数在该位一个为0,一个为1 4、这样可以将数组分为两组,一组在该标原创 2017-05-22 21:38:39 · 735 阅读 · 0 评论 -
剑指offer-判断该二叉树是否是平衡二叉树
public class Solution { public boolean IsBalanced_Solution(TreeNode root) { if(root==null) return true; int l=TreeDepth(root.left); int r=TreeDepth(root.right);原创 2017-05-22 21:38:01 · 607 阅读 · 0 评论 -
字符串匹配的KMP算法
字符串匹配的KMP算法 字符串匹配是计算机的基本任务之一。 举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K转载 2017-04-04 11:51:54 · 613 阅读 · 0 评论 -
Java求最大公约数和最小公倍数
import java.util.Scanner;public class Muitilpie { public static void main(String[] args) { Scanner in=new Scanner(System.in); int x=in.nextInt(); int y=in.nextInt();原创 2017-04-19 00:34:05 · 1520 阅读 · 0 评论 -
堆排序与归并排序
堆堆实际上是一颗完全二叉树,其任何一非叶节点满足 key[ i ]<=key[ 2i+1 ]&&key[ 2i+2 ]或者相反,也就说任何非叶节点的关键字不大于或者不小于其左右孩子节点的关键字堆排序的思想1、建立堆 ,此时得到的是无序堆2、堆顶与堆的最后一个元素交换位置,此时得到是新的无序堆和新的有序堆代码实现public class HeapSort { public static vo原创 2017-04-16 10:43:10 · 945 阅读 · 0 评论 -
裁剪网格纸
题目描述度度熊有一张网格纸,但是纸上有一些点过的点,每个点都在网格点上,若把网格看成一个坐标轴平行于网格线的坐标系的话,每个点可以用一对整数x,y来表示。度度熊必须沿着网格线画一个正方形,使所有点在正方形的内部或者边界。然后把这个正方形剪下来。问剪掉正方形的最小面积是多少。 输入描述:第一行一个数n(2≤n≤1000)表示点数,接下来每行一对整数xi,yi(-1e9<=xi,yi<=1e9)表示网格原创 2017-05-04 16:27:45 · 1173 阅读 · 0 评论 -
钓鱼比赛
题目描述 ss请cc来家里钓鱼,鱼塘可划分为n*m的格子,每个格子有不同的概率钓上鱼,cc一直在坐标(x,y)的格子钓鱼,而ss每分钟随机钓一个格子。问t分钟后他们谁至少钓到一条鱼的概率大?为多少?输入描述: 第一行五个整数n,m,x,y,t(1≤n,m,t≤1000,1≤x≤n,1≤y≤m); 接下来为一个n*m的矩阵,每行m个一位小数,共n行,第i行第j个数代表坐标为(i,j)的格子钓到鱼原创 2017-05-04 16:59:18 · 885 阅读 · 0 评论 -
按层打印二叉树
解题思路:准备一个queue放每一层TreeNode,用nLast记录当前层当时最右节点,last记录当前层实际最右节点, cur是当前节点,如果当前节点就是最右节点,就把nLast当前最右节点赋值给last,curLine用于存储每一层节点数据,当是当前节点是该层最右节点,就把该层的curLine添加到nodes,然后创建新的curLine来装下一层节点数据import java.util.Ar原创 2017-04-22 23:50:28 · 1033 阅读 · 0 评论 -
判断数组是否某二叉搜索树的后序遍历
解题思路:由于是后序遍历结果,也就是数组最后一个元素是根节点root,按照二叉搜索树的定义,数组前面的元素中前半部分比root小,后半部分比root大,我们通过遍历数组跟root比较,如果比root大,记录这个位置i,从这个i到直到最后的元素跟root比较,如果还有比root小的元素,说明不符,返回false,然后递归,检测所有子树public class Solution { public原创 2017-04-24 23:50:12 · 760 阅读 · 0 评论 -
leetcode-candy
CandyThere are N children standing in a line. Each child is assigned a rating value. You are giving candies to these children subjected to the following requirements: Each child must have at least on原创 2017-05-08 10:03:23 · 727 阅读 · 0 评论 -
连续子数组的最大和 java
public class Solution { public int FindGreatestSumOfSubArray(int[] array) { if(array.length==0||array==null) return 0; int max=0; int curNum=0; for(int i原创 2017-05-07 23:57:00 · 860 阅读 · 0 评论 -
BFS和DFS详解以及java实现
前言图在算法世界中的重要地位是不言而喻的,曾经看到一篇Google的工程师写的一篇《Get that job at Google!》文章中说到面试官问的问题中几乎有一半的问题都可以用图的方法去解决。由此也可以看出图确实适用范围确实很广。图的表示闲话不多说,首先要介绍的就是图的表示,图最常用的两种表示方法是邻接表和邻接矩阵。顾名思义,这两种办法分别用表和矩阵的方式描述图中各顶点之间的联系下图展示转载 2017-05-09 22:22:27 · 937 阅读 · 0 评论 -
剑指offer
链表1、输入一个链表,从尾到头打印链表每个节点的值。 解题思路:需要用到栈Stack和数组列表ArrayList,先链表listNode.next一个一个遍历把对象push到栈里,再从栈pop()出来添加到ArrayList,最后返回ArrayListimport java.util.ArrayList;import java.util.Stack;public class Solution原创 2017-03-21 11:27:02 · 618 阅读 · 0 评论 -
二叉树最大深度和最小深度
二叉树的最大深度int maxDepth(TreeNode *root) { // write your code (here) if(root == NULL) return 0; int leftDepth = maxDepth(root->left); int rightDepth = maxDept原创 2017-05-22 21:35:00 · 842 阅读 · 0 评论 -
牛客网校招模拟-好多鱼
牛牛有一个鱼缸。鱼缸里面已经有n条鱼,每条鱼的大小为fishSize[i] (1 ≤ i ≤ n,均为正整数),牛牛现在想把新捕捉的鱼放入鱼缸。鱼缸内存在着大鱼吃小鱼的定律。经过观察,牛牛发现一条鱼A的大小为另外一条鱼B大小的2倍到10倍(包括2倍大小和10倍大小),鱼A会吃掉鱼B。考虑到这个,牛牛要放入的鱼就需要保证: 1、放进去的鱼是安全的,不会被其他鱼吃掉 2、这条鱼放进去也不原创 2017-05-22 21:36:02 · 1000 阅读 · 0 评论 -
剑指offer-将字符串转化为数字
import java.util.regex.Matcher;import java.util.regex.Pattern;public class Solution { public int StrToInt(String str) { if(str.equals("")) return 0; char[] c=str.toCh原创 2017-05-22 21:36:45 · 703 阅读 · 0 评论 -
剑指Offer-删除链表中重复的结点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5/* 准备两个指针,一个指向前一个节点preNode,另一个指向当前节点node, 如果遇到相等的节点,node向后移动,preNode不动,存下node.val方便比较 直达遇到node和node.nex原创 2017-05-22 21:37:25 · 758 阅读 · 0 评论