经典算法
xiaoyi357
这个作者很懒,什么都没留下…
展开
-
Java实现:在二叉树中,求距离最远的两个节点的距离
思路:递归的计算出:从每个节点出发,向左走的最大距离和向右走的最大距离,并以每个节点的这两个值为基础进一步计算和判断整个二叉树的最大距离。。。详细步骤见代码注释。Java代码如下:import java.util.LinkedList;import java.util.Queue;class Node { int data; Node left; Node right;原创 2017-03-13 12:34:14 · 2812 阅读 · 0 评论 -
求两个字符串的最长公共子序列——Java实现
要求:给定字符串1和字符串2,要求找出两个字符串的最长公共子序列。例如,字符串1=“helloworld”,字符串2=“hwewegallgeo”,那么两者的最长公共子序列为“hello”思路:参见:http://www.cnblogs.com/zhangchaoyang/articles/2012070.html使用一个二维数组datas保存中间结果;使用另外一个二维数组index保存路原创 2017-04-17 16:08:22 · 5701 阅读 · 1 评论 -
求两个字符串的最长公共子串——Java实现
要求:求两个字符串的最长公共子串,如“abcdefg”和“adefgwgeweg”的最长公共子串为“defg”(子串必须是连续的)方法一: 对于较短的那个字符串,假设其长度为n,依次找到它的长度为n, n-1, n-2....1的若干的子串,若另外那个较长的字符串包含了较短字符串的某个子串,则找到了二者的最长公共子串。Java代码如下:public class Solution原创 2017-04-17 15:06:37 · 30055 阅读 · 9 评论 -
求字符串的最长重复子串——Java实现
要求:求一个字符串的最长重复子串思路:使用两个指针,两个指针的间隔从1,2,3...依次增大, 同时向右移动两个指针,在移动的过程中判断指针位置的字符是否相同,并记录最长子串的长度。Java代码:public class Solution { // 求解字符串中的最长重复子串 public static String maxRepat(String input) {原创 2017-04-17 19:39:55 · 10524 阅读 · 1 评论 -
Java-快速排序算法的实现
下面代码的一些提示:使用数组的首元素作为轴值;每次移动都是右指针先向左移动,直到遇到第一个比轴值小的元素 or 右指针遇到了做指针 停止; 接下来左指针向右移动,直到遇到第一个比轴值大的元素,或者遇到了右指针停止。当左右指针都停止移动时,如果两者已经相遇,则left指针(或right指针)所处的位置即为轴值应处于的正确位置,交换left指针处的值和轴值;若左右指针都停止移动时,两者尚未相遇原创 2017-03-13 10:47:02 · 268 阅读 · 0 评论 -
在逆转数组中寻找最小元素——Java实现
思路:使用左右两个指针,左指针最初指向0,右指针指向最后一个元素。根据左右指针所指的数据和中间指针所指数据的大小关系移动指针。(注意:如果左右指针只相差1,需要特殊处理)Java代码如下:public class Solution { // 在left~right 之间顺序查找最小元素 public static int findMinNum(int[] nums, in原创 2017-04-10 20:50:55 · 592 阅读 · 0 评论 -
2Sum -- Java实现(3Sum 4Sum)待补充
思路:使用头尾指针Java代码实现:import java.util.Arrays;import java.util.LinkedList;import java.util.List;class Pair{ int x; int y; Pair(int xParam, int yParam){ x = xParam; y = yParam; }}pub原创 2017-04-10 20:01:51 · 770 阅读 · 0 评论 -
使用归并思想查找数组中的逆序对的数量——Java实现
使用二分归并思想,一个数组的逆序对的数量 = (构成逆序对的数字都在左半部分)左半部分逆序对的数量 + (构成逆序对的数字都在右半部分)右半部分逆序对的数量 + (构成逆序对的数字左半部分一个,右半部分一个)左右两部分的逆序对的数量。Java代码如下:public class Solution { // 使用归并思想统计数组中的逆序对 public static int原创 2017-04-10 19:28:14 · 652 阅读 · 0 评论 -
使用String模拟大数加减乘除(除法和取余待补充)
加减:模拟手工计算过程。乘:模拟手工计算过程(乘数B的每一位数字和乘数A相乘的时候使用连续n次加法进行模拟)除:连续做减法,直到差值出现负号(注:代码未经过充分测试,重点是记录下思想) Java代码如下: import java.math.BigInteger;public class Solution { // 将string转化为指定的长度 public ...原创 2017-04-10 15:49:29 · 2892 阅读 · 0 评论 -
使用两个栈实现队列
思路:使用两个栈,一个栈(栈1)用于保存输入,另一个栈(栈2)用于将输入倒序保存。当要想向队列中插入一个元素时,直接将元素插入到栈1中;当想从队列中获取一个元素时,首先判断整个队列是否为空,若不为空,判断栈2是否为空,若不为空,返回栈顶元素即为队列的第一个元素;若栈2为空,则将栈1中的元素全部压入栈2,再将栈2的栈顶元素弹出即可。Java代码如下:import java.util.原创 2017-04-09 09:37:11 · 381 阅读 · 0 评论 -
根据前序遍历和中序遍历重建二叉树
参见:http://blog.csdn.net/xiaoyi357/article/details/61640226原创 2017-04-08 21:49:55 · 297 阅读 · 0 评论 -
链表的反转(递归实现和非递归实现)
方法一:非递归实现,使用三个指针。Java代码如下:package com.yiguy.test;class Node{ int data; Node next; Node(){ } Node(int dataParam){ this.data = dataParam; this.next = null; }}public class List {原创 2017-04-08 21:02:21 · 319 阅读 · 0 评论 -
从二维数组中查找某个元素
题目:有一个二维数组,二维数组的每一行从左到右数据递增,二维数组的每一列,从上到下递增。在这样的二维数组中查找指定元素,返回其下标。思路:首先将待查找的元素q与二维数组的右上方的元素e进行比较,如果e=q,则找到了指定元素,返回其坐标;若e>q,则元素e所在的列可以排除,因为该列元素都比q大;若eJava代码如下:class Point{ int x; int y;原创 2017-04-08 18:53:24 · 5352 阅读 · 0 评论 -
Python 实现汉诺塔算法
# coding: utf-8def my_print(args): print args# 将n个盘子从a移动到c, 以b为中介def move(n, a, b, c): if n == 1: # 若只有一个盘子,直接从a移动到c my_print((a + '---->' + c)) else: # 若不止一原创 2017-09-14 15:04:50 · 525 阅读 · 0 评论