算法
ruoshui13
人生如梦~~~~
展开
-
字符转换为数字,以|分割
#include #include #define INT_MAX ((1<<31)-1)#define INT_MIN (1<<31)#define isRight(x) (x==' ' || x=='+' || x=='-' || (x>='0'&&x<='9'))int getNum(char* s, int begin, int end){ int原创 2015-03-06 18:41:40 · 837 阅读 · 0 评论 -
删除链表中重复的数
题目:给定一个排序的链表,将其中重复的数全部删除。比如:1-->1-->1-->2-->3,则返回2-->3 #include #include typedef struct ListNode{ ListNode* next; int val;};ListNode* rmDumplicateNums(ListNode* head)原创 2015-02-16 18:06:12 · 593 阅读 · 0 评论 -
寻找和为定值的多个数
1、首先看看简单的,寻找和为定值的2个数求解采用HASH方式就可以求解。具体参考这个文章:寻找和为定值的2个数2、那寻找和为定值的多个数怎么求解了 #include #include /*原题:输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来 修改之后改为原创 2015-01-21 07:56:11 · 2001 阅读 · 0 评论 -
把二元查找树转变成排序的双向链表
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。#include #include #include /*说明:本文参考http://blog.csdn.net/chdhust/article/details/8175480主要思想是递归思路*/typedef struct BiNode{ struct BiN原创 2014-12-21 18:20:08 · 399 阅读 · 0 评论 -
矩阵的转置
#include #include /*题目:将一个MxN的矩阵存储在一个一维数组中,编程实现矩阵的转置。详细说明参考:http://blog.csdn.net/lisonglisonglisong/article/details/28904665*//*求i前序, row为矩阵行数,col为矩阵列数转置后i在(i/row, i%row),则转置前为(i%row, i/row)对原创 2014-12-21 18:18:54 · 753 阅读 · 0 评论 -
求总和最小的路径
题目:给定m*n的矩阵,每个位置是一个非负整数,从左上角开始,每次只能朝右和下走,走到右下角,但只走一次,求总和最小的路径。 思路:因为只走一次,所以相对来说比较简单,dp[0, 0]=a[0, 0],且dp[x, y] = min(dp[x-1, y] + a[x, y],dp[x, y-1] + a[x, y])。#include #include #defin原创 2014-12-21 18:35:35 · 724 阅读 · 0 评论 -
最长递增子序列
题目描述给定一个长度为N的数组a0,a1,a2...,an-1,找出一个最长的单调递增子序列(注:递增的意思是对于任意的i思路一:采用DP思路,不过时间复杂度o(n^2)#include #include #include /*如果要求a[i]的最长递增子序列 需要遍历0-i之间,找到是否可以增加a[i] 其中rec[]数组记录0-i在任何一个原创 2014-12-21 18:22:24 · 434 阅读 · 0 评论 -
子序列个数
题目:子序列的定义:对于一个序列a=a[1],a[2],......a[n],则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列其中1 - 对于给出序列a,有些子序列可能是相同的,这里只算做1个。 - 要求输出a的不同子序列的数量。#include #include /*说明:参考http://blog.csdn.net/thebestd原创 2014-12-21 18:21:35 · 475 阅读 · 0 评论 -
求总和最小的路径
题目: 给定m*n的矩阵,每个位置是一个非负整数,从左上角开始,每次只能朝右和下走,走到右下角,但只走一次,求总和最小的路径。 思路: 因为只走一次,所以相对来说比较简单,dp[0, 0]=a[0, 0],且dp[x, y] = min(dp[x-1, y] + a[x, y],dp[x, y-1] + a[x, y])。 #include #include原创 2014-12-18 20:11:24 · 566 阅读 · 0 评论 -
出现次数超过一半的数
题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 #include #include /*找到数组中出现次数超过一半的一个数*/int findMaxTimesNum(int* a, int n){ int i; int tmp; int count = 0; int max = 0;原创 2014-12-18 20:22:02 · 514 阅读 · 0 评论 -
两两交换链表的结点
题目:例如链表为1-->2-->3-->4,则交换后为:2-->1-->4-->3 代码: #include #include typedef struct ListNode{ ListNode* next; int val;};ListNode* swapNodeInPair(ListNode* head){ /*思原创 2015-02-17 10:34:24 · 888 阅读 · 2 评论 -
数独题解
#include #include #define MAX_LEN 9int sudoku[MAX_LEN][MAX_LEN] ={ {5, 3, 0, 0, 7, 0, 0, 0, 0}, {6, 0, 0, 1, 9, 5, 0, 0, 0}, {0, 9, 8, 0, 0, 0, 0, 6, 0}, {8, 0, 0, 0, 6, 0, 0, 0, 3原创 2015-02-11 15:57:30 · 725 阅读 · 0 评论 -
大整数加减法
#include #include #include void swap(char* a, char* b){ char tmp = *a; *a = *b; *b = tmp;}void reverse(char* a, int low, int high){ while (low < high) {原创 2015-03-06 17:21:59 · 598 阅读 · 0 评论 -
格雷码与二进制之间的互换
#include #include /*格雷码转二进制*/int grayToBin(int n){ int size = 0; int res[255]; int out = 0; int flag = 0; /*先缓存*/ while (n) { res[size++] = n%2;原创 2015-02-16 10:36:13 · 997 阅读 · 0 评论 -
树的递归和非递归遍历
#include #include #include #include #include using namespace std;typedef struct BiNode{ struct BiNode* lNode; struct BiNode* rNode; int data;}*BiTree;void createTree(BiTree &T){原创 2015-02-25 09:53:58 · 523 阅读 · 0 评论 -
设计包含min函数的栈
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。 代码: #include #include #define MAX_LEN_STACK 10typedef struct{ int stackList[MAX_LEN_STACK]; int to原创 2015-02-12 16:51:37 · 618 阅读 · 0 评论 -
归并排序
#include #include /*将a[low--mid-1]和a[mid--high]合并,其中mid=(low+hihg)/2基本上网上都是传入一个额外数组,这里直接作为局部数组,不作为参数加入*/void mergeArray(int* a, int low, int high){ int tmp[255]; int i = low; int mid原创 2015-02-11 20:52:59 · 351 阅读 · 0 评论 -
找到链表的第K个数
#include #include typedef struct LinkNode{ struct LinkNode* next; int data;}LinkList;/*创建链表*/void createLinkList(LinkList* head, int* a, int n){ int i = 0; LinkNode* node = NULL原创 2015-01-24 08:27:34 · 1062 阅读 · 0 评论 -
判断链表是否成环,如果成环返回成环的第一个结点
#include #include typedef struct LinkNode{ struct LinkNode* next; int data;}LinkList;/*说明:都带头结点的单链表*//*创建链表*/void createLinkList(LinkList* head, int* a, int n){ int i = 0; Link原创 2015-01-24 08:26:22 · 2187 阅读 · 0 评论 -
重建二叉树
题目:如何根据二叉树的先序遍历和中序遍历结果还原二叉树?比如,先序遍历结果是{1,2,4,7,3,5,6,8},中序遍历结果是{4,7,2,1,5,3,8,6}; 参考:http://blog.csdn.net/chdjj/article/details/37961347代码:#include #include #include struct原创 2015-02-11 20:58:58 · 512 阅读 · 0 评论 -
判断两链表是否相交,如果相交找到第一个交点
#include #include typedef struct LinkNode{ struct LinkNode* next; int data;}LinkList;/*说明:都带头结点的单链表*//*创建链表*/void createLinkList(LinkList* head, int* a, int n){ int i = 0; Link原创 2015-01-24 08:25:24 · 760 阅读 · 0 评论 -
子序列个数
题目: 子序列的定义:对于一个序列a=a[1],a[2],......a[n],则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列其中1 - 对于给出序列a,有些子序列可能是相同的,这里只算做1个。 - 要求输出a的不同子序列的数量。 #include #include /*说明:参考http://blog.csdn.net/th原创 2014-12-18 20:12:43 · 496 阅读 · 0 评论 -
最大连续子数组和
题目描述:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值,要求时间复杂度为O(n)。例如输入的数组为`1, -2, 3, 10, -4, 7, 2, -5`,和最大的子数组为`3, 10, -4, 7, 2`,因此输出为该子数组的和18。 思路:采用贪婪法求解即可#in原创 2014-11-30 19:14:37 · 439 阅读 · 0 评论 -
奇偶调序
题目描述输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。思路:用两个游标,分别从左右靠齐即可。#include #include void swap(int *a, int *b){ int tmp = *a; *a = *b; *b = tmp;}/*将奇数放在前半原创 2014-11-30 19:12:20 · 468 阅读 · 0 评论 -
寻找最小的k个数
题目:输入n个整数,输出其中最小的k个。思路:采用堆排序即可 #include #include #include void swap(int *a, int *b){ int tmp = *a; *a = *b; *b = tmp;}//调整大顶堆void heapAdjust(int *a, int i, int len){ in原创 2014-11-23 19:20:04 · 411 阅读 · 0 评论 -
字符串包含
说明:转载请注明出处首先感谢各位大牛的想法和思路,参考了很多地方。题目:给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短。请问,如何最快地判断字符串B中所有字母是否都在字符串A里?为了简单起见,我们规定输入的字符串只包含大写英文字母,请实现函数bool StringContains(string &A, string &B)比如,如果是原创 2014-11-04 20:54:49 · 423 阅读 · 0 评论 -
回文判断
说明:转载请标明出处 题目: 回文,英文palindrome,指一个顺着读和反过来读都一样的字符串,比如madam、我爱我,这样的短句在智力性、趣味性和艺术性上都颇有特色,中国历史上还有很多有趣的回文诗。那么,我们的第一个问题就是:判断一个字串是否是回文? 思路一:从两头比较,时间复杂度O(n),空间复杂度O(1) #incl原创 2014-11-04 20:58:45 · 956 阅读 · 0 评论 -
旋转字符串
网上也有很多这样的源代码,也自己按照原创 2014-11-03 09:31:18 · 492 阅读 · 0 评论 -
链表翻转
题目:给出一个链表和一个数k,比如,链表为1→2→3→4→5→6,k=2,则翻转后2→1→6→5→4→3,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→6→5,用程序实现。原创 2014-11-03 13:58:46 · 544 阅读 · 0 评论 -
单词翻转
说明:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变,句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如,输入“I am a student.”,则输出“student. a am I”。 一种思路是翻转整个字符串然后对每个字符串翻转即可。#include #include /*将字符串从low到high翻转*/vo原创 2014-11-03 20:30:57 · 768 阅读 · 0 评论 -
第一个只出现一次的字符
tim在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。原创 2014-11-08 10:19:48 · 386 阅读 · 0 评论 -
字符串的全排列
说明:转载请注明出处 题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c 所能排列出来的所有字符串abc、acb、bac、bca、cab 和 cba。 思路一:递归求解#include #include #include /*说明:采用递归求解 如求"abc",则先固定a,交换原创 2014-11-07 19:41:02 · 424 阅读 · 0 评论 -
在O(1)时间内删除单链表结点
题目:给定单链表的一个结点的指针,同时该结点不是尾结点,此外没有指向其它任何结点的指针,请在O(1)时间内删除该结点。思路:分两种情况,原创 2014-11-09 11:54:00 · 500 阅读 · 0 评论 -
最大子矩阵和
题目:求一个M*N的矩阵的最大子矩阵和。比如在如下这个矩阵中: 0 -2 -7 0 9 2 -6 2-4 1 -4 1-1 8 0 -2 拥有最大和的子矩阵为: 9 2-4 1-1 8其和为15。 思路:二维转成一维,用一维的最大连续子序列求和即可。#include #include #include原创 2014-11-30 19:13:57 · 503 阅读 · 0 评论 -
寻找和为定值的两个数
题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(N)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。 思路:采用hash方式求解#include #include const int size =原创 2014-11-30 19:15:36 · 912 阅读 · 1 评论 -
KMP
KMP算法是通过分析模式字符串,预先计算每个位置发生不匹配的时候,所需GOTO的下一个比较位置,整理出来一个next数组,然后在上面的算法中使用。#include #include #include int next[255] = {0};void getnext(char* s, int n){ int j = -1; int i = 0; /*赋初值*/原创 2014-11-30 19:18:47 · 447 阅读 · 0 评论 -
判断一条单向链表是不是"回文"
题目: 判断一条单向链表是不是"回文" 思路一:采用快慢指针,慢指针入栈,当快指针为NULL时,出栈和慢指针比较即可。时间复杂度O(n),空间复杂度O(n)。优点:比较好实现,且没有修改链表缺点:需要分配内存 #include #include #include typedef int elem;typedef原创 2014-11-05 19:03:27 · 1548 阅读 · 0 评论 -
组合字符串
题目:假设有三个字符“abc”求这三个字符的说有组合? result:{a, b, c, ab, ac, bc, abc}思路:caiyon原创 2014-11-07 20:10:46 · 426 阅读 · 0 评论 -
最长回文子串
说明:转载请注明出处 题目:给定一个字符串,求它的最长回文子串的长度。 思路一:采用中间法比较/*说明:中心法求最长回文子串 时间复杂度为O(n^2)时间,空间复杂度O(1) 思路:如果一段字符串是回文,那么以某个字符为中心的前缀和后缀都是相同的 反之则肯定不是回文字符串,不过要注意区分奇偶*/#include #include #i原创 2014-11-08 10:28:47 · 413 阅读 · 0 评论 -
堆排序
/*说明:堆排序其实就是反复建堆的过程 先建一个大顶堆,找到最大值和最小值 然后从后往前添加到堆里面去,进行建推*/#include #include #include void swap(int *a, int *b){ int tmp; tmp = *a; *a = *b; *b = tmp;}//只调整i,将i到n调整为大顶堆voi原创 2014-11-30 19:22:00 · 424 阅读 · 0 评论