
数据结构与算法
zxc123e
这个作者很懒,什么都没留下…
展开
-
数组的循环右移
题目的大意是将一个长度为size的数组A内的元素循环右移n位(当然左移也可以),比如数组 {1, 2, 3, 4, 5}右移3位之后就变成{3, 4, 5, 1, 2}。 1. 这题最简单的做法是开另一个大小一样的数组B,遍历一下,令B[(i+n) % size] = A[i],再将B的内容写回到A即可。这个方法的时间复杂度为O(N),空间复杂度也为O(N)。public int[] moveDa原创 2015-06-06 20:49:05 · 2709 阅读 · 0 评论 -
【leetcode】Longest Substring Without Repeating Characters
【题目】 Given a string, find the length of the longest substring without repeating characters.Examples:Given “abcabcbb”, the answer is “abc”, which the length is 3.Given “bbbbb”, the answer is “b”, with原创 2016-10-17 15:47:38 · 506 阅读 · 0 评论 -
【LeetCode】Add Two Numbers
【题目】 You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a原创 2016-07-21 17:35:44 · 579 阅读 · 0 评论 -
哈希表与一致性哈希算法
哈希表算法这里补下课本知识。哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希表的做法其实很简单,就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作原创 2016-06-25 16:59:19 · 4104 阅读 · 0 评论 -
Manacher算法、KMP算法
一、Manancher算法Manacher算法用于查找子串中的回文,算法维持的三个变量十分重要pArr(下标所在位置字符回文长度)、index(回文中心)、pR(回文半径),这种算法比其他算法效率高的原因在于,它可以利用前面已计算过的回文来判断是否需要计算回文。算法在字符串每个字符之间已经开始和末尾都插入特殊字符(可以是任意字符包括所查字符串中字符),在计算回文时就不用区分奇回文和偶回文。 算法代码原创 2015-12-18 17:19:17 · 4992 阅读 · 0 评论 -
畅通工程(并查集)
【题目】某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? 【解答】并查集基本算法。定义数组parent,每个城市可以用数组下标指示,parent[index]的值代表与index联通的城市。代码: int[] p原创 2015-10-10 16:55:25 · 841 阅读 · 0 评论 -
白话几种排序算法
选择排序 O(n^2)冒泡排序 O(n^2)插入排序 O(n^2)快速排序O(n*logN)1、选择排序的算法是,选择数组前面的元素(未排好序的元素)与后面依次比较,找到最小的与之交换位置。void sort(T a[],int n){ for(int原创 2011-10-11 21:50:47 · 763 阅读 · 0 评论 -
获取数组中子串乘积的最大值
【题目】给定一个数组,例如arr = {-2.5, 4, 2, 3, 0, 8, 4}; 那个8和4相乘得到32,是连续数相乘得到的最大值,得到该值即可。 【解答】注意此过程的三种情况即可,最大数成为最大,最小数变成最大,当前数最大。时间复杂度O(n)。 public static double getMax(double[] attr) { if(arr == nul原创 2015-09-21 17:17:11 · 2127 阅读 · 0 评论 -
窗口最大值数组
【题目】给出一个整形数组,例如arr = {5,4,3,5,6,7,6},窗口大小为w=3,窗口每次向右移动一位,输出每个窗口中最大值组成的数组。 [5,4,3,]5,6,7,6 窗口最大值为5 5,[4,3,5,]6,7,6 窗口最大值为5 5,4,[3,5,6,]7,6 窗口最大值为6 5,4,3,[5,6,7,]6 窗口最大值为7 5,4,3,5,[6,7,6] 窗口最大值为7原创 2015-09-21 17:01:14 · 1453 阅读 · 0 评论 -
求数组中未出现的最小正整数
【题目】: 给定一个无序整型数组arr,找到数组中未出现的最小正整数。要求时间复杂度为O(N),空间复杂度为O(1)。例如:arr=[-1,2,3,4]。返回1。arr=[1,2,3,4]。返回5。【解法】 一、穷举查找 最小正整数是1,所以常规的方法就是在数组中找1,然后是2,依次找下去…。一直找到第一个没有出现的正整数,这个数就是未出现的最小的正整数。原创 2015-10-23 16:59:19 · 15656 阅读 · 0 评论 -
字典树
字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。原创 2015-10-19 17:32:45 · 1105 阅读 · 0 评论 -
获取栈中任意位置的元素
递归获取栈中指定位置的元素,不破坏栈的结构public int getElement(Stack<Integer> stack, int position) { int result = stack.pop(); if (stack.size() == position) {// stack.push(result);原创 2015-09-21 17:28:24 · 5596 阅读 · 0 评论 -
二进制中1的个数
【题目】输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。代码: public int NumberOf1(int n) { int count = 0; while(n!= 0){ count++; n = n & (n - 1); } return count;原创 2015-10-09 15:01:34 · 589 阅读 · 0 评论 -
洗牌算法
经典洗牌算法void Shuffle(int[] array) { int value; int length = array.length; Random random = new Random(); for(int i= 0; i < length; i++) { value = r原创 2015-11-06 15:49:56 · 913 阅读 · 0 评论 -
正方形矩阵旋转90度
将矩阵顺时针旋转90度 方法一:public static void rotate(int a[][],int N) { int layer; for(layer=0; layer<N/2; layer++) { int last = N-1-layer; for(int i=layer; i<原创 2015-09-29 11:34:59 · 3176 阅读 · 0 评论 -
随机数扩充
1)题目 给定一个等概率随机产生1~5的随机函数rand1To5如下: public int rand1To5() { return (int) (Math.random() * 5) + 1; } 除此之外不能使用任何额外的随机机制,请用rand1To5实现等概率随机产生1~7的随机函数rand1To7。 Random random = new Random();原创 2015-08-20 11:19:25 · 876 阅读 · 0 评论 -
树
树的实现:将每个节点的所有儿子都放在树节点的链表中.下面是典型的声明 typedef struct TreeNode *PtrToNode; struct TreeNode { ElementType Element; PtrToNode FirstChild; PtrToNode nextSibling; } 图中向下的箭头是指向FirstChild原创 2015-08-15 22:14:37 · 741 阅读 · 0 评论 -
栈在表达式求值中的应用
首先我们使用java来实现栈ADT,这里不使用java提供的Stack类, 而是使用ArrayList来实现,具体看代码:public class MyStack { public ArrayList<String> stack = new ArrayList<String>(); public String pop() { int index = stack.原创 2015-08-13 17:54:53 · 1564 阅读 · 0 评论 -
最大连续子数列和(在线处理算法)
问题描述最大连续子数列和一道很经典的算法问题,给定一个数列,其中可能有正数也可能有负数,我们的任务是找出其中连续的一个子数列(不允许空序列),使它们的和尽可能大。我们一起用多种方式,逐步优化解决这个问题。暴力方法求出所有可能连续子列的和,时间复杂度O(N^3)int MaxSubSequm1(int A[], int N){ int ThisSum, MaxSum...原创 2018-03-24 16:52:02 · 7010 阅读 · 14 评论