算法
文章平均质量分 63
吴正伟的博客
这个作者很懒,什么都没留下…
展开
-
每日算法之五:Longest Palindromic Substring
题目描述:Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.求解的是字符串中zuich原创 2014-04-30 20:24:43 · 697 阅读 · 0 评论 -
每日算法之四十:Insert Interval
这个跟之前的合并类似,最好也是逐一考虑即可,记录好newInterval即可,记得最后要插入一次,函数有两个出口,两个出口都要处理好修改后的newInterval。原创 2014-08-11 18:13:00 · 846 阅读 · 0 评论 -
每日算法之四十一:Spiral Matrix II (螺旋矩阵)
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.For example,Given n = 3,You should return the following matrix:[ [ 1, 2, 3 ], [ 8, 9, 4 ], [原创 2014-08-15 21:08:24 · 1093 阅读 · 0 评论 -
(每日算法)leetcode--Text Justification(格式化字符串)
给定一组字符串,按照给定长度(eg.16)格式化显示,使每一行尽可能多的单词,单词之间的空格均衡-最左侧可以稍多左右对齐。最后一行靠左对齐,即最右侧可以没有但系。Given an array of words and a length L, format the text such that each line has exactly L characters and is ful原创 2014-11-11 21:22:40 · 1009 阅读 · 0 评论 -
《剑指offer》 对应的 在线测试地址
《剑指Offer》面试题集收录汇总面试题1赋值运算符函数不适合在线模式面试题2实现Singleton模式不适合在线模式面试题3二维数组中的查找已收录面试题4替换空格已收录面试题5从头到尾打印链表已收录面试题6原创 2014-10-29 19:45:24 · 1253 阅读 · 0 评论 -
Kd-Tree算法原理和开源实现代码
本文介绍一种用于高维空间中的快速最近邻和近似最近邻查找技术——Kd-Tree(Kd树)。Kd-Tree,即K-dimensional tree,是一种高维索引树形数据结构,常用于在大规模的高维数据空间进行最近邻查找(Nearest Neighbor)和近似最近邻查找(Approximate Nearest Neighbor),例如图像检索和识别中的高维图像特征向量的K近邻查找与匹配。本文首先介原创 2014-10-22 10:54:37 · 2556 阅读 · 1 评论 -
希尔排序---shellsort
#include using namespace std;void shellSort(int a[], int n){ int i, j, gap; for(gap = n/2; gap > 0; gap /= 2)//间隔,逐次递减一半 { for(i = 0; i < gap; i++)//从49到76,逐步递增,也就是分组数。每次循环对一组数完成排序 { for(原创 2014-11-30 10:58:17 · 667 阅读 · 0 评论 -
面向对象编程的弊端是什么? 深入理解面向对象
现时C++可以说是支持OOP范式中最为常用及高性能的语言。虽然如此,在C++使用OOP的编程方式在一些场合未能提供最高性能。[1]详细描述了这个观点,我在此尝试简单说明。注意:其他支持OOP的语言通常都会有本答案中提及的问题,C++只是一个合适的说明例子。历史上,OOP大概是60年代出现,而C++诞生于70年代末。现在的硬件和当时的有很大差异,其中最大的问题是内存墙。内存墙,指的是原创 2015-02-02 11:57:14 · 1380 阅读 · 0 评论 -
(每日算法)LeetCode --- Reverse Linked List II(旋转链表的指定部分)
Reverse Linked List II(旋转链表的指定部分)LeetcodeReverse a linked list from position m to n. Do it in-place and in one-pass.For example:Given 1->2->3->4->5->NULL, m = 2 and n = 4,return 1->4->3->2原创 2015-01-16 09:53:49 · 843 阅读 · 0 评论 -
快速排序中的partition函数详解
快速排序的精髓就在partition函数的实现。我们构建两个指针,将数组分为三部分,黑色部分全部小于pivot,中间蓝色部分都大于pivot,后面红色部分未知。i指针遍历整个数组,只要它指向的元素小于pivot就交换两个指针指向的元素,然后递增。// arr[]为数组,start、end分别为数组第一个元素和最后一个元素的索引// povitIndex为数组中任意选中的数的索引 int part原创 2015-04-14 23:13:14 · 3008 阅读 · 0 评论 -
字符串全排列的递归实现
#include "stdafx.h"#include <iostream>#include <assert.h>using namespace std;void permutation(char *pStr, char* pBegin){ assert(pStr&&pBegin); if (*pBegin == '\0') cout << pStr << e原创 2015-06-10 15:52:23 · 763 阅读 · 0 评论 -
判断大小端序的C程序
概念大端格式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。 小端格式:与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。如5A6C中5A是高字节、6C是低字节,在大端序机器中,高字节位于低地址中,即在大端序中按照5A6C存储,在小端序中按照6C5A存储。为什么存在这种模式因为在计算机系统中,我们是以字节为单位的,每个地址单元都对原创 2015-06-10 17:18:26 · 920 阅读 · 0 评论 -
随机洗牌算法---我们一起谈谈
看到这个问题是在知乎上, 一个回答:实现一下#include <iostream>#include <vector>#include <string>#include <algorithm>using namespace std;const int RAND_MAXNUM = 100;int bigRand(){ return RAND_MAXNUM*rand() + rand(原创 2015-06-12 20:42:23 · 841 阅读 · 0 评论 -
快速排序-递归和非递归的实现
快速排序主要就是partition的操作。排序主体/* 递归的实现。A[] -->要排序的数组, s --> 开始位置, e --> 结束位置 */void quickSort(int arr[], int s, int e){ if (s < e) { int p = partition(arr, s, e); /* Partitioning index *原创 2015-07-06 17:40:53 · 989 阅读 · 0 评论 -
二分查找求解equal_range区间
总觉得二分查找很简单,可实现起来却发现一个小错误会导致程序结果出错,本题是解决眼高手低的利题。eaual_range返回的一对指针,指向第一个等于key值得元素和指向第一个大于该值的元素。因此,除了常规的非重复元素的二分查找(重复元素可能查找到任意一个值),还可以实现equal_range的方式考察。先看常规的二分查找int binsearch(int arr[], int left, int ri原创 2015-07-06 17:27:14 · 1108 阅读 · 0 评论 -
十大基础实用算法之深度优先搜索和广度优先搜索
深入讲解了深度优先和广度优先算法的实现,有详细的图解实例以及代码实现,清晰易懂。使用类的思想实现代码,面向对象分析。原创 2014-07-15 11:50:44 · 5231 阅读 · 0 评论 -
十大基础实用算法之寻找最小(最大)的k个数-线性查找算法
本文章用七种思路来查找无序数组中的前k个最小(最大)元素,复杂度随着问题的分析变得越来越低,思路也随着分析变得越来越的。贯穿讲解了快速排序和堆排序的应用,对这两种的排序在阅读本文后会有更深刻的理解。原创 2014-06-19 15:45:15 · 3780 阅读 · 0 评论 -
十大基础实用算法之归并排序和二分查找
归并排序归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。算法步骤:1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到原创 2014-06-18 10:24:24 · 2238 阅读 · 0 评论 -
每日算法之二:Median of Two Sorted Arrays
题目要求如下:There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).给出两个有序数组,求解数组合集中的中位数。求原创 2014-03-29 16:43:40 · 888 阅读 · 0 评论 -
每日算法之一:Two Sum
题目要求如下:Given an array of integers, find two numbers such that they add up to a specific target number.The function twoSum should return indices of the two numbers such that they add up to the原创 2014-03-29 15:20:10 · 890 阅读 · 0 评论 -
每日算法之七:Reverse Integer
Reverse digits of an integer.Example1: x = 123, return 321Example2: x = -123, return -321hen原创 2014-05-08 11:06:12 · 867 阅读 · 0 评论 -
KMP算法详解(图示+代码)
图解KMP算法过程,代码注释原创 2014-04-27 11:09:03 · 1435 阅读 · 0 评论 -
主宰全球的10大算法(有点夸张,但是有理)
什么是算法?简而言之,任何定义明确的计算步骤都可称为算法,接受一个或一组值为输入,输出一个或一组值。(来源:homas H. Cormen, Chales E. Leiserson 《算法导论第3版》)可以这样理解,算法是用来解决特定问题的一系列步骤(不仅计算机需要算法,我们在日常生活中也在使用算法)。算法必须具备如下3个重要特性: 有穷性,执行有限步骤后,原创 2014-06-03 20:37:33 · 1622 阅读 · 0 评论 -
程序员面试金典-数组和字符串
1.实现一个算法 确定一个字符串的所有字符是否全部不同。假设不允许使用额外的数据结构,又应该怎么做呢?2.实现void reverse(char * str)函数,实现一个NULL结尾的字符串反转。3.给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另外一个字符串。4.编写一个算法,把字符串中的空格全部替换为“%20”。假定该字符串尾部有足够的空间存放新增字符,并且知道字符出串的"真实"长度。5.利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串aa原创 2014-07-17 11:20:41 · 1023 阅读 · 0 评论 -
十大基础实用算法之迪杰斯特拉算法、最小生成树和搜索算法
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。 此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长原创 2014-07-16 19:36:12 · 1907 阅读 · 0 评论 -
排序算法-冒泡、插入、归并、希尔、快速、选择--代码总结
冒泡排序代码:#include #include using namespace std;templatevoid bubbleSort(ItemType theArray[], int n){ bool sorted = false; // False when swaps occur int pass = 1; while (!sorted && (pass原创 2014-07-21 09:40:14 · 933 阅读 · 0 评论 -
查找一:红黑树讲解
查找(一)我们使用符号表这个词来描述一张抽象的表格,我们会将信息(值)存储在其中,然后按照指定的键来搜索并获取这些信息。键和值的具体意义取决于不同的应用。符号表中可能会保存很多键和很多信息,因此实现一张高效的符号表也是一项很有挑战性的任务。我们会用三种经典的数据类型来实现高效的符号表:二叉查找数、红黑树、散列表。二分查找转载 2014-05-28 11:03:16 · 861 阅读 · 0 评论 -
查找二:B树、Tril树
查找(二) 散列表散列表是普通数组概念的推广。由于对普通数组可以直接寻址,使得能在O(1)时间内访问数组中的任意位置。在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标。使用散列的查找算法分为两步。第一步是用散列函数将被查找的键转化为数组的一个索引。我们需要面对两个或多个键都会散列到相同的索引值的情况。因此,第二步就是转载 2014-05-28 11:04:45 · 796 阅读 · 0 评论 -
排序一:快排、归并、优先队列等
排序(一)初级排序算法选择排序思想:首先,找到数组中最小的那个元素。其次,将它和数组的第一个元素交换位置。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。 【图例】图中,x轴方向为数组的索引,y轴方向为待排序元素的值。 选择排序有两个很鲜明的特点:转载 2014-05-28 10:56:22 · 973 阅读 · 0 评论 -
排序二:索引、桶排序、败者树
排序(二)以上排序算法都有一个性质:在排序的最终结果中,各元素的次序依赖于它们之间的比较。我们把这类排序算法称为比较排序。任何比较排序的时间复杂度的下界是nlgn。 以下排序算法是用运算而不是比较来确定排序顺序的。因此下界nlgn对它们是不适用的。 键索引计数法(计数排序)计数排序假设n个输入元素中的每一个转载 2014-05-28 10:58:37 · 767 阅读 · 0 评论 -
五大常用算法:分治、动态规划、贪心、回溯和分支界定
分治算法一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的原创 2014-06-03 11:23:27 · 13652 阅读 · 6 评论 -
十大基础实用算法之快速排序和堆排序
使用比较短的篇幅、详细的分析、伪代码、代码和动画详细介绍了快速排序和堆排序,并分析了算法思想和复杂度。值得一看原创 2014-06-17 16:27:01 · 2896 阅读 · 1 评论 -
最长公共子序列
一个字符串S,去掉零个或者多个元素所剩下的子串称为S的子序列。最长公共子序列就是寻找两个给定序列的子序列,该子序列在两个序列中以相同的顺序出现,但是不必要是连续的。例如序列X=ABCBDAB,Y=BDCABA。序列BCA是X和Y的一个公共子序列,但不是X和Y的最长公共子序列,子序列BCBA是X和Y的一个LCS,序列BDAB也是。寻找LCS的一种方法是枚举X所有的子序列,然后注意检查是否是Y的子序列,原创 2015-07-06 20:37:37 · 1121 阅读 · 1 评论