程序算法
呼噜娃娃
生活没有偶然
展开
-
每天一个算法之指数运算
package ff;//最烂的方法是一个for循环解决,每次都乘以底数。这种谁都能想出来的方法可以忽略。public class power {public static void main(String args[]){System.out.println(pow2(2,8));}//这个是比较好的方法。使用到了分治递归,考虑到偶数和奇数的情况。指数是偶数时是半*半原创 2016-10-21 20:35:35 · 991 阅读 · 0 评论 -
每天一个算法之寻找第一个只出现一次的数
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key 对应一个存储位置f (key)。查找时,根据这个确定的对应关系找到给定值key 的映射f (key) ,若查找集合中存在这个记录,则必定在f (key) 的位置上。这里我们把这种对应关系f 称为散列函数, 又称为哈希(Hash) 函数。按这个思想,采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间原创 2016-10-18 19:41:32 · 972 阅读 · 0 评论 -
每天一个算法之fibonacci递归法优化
public class fibonacci { publicstatic void main(String args[]){ longt1=System.nanoTime(); longn1=recursion(40); longt2=System.nanoTime原创 2016-10-19 22:38:52 · 628 阅读 · 0 评论 -
每天一个算法之树镜像
import java.util.Scanner;class BinaryTree{int data;BinaryTree left;BinaryTree right;}public class mirror {static Scanner sc=new Scanner(System.in);public static void main(S原创 2016-10-29 10:48:48 · 182 阅读 · 0 评论 -
每天一个算法之子树匹配
package ff;import java.util.Scanner;class BinaryTree{int data;BinaryTree left;BinaryTree right;}public class isSubTree {static Scanner sc=new Scanner(System.in);public static原创 2016-10-28 10:54:40 · 1340 阅读 · 0 评论 -
每天一个算法之移位运算
public class bitwise {public static void main(String args[]){//System.out.println(bitmove0(-9));System.out.println(bitmove0(9));}/** 正数的左移会到0,负数的左移只能让1越来越多。这是因为左移对应数的减小,负数会越减越小,不可能等于0*/原创 2016-10-20 18:59:34 · 497 阅读 · 0 评论 -
每天一个算法之顺时针打印矩阵
public class printMatrix { public static void main(String args[]){ int[][] matrix={{1,2,3,4},{12,13,14,5},{11,16,15,6},{10,9,8,7}}; int[][] matrix2={{1,2,3,4}}; int[][] matrix3={{1},{2},{3},{4}原创 2016-10-31 10:47:36 · 215 阅读 · 0 评论 -
每天一个算法之包含min函数的栈
解决思路:通过利用两个栈,一个是实际的栈,一个是用来记录压入的最小记录,最小值放在栈顶,最小记录栈要与实际栈同时push和top,push时足最小记录栈的栈顶小于压入数据时压入栈顶的重复数据,否则压入新数据。import java.util.Stack;public class minStack { public static void main(String args[]){ minS原创 2016-11-01 10:17:43 · 217 阅读 · 0 评论 -
数据结构—递归小结
为什么数学归纳法能构成一个证明。 对于N=1,改定理成立,这称为基本情况。 使用归纳假设,假设对于任意K,定理成立,如果k成立,那么k+1也会成立。 这里针对一个例子来说一下数学归纳法的使用 对于求前N项的和,S(N)=S(N-1)+N的递归形式: public static long s(int n){ if(n==1)return 1;//基本情况原创 2017-10-30 20:03:05 · 737 阅读 · 0 评论 -
数据结构—分治法小结
分治由两部分组成。分:递归地求解更小的问题。治:子问题的解决方案形成了原问题的解决方案。原则上,至少包含两个递归调用的算法才是分治法。子问题之间通常是不相交的。因此FIB数列不属于分治法。最大连续子序列。最大连续子序列采用分治法思考,将输入一分为2,存在三种情况1完全在左边2完全在右边3一部分在左边,一部分在右边针对情况三我们考虑使用两个for循环分别寻原创 2017-10-31 14:36:07 · 929 阅读 · 0 评论 -
数据结构-动态规划之找零钱
美元的硬币面值为1美分、5美分、10美分和25美分。找零钱数为63美分,最少的方案时2个25,1个10,3个1一用6枚硬币。可以使用贪婪法来找硬币,但是事实并非总是如此。例如,如果硬币面值多了一个21的,很明显最少的方案是3个21美分的,而不是6个硬币,但,贪婪法无法解决此类问题。即贪婪法只能保证局部最优,不能保证全局最优。考虑第一种方法,使用递归,计算所有可能组合的最小数目。首先原创 2017-10-31 19:27:56 · 493 阅读 · 0 评论 -
数据结构—算法时间复杂度
常用公式和两类主定理,对与计算时间复杂度很方便。转载 2017-11-09 11:08:18 · 515 阅读 · 0 评论 -
数据结构—链表的操作小结
总结一下链表的相关操作1判断是否有环 2找到环的交界 3返回环的长度 4两个链表的公共节点 5链表逆置 6带有random指针的链表复制import java.util.HashMap;import java.util.Map;/** * Created by root on 17-11-9. */class Node{ int val;原创 2017-11-09 16:14:18 · 397 阅读 · 0 评论 -
数据结构—基本树的操作小结
整理几个树的算法。1树的复制:每次递归创建一个节点,此节点的左右孩子递归创建。public static Tree duplicate(Tree root){ Tree newRoot = new Tree(root.val); if (root.left!=null) newRoot.left=duplicate(root.left); if原创 2017-11-01 21:33:54 · 437 阅读 · 0 评论 -
数据结构—栈小结
1数组栈2动态数组栈动态数组栈有两种实现方法,一种是每次扩充1位并进行复制,插入n个元素的时间复杂度位O(n^2)--1+2+...+n一种是每次扩充2倍并进行复制,插入n个元素的时间复杂度为0(n)...1+2+4+8...+n,此处使用这种最优化的方案。3链表栈4最小栈的优化版5栈的逆置(只用push和top)6数组跨度7数组跨度28栈排序9数组最大面积原创 2017-11-10 15:19:56 · 581 阅读 · 0 评论 -
数据结构—队列小结
队列1动态数组队列2链表队列3两栈实现队列4两队列实现栈5前k个元素逆置import java.util.Arrays;import java.util.LinkedList;import java.util.Queue;import java.util.Stack;/** * Created by root on 17-11-12. */public原创 2017-11-12 13:30:46 · 438 阅读 · 0 评论 -
数据结构—cloneable&&二叉树
1介绍cloneable接口,并引申与它相关的知识点:2二叉树相关知识点:一、cloneable接口首先强调一个问题,cloneable接口时空的,clone方法不是cloneable的方法!!!clone时object的方法,方法原型为protected object clone () throws CloneNotSupportException这里有两个细节,一 返回值是原创 2017-11-02 20:36:33 · 183 阅读 · 0 评论 -
数据结构-堆小结
总结堆的几种操作:删除操作(调整堆),添加堆调整堆:例如在进行删除操作的时候,我们将根结点与最后一个节点进行替换,替换以后,删除掉最后一个节点或在将lastSize(记录数组大小的指针)前移。int void reshape(int[] heap,int root){ boolean done=false;//判断orphan是否大于largeChild,用来跳出循环原创 2017-11-04 16:54:03 · 300 阅读 · 0 评论 -
计数排序以及计数排序的一种优化
public class countSort { public static void CountingSort(int A[], intB[], int len, int k){ int CountArr[] = new int[k]; int i; for (i = 0; i原创 2016-10-18 20:49:09 · 379 阅读 · 0 评论 -
每天一个算法之两栈实现队列
实现原理:栈是先进后出,队列是先进先出。两个栈,一个先进后出的数据先放到另一个栈,再弹出就符合先进先出。public class stacktoque {public static void main(String args[]){int[] arr=new int[]{1,3,2,4,6,7};Que q=new Que(arr);q.put();q.put(原创 2016-10-17 22:12:07 · 178 阅读 · 0 评论 -
每天一个算法之打印1到n位数(用数组实现)
package ff;public class maxn {public static void main(String args[]){printMax(3);}public static void printMax(int n){if(nint[] str=new int[n];//初始化为0for (int i = 0; i str[i]=0;原创 2016-10-21 20:21:27 · 261 阅读 · 0 评论 -
每天一个算法之判断栈的压入弹出序列
import java.util.Stack;public class stackOrder {public static void main(String args[]){int[] a1={1,2,3,4,5};int[] a2={4,3,5,1,2};System.out.println(istrue(a1,a2));}public static bool原创 2016-11-04 10:20:06 · 231 阅读 · 0 评论 -
每天一个算法之层序遍历二叉树
import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;public class printTree {static Scanner sc=new Scanner(System.in);static Queue queue=new LinkedList();public stat原创 2016-11-04 10:40:25 · 289 阅读 · 0 评论 -
每天一个算法之是否为后续遍历序列
import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;public class backPrint { static Scanner sc=new Scanner(System.in); static Queue queue=new LinkedList(); public sta原创 2016-11-04 14:46:25 · 178 阅读 · 0 评论 -
每天一个算法之链表中倒数第K个结点
算法思想:设置头尾指针,尾指针先移动到底n个位置,然后头尾一起移动,尾指针移动到最后时,头指针的位置就是倒数第n个位置。 class listnode{ int data; listnode next;}public class reorderoddeven { public static void main(String args[]){ int[] n={1,3,5,7,9,11原创 2016-10-24 20:27:50 · 159 阅读 · 0 评论 -
每天一个算法之二叉树中某一值的路径
import java.util.LinkedList;import java.util.List;import java.util.Queue;import java.util.Scanner;public class findpath { static Scanner sc=new Scanner(System.in); static List list=new LinkedLi原创 2016-11-05 11:22:52 · 246 阅读 · 0 评论 -
查找算法总结之静态查找算法
一、静态查找1.无序查找:数组存储的元素是无序的。顺序查找算法:从所有元素按下标比较一遍,通过下标返回查找的结果。 publicstatic int Sequential_Search(int[] a,int k){ int i; for(i=0;i原创 2016-10-24 21:31:57 · 1879 阅读 · 0 评论 -
每天一个算法之奇偶异侧
算法思想:设置头尾指针,如果头指针指向的数不是偶数,则头指针后移,尾指针指向的数不是奇数,尾指针前移,然后交换位置。重复此过程知道头指针的位置大于等于尾指针public class reorderoddeven { public static void main(String args[]){ int[] a={1,2,3,4,5,6,7,8,9}; reorder(a); fo原创 2016-10-24 20:42:52 · 182 阅读 · 0 评论 -
每天一个算法之树变双向列表
package tree;import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;public class treeToList { static Scanner sc=new Scanner(System.in); static Queue queue=new LinkedList()原创 2016-11-06 12:50:48 · 277 阅读 · 0 评论 -
每天一个算法练习之字符空格替换
题目示例:把字符串中的每个空格替换成“%20”。例如输入“who are you",则输出”who%20are%20you"/** * @author Administrator * 首先,我们明确需要得到一个时间复杂度在o(n)的算法。 * 添加后的字符串的长度为为原长度+空格的个数*2 * 思路,我们定义两个尾指针,指向老字符串和新字符串的末尾。 * */pub原创 2016-10-14 15:07:39 · 206 阅读 · 0 评论 -
每天一个算法之二维数组查找整数
/* * 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 * 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 * * 思路:每一行,下面的比上面的大,每一列右边的比左边的大。 * 从左下角开始,如果目标比开始位置的数小,则行坐标上移-1,如果比开始的位置大,列坐标右移+1 * * 如果是转载 2016-10-16 12:50:28 · 235 阅读 · 0 评论 -
每天一个算法之根据前序中序序列重建二叉树
/* * 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 * 例如输入前序遍历序列{a,b,d,c,e,f}和中序遍历序列{d,b,a,e,c,f},则重建二叉树并返回。 * 思路:根据题目给出的前序遍历、后序遍历数组,首先找出根节点 * 然后再根据中序遍历找到左子树和右子树的长度,分别构造出左右子树的前序遍历转载 2016-10-16 12:08:50 · 198 阅读 · 0 评论 -
线性非线性时间复杂度的9个排序算法整理
一、线性排序算法线性时间排序的时间复杂度可以看多是o(n),线性排序的代价往往是使用的额外空间大于n,是以时间换空间算法的典型。计数排序假设:有n个数的集合,而且n个数的范围都在0~k(k = O(n))之间。运行时间:Θ(n+k)待排序数组A如图2.1所示,需要辅助数组B(存储最后排序结果),数组C(存储元素的个数)。基于上述的假设,数组C的大小为k,C[i]表示数组A中原创 2016-10-16 23:23:39 · 2989 阅读 · 0 评论 -
每天一个算法之字符数组全排列
public class allSequence { public static void main(String args[]){ char[] array = new char[] { 'a', 'b', 'c' }; Permutation(array); } public static void Permutation(char[] pstr){ if(p原创 2016-11-08 10:11:28 · 213 阅读 · 0 评论 -
每天一个算法之字符串子序列
import java.util.*; class allSubSequence { public static void main (String[] args) throws java.lang.Exception { traversalSubstrings("123"); } publ原创 2016-11-08 15:16:21 · 609 阅读 · 0 评论 -
每天一个算法之合并有序链表
class listnode{int data;listnode next;}public class reorderoddeven {public static void main(String args[]){int[] a={1,3,5,7,9};int[] b={2,4,6,8,10};listnode list1=CreateList(a);listn原创 2016-10-26 09:59:26 · 206 阅读 · 0 评论 -
每天一个算法之链表逆序
需要4个指针,当前节点,前一个节点,后一个节点和尾节点(新头),当前节点不断后移,不断把next执行前一个class listnode{int data;listnode next;}public class reverse {public static void main(String args[]){int[] n={1,3,5,7,9,11,13,15,17}原创 2016-10-25 18:49:40 · 184 阅读 · 0 评论 -
数据结构—AVL树
AVL树----平衡二叉树平衡二叉树是一颗二叉树,而且平衡二叉树的左右子树的高度差小于等于1;平衡二叉树最关键的点在于插入操作。插入操作在不平衡的时候要进行【右旋,左旋,右左旋,左右旋等】右旋的条件为,AVL树插入新节点到某个节点的左孩子的左子树。左旋的条件为,AVL树插入新节点到某个节点的右孩子的有子树右左旋的条件为,AVL树插入新节点到某个节点的右孩子的左孩子处左右原创 2017-11-05 15:24:42 · 392 阅读 · 0 评论