
算法
littlestream9527
Hew out of the mountain of despair a stone of hope!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
求最近点对
求最近点对 就我所知道的 有三种算法,一是算法导论上给出的,用分治思想,时间复杂度为O(n log(n)),详细可见算法导论第二种是网上给出的 随机算法 时间复杂度为O(n ),原文如下:对于给定的平面上的n个点(xi,yi)( i=1,2,…,n)和一个距离d,以d为尺寸可以构造一个(逻辑上的)网格,该网格以(min{xi},min{yj})为网格的最左下点,之后以步长原创 2011-11-19 10:57:15 · 843 阅读 · 0 评论 -
寻找第k小元素
//本算法时间复杂度 O(n)#include//#include//getch()头文件 #include#include#includeusing namespace std;//选取n个中最大的k个元素,用”五分化中项的中项“(快速排序的划分方法)方法,先找第k大的元素 /* The SELECT algorithm determines theith sma原创 2011-11-05 11:26:38 · 2530 阅读 · 0 评论 -
improved mergesort
//两种方式改进归并,一是不递归;二是用两个数组,减少了重复赋值#include #include #include #include #include using namespace std;LARGE_INTEGER BegainTime ; LARGE_INTEGER EndTime ; LARGE_INTEGER Frequency ;原创 2011-11-05 10:51:54 · 432 阅读 · 0 评论 -
两个有序数组找第n个数
问题描述:Give a divide and conquer algorithm for the following problem:you are given two sorted lists of size m and n, and are allowedunit time access to the ith element of each list. Give an O(lg m转载 2011-11-14 22:02:32 · 1172 阅读 · 0 评论 -
prime and kluskal
//本算法未采用生成树,只用输出表示找到了,prime 与kluskal 对于同一个没有相同相同权值图应该一样,即使不一样所有最小生成树权值和应该一样#include #include#includeusing namespace std;#define random(x) (rand()%x) #define VertexType char#define MaxVer原创 2011-11-05 10:43:53 · 478 阅读 · 0 评论 -
自己的红黑树-献给老杨
#include#includeusing namespace std;typedef int KEY;#define N 10enum NODECOLOR{ BLACK = 0, RED = 1};typedef struct RBTree{ struct RBTree *parent原创 2011-10-31 15:16:47 · 534 阅读 · 0 评论 -
红黑树
依次插入如下序列,最后再依次删除如下序列,图片为自动生成。12 1 9 2 0 11 7 19 4 15 18 5 14 13 10 16 6 3 8 17 删除过程转载 2011-10-25 21:44:36 · 447 阅读 · 0 评论 -
快速排序,归并排序,堆排序,基数排序,插入排序,希尔排序,
#include "stdafx.h"// 排序.cpp : 定义控制台应用程序的入口点。#include#include#include//#include#includeusing namespace std;LARGE_INTEGER BegainTime ; LARGE_INTEGER EndTime ; LARGE_INTEGER Frequency原创 2012-09-09 16:28:37 · 674 阅读 · 0 评论 -
改进的归并排序算法
*#include #include using namespace std; #define N 120double arra[N]={0};double arrb[N]={0};void rand_data(){ for(int i=0;i<N;i++) arra[i]=rand()%1000;}void Merge(double *arra, double *arr原创 2012-09-09 16:30:40 · 866 阅读 · 2 评论 -
动态规划 01背包
http://wenku.baidu.com/view/7d0ebd8ccc22bcd126ff0ce2.html// 最优二叉查找树.cpp : 定义控制台应用程序的入口点。// 01背包问题。#include "stdafx.h"#include #include #define N 3// the number of real node#define M 10原创 2012-09-09 21:50:58 · 500 阅读 · 0 评论 -
判断单链表是否存在环,判断两个链表是否相交问题详解
源http://www.cppblog.com/humanchao/archive/2008/04/17/47357.html有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。问题:1、如何判断一个链表是不是这类链表?2、如果链表为存在环,如何找到环的入口点?解答:一、判断链表是否存在环,转载 2012-09-12 19:02:12 · 375 阅读 · 0 评论 -
用一个临时变量实现单链表逆序
源 http://blog.youkuaiyun.com/nevasun/article/details/7701942通常实现某种算法有两种常用的思想:循环和递归,这两种方式都需要占用一定的空间,但是循环使用的是某一个栈帧的空间,而递归则会使运行时函数调用不断压栈导致栈帧数量的增加。我在之前的动态规划算法学习中提到的爬楼梯问题所采用的两种方式可以很好地解释这两种思想。在《编程之美》3.4转载 2012-09-12 20:16:32 · 646 阅读 · 0 评论 -
c++ 代码规范
http://tctop.wikispaces.com/Google%E4%BB%A3%E7%A0%81%E9%A3%8E%E6%A0%BC%E6%8C%87%E5%8D%97%E6%95%B4%E7%90%86写代码时必须注重代码规范。养成良好的程序风格有助于提高代码的可维护性与可阅读性。 Google推出了自己的《Google C++ 风格指南》,在这份指南中各种C++编程中遇转载 2012-10-26 21:56:45 · 571 阅读 · 0 评论 -
海量数据处理:十道面试题与十个海量数据处理方法总结
http://blog.youkuaiyun.com/v_JULY_v/article/details/6279498 海量数据处理:十道面试题与十个海量数据处理方法总结作者:July、youwang、yanxionglu。时间:二零一一年三月二十六日本文之总结:教你如何迅速秒杀掉:99%的海量数据处理面试题。有任何问题,欢迎随时交流、指正。出处:http://blog转载 2012-10-26 22:05:53 · 522 阅读 · 0 评论 -
异或 算法 小总结
这是一篇哥自己动手写的小总结,旨在总结一下抑或运算在算法中的应用,会不断地完善,若读者有新的想法欢迎提出讨论。特征一:任何数自己和自己异或(XOR)后等于0特征二:任何数和0抑或后等于本身。利用点一 :不占用额外的空间交换两个数 a,b这道题我第一次想出来是用 a来存储a,b的差值,然后再分别计算a,b(可能会溢出)。用抑或效率是高了不少,本来抑或运算就比加减运算快。1,原创 2012-09-22 21:55:29 · 1357 阅读 · 1 评论 -
最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
http://www.cnblogs.com/zhangchaoyang/articles/2012070.html最大子序列最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。你已经看出来了,找最大子序列的方法很简单转载 2013-04-22 22:10:11 · 692 阅读 · 0 评论 -
最长公共子串
// 最长公共子串.cpp : 定义控制台应用程序的入口点。///*用动态规划求解最长公共子串,建立01的二维矩阵表示子串是否相似,找相邻斜对角线的最大长度,每次找下一行的时候更新二维数组,并且令当前值为其上一行斜对角线的值加一。由于二维矩阵不断的每行每行的更新,所以可以用一维数组代替。用变量保存已经求得的最大的子串长度,和最后一个子串出现的位置。此方法的时间复杂度为O(m*n),m,n分原创 2013-04-23 21:07:43 · 681 阅读 · 0 评论 -
归并排序求逆序数
// nixushu.cpp : 定义控制台应用程序的入口点。////求数列的逆序数,在归并排序过程中,寻找逆序数,时间复杂度为归并排序的复杂度,O(NlogN),空间复杂度也是归并的复杂度 此方法的空间复杂度是 2 * O(N),另外两种方法一是在递归函数内部用临时变量,另一个是和这种方法相似,不过是从a到b,再从b到a //#include //放在这居然编译通不过,怪了!#inclu原创 2013-05-02 22:22:06 · 674 阅读 · 0 评论 -
最小括号匹配算法(2013小米笔试)
http://ff781778304.blog.163.com/blog/static/1912910332012134340398/二维数组参数传递// 2013小米笔试之最小括号匹配.cpp : 定义控制台应用程序的入口点。///* 动态规划思想:dp[i][j]表示第i到j的需要的最少括号数 在计算dp[i][j]时,若已知dp[i][j-1],此时dp[i][j]有两种可能:原创 2012-09-26 22:10:56 · 1589 阅读 · 2 评论 -
动态规划笔试题
http://www.cnblogs.com/luxiaoxun/archive/2012/11/15/2771605.html1、最长公共子序列、最长公共子串最长公共子序列(Longest-Common-Subsequence,LCS)dp[i][j]:dp[i][j]表示长度分别为i和j的序列X和序列Y构成的LCS的长度dp[i][j] = 0,如果i=0 或转载 2013-05-13 20:39:41 · 1273 阅读 · 0 评论 -
求数对之差的最大值
// 求数对之差的最大值.cpp : 定义控制台应用程序的入口点。///*直接算时间复杂度为O(n*n),分治算法时间复杂度为O(n*log(n)),此方法直接求解,时间复杂度为O(n),空间复杂度为1思想:ofront表示第i次更新前的最大值,oback表示第i次更新前的最小值。nfront表示第i次更新后的最大值,nback表示第i次更新后的最小值。ofront-oback表示原来球原创 2013-05-08 19:52:37 · 763 阅读 · 0 评论 -
零钱找零问题 总结 (最少的硬币数 ,所有组合数)
// 零钱找零问题.cpp : 定义控制台应用程序的入口点。///*动态规划思路:dp[i][j]表示找零钱为i,从第1个硬币到第j个硬币选出最小的数量。money 为要找的钱数;coins数组存放每个硬币的面值,数量无限。递推公式为:dp[i][j] = min{ dp[i-k*coins[j]][j-1]+k ;} 和,dp[i][j] 的最小者。 k为第j次选择面值为coins[j原创 2013-05-10 19:56:35 · 5276 阅读 · 0 评论 -
编程之美1.11之 石头游戏
http://hi.baidu.com/zealot886/item/94e9630ae4ea7c8c3d42e271NIM(1) 一排石头的游戏 N块石头排成一行,每块石头有各自固定的位置,两个玩家一次取石头每个玩家每次可以取其中任意一块石头,或者相邻的两块石头,石头在游戏过程中不能移位(即编号不会改变),最后能将剩下的石头一次取光的玩家获胜.如果是你先取,这转载 2013-06-09 22:07:38 · 2563 阅读 · 3 评论 -
编程之美 取石子游戏 续
http://hi.baidu.com/mcgrady32303/item/eded0cfac2656a713d198b37取石子问题有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。(一)巴转载 2013-06-10 22:23:15 · 1392 阅读 · 0 评论 -
2013.6.23 阿里实习面试 悲惨结局
第一次面试,死的好惨/*int Finonacci_my(int n)//这就是我第一次面试写的程序,再一看我就知道哪错了,当时不知道怎么想的{ int a[n+1];//1 数组的的大小是常量,犯了这么简单的错误 a[0] = 0;// 2 根本没考虑输入的范围,也是基本常识呀 a[1] = 1;// 3 还有更高校的方法,为什么不用呢? for (int i = 2; i<=原创 2013-06-23 16:30:11 · 1508 阅读 · 0 评论 -
Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串
http://www.felix021.com/blog/read.php?2040首先用一个非常巧妙的方式,将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一个特殊的符号。比如 abba 变成 #a#b#b#a#, aba变成 #a#b#a#。 为了进一步减少编码的复杂度,可以在字符串的开始加入另一个特殊字符,这样就不用特殊处理越界问题,比如$#转载 2013-10-01 21:19:53 · 952 阅读 · 0 评论 -
整数的拆分问题
// 整数的拆分.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include using namespace std;int q(int n , int m){ if(n < 1 || m < 1) return 0; if(n == 1 || m == 1) return 1; if(n < m) re转载 2013-10-03 17:03:21 · 955 阅读 · 0 评论 -
数组分段和最大值最小问题
http://www.cnblogs.com/ZJUKasuosuo/archive/2012/08/16/2641892.htmlhttp://leetcode.com/2011/04/the-painters-partition-problem.htmlhttp://leetcode.com/2011/04/the-painters-partition-problem-part-i转载 2013-10-02 22:37:58 · 3454 阅读 · 0 评论 -
LeetCode Container With Most Water
笨!笨!笨!int maxArea(vector &height) { int n=height.size(); int sum=0; for (int i=1;i<=n;i++) { for (int j=i+1;j<=n;j++) { if ((j-i)*min(height[i-1],height[j-1])>sum) { sum = (j-i)*mi原创 2013-12-06 21:41:14 · 610 阅读 · 0 评论 -
LeetCode Add Two Numbers
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) { if (l1==NULL) { return l2; } if (l2==NULL) { return l1; } ListNode *p1=l1,*p2=l2; ListNode *p3=NULL,*q=NULL,*head=NULL; bool flag=fal原创 2013-11-30 11:20:47 · 509 阅读 · 0 评论 -
LeetCode Two Sum
自己写的,运行28msvector twoSum(vector &numbers, int target) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. int i,j;原创 2013-11-28 21:09:33 · 642 阅读 · 0 评论 -
LeetCode Integer to Roman
个位数举例I, 1 】II, 2】 III, 3】 IV, 4 】V, 5 】VI, 6】 VII, 7】 VIII,8 】IX, 9 ·十位数举例 X, 10】 XI, 11 】XII, 12】 XIII, 13】 XIV, 14】 XV, 15 】XVI, 16 】XVII, 17 】XVIII, 18】 XIX, 19】 XX, 20】 XXI, 21 】XXII, 22 】XX原创 2013-12-07 21:42:43 · 663 阅读 · 0 评论 -
LeetCode Reverse Integer
主要是考虑溢出,主要问题也是解决溢出,判断溢出。自己写个带参数(引用参数)的,不被识别,把参数去了确AC了。自己知道就行了。int reverse(int x,bool &flag) {//flag means if the result is overflow int signal=1; if (x<0) { signal=-1; } int temp,ret=0,newv=0原创 2013-12-01 21:21:02 · 1138 阅读 · 0 评论 -
LeetCode Median of Two Sorted Arrays
http://blog.youkuaiyun.com/zcsylj/article/details/6802062这篇博客上的想法是错的。虽说在优化思想上是对的,但其对median的理解就是错的,判断时要判断中位数是否想等,而不是只是简单的除2.我的思路是对的,但是这么做的话,很复杂。因为用中位数来判断是否相等,还要对中位数取整用作索引,最麻烦的是要不断改两个数组的起始索引和结束索引。下面的方法,从最转载 2013-11-29 21:07:45 · 574 阅读 · 0 评论 -
LeetCode Longest Common Prefix
// LeetCode_LongestCommonPrefix.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include using namespace std;string longestCommonPrefix(vector &strs) { int strslen = strs.size();原创 2013-12-08 10:11:07 · 579 阅读 · 0 评论 -
LeetCode String to Integer (atoi)
剑指offer倒数第二道题,用long long 来存整数才能判断相乘是否溢出#include "stdafx.h"#include #include using namespace std;int atoi(const char *str) { int i,signal=1; long long sum=0; if (str==NULL||*str==0) { retur原创 2013-12-02 19:27:35 · 610 阅读 · 0 评论 -
LeetCode ZigZag Conversion
这题主要是读明白题意。本来打算用二维数组存储,然后对数组中元素赋值,通过横纵索引的规律一个一个的输出。所以把图画了下来,分别是row为2,3,4时的情况,后来一看似乎有规律可循,即所要的转化串与原始串之间有一定的对应规律,想了想,试了试,测试了一下边界条件,一下子就出来了,感觉自己的编程能力提高了,有木有?string convert(string s, int nRows) { int i原创 2013-12-01 16:39:59 · 667 阅读 · 0 评论 -
LeetCode Longest Substring Without Repeating Characters
bool isRepeated(string s){ vector vec; for (int i=0;i<s.length();i++) { if (vec.empty()) { vec.push_back(s[i]); } else { vector::iterator iter=vec.end(); //iter = vec.find(s[i])原创 2013-11-30 10:32:35 · 559 阅读 · 0 评论 -
LeetCode Roman to Integer
int romanToInt(string s) { map mp; mp['I']=1; mp['V']=5; mp['X']=10; mp['L']=50; mp['C']=100; mp['D']=500; mp['M']=1000; int ret=0; //int unit=1000; int i=0; while(i<s.length()) { if (s原创 2013-12-08 09:52:35 · 528 阅读 · 0 评论 -
LeetCode Longest Palindromic Substring
第一次提交,,直接处理,时间为O(n三次方),时间限制,不通过。bool dist(string s,int i,int j){ while(i<j) { if (s[i]!=s[j]) { return false; } i++;j--; } return true;}string longestPalindrome(string s) { int st原创 2013-12-01 12:00:02 · 727 阅读 · 0 评论