随笔分类 -  数据结构和算法

数据结构和算法相关的文章
摘要:思路1:先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null)。这样两个链表就合成了一个链表,判断原来的两个链表是否相交也就转变成了判断新的链表是否有环的问题了:即判断单链表是否有环?思路2:如果他们相交的话,那么他们最后的一个节点一定是相同的,否则是不相交的。因此判断两个链表是否相交就很简单了,分别遍历到两个链表的尾部,然后判断他们是否相同,如果相同,则相交;否则不相交。判断出两个链表相交后就是判断他们的交点了。假设第一个链表长度为len1,第二个问len2,然后找出长度较长的,让长度较长的链表指针向后移动|len1 - len2|(le 阅读全文
posted @ 2013-11-25 15:50 alexeyqian 阅读(375) 评论(0) 推荐(0)
摘要:Method Oneint is_cycle_list(Node* head) { Node *temp, *current, *next; if(!head) return FALSE; temp = NULL; current = head; next = head->next; current->next = temp; while(next) { if(next == head) { return TRUE; } temp = c... 阅读全文
posted @ 2013-11-25 15:37 alexeyqian 阅读(178) 评论(0) 推荐(0)
摘要:#include #include typedef struct TNode { int value; TNode* lchild; TNode* rchild; }TNode,*BTree; //根据先序遍历、中序遍历构建二叉树 BTree rebuild(int preOrder[],int startPre,int endPre,int inOrder[],int startIn,int endIn) { //先序遍历和中序遍历长度应相... 阅读全文
posted @ 2013-11-21 15:59 alexeyqian 阅读(227) 评论(0) 推荐(0)
摘要:有N个重量和价值分别为wi和vi的物品。从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。#define MAX_N 1000// inputint N, W, w[MAX_N], v[MAX_N];int dp[MAX_N][MAX_N]; // remember array to reduce recursiveint rec(int i, int weight){ if(dp[i][weight] >= 0) return dp[i][weight]; int ans; if(i == N) // no product left ... 阅读全文
posted @ 2013-11-08 15:06 alexeyqian 阅读(141) 评论(0) 推荐(0)
摘要:有1元、5元、10元、50元、100元、500元的硬币各C1、C5、C10、C50、C100、C500枚。现在要用这些硬币来支付A元,最少需要多少枚硬币?假设至少存在一种支付方式。// Values of coinsconst int V[6] = {1, 5, 10, 50, 100, 500};// Inputint A, C[6];void solve(){ int ans = 0, i, t; for(i = 5; i >= 0; i--) { t = min(A/V[i], C[i]); A -= T*v[i]; ans +... 阅读全文
posted @ 2013-11-07 14:04 alexeyqian 阅读(333) 评论(0) 推荐(0)
摘要:给定整数 a1, a2, a3, ..., an, 判断是否可以从中选出若干数,使他们的和恰好为k。1 <= n <= 20-10^8 <= ai <= 10^8-10^8 <= k <= 10^8int n, k, a[MAX_N];bool dfs(int i, int sum){ if(i == n) return sum == k; if(dfs(i+1, sum)) return true; if(dfs(i+1, sum + a[i])) return true; return false;}void solve(){ if(dfs(0,0)) 阅读全文
posted @ 2013-11-06 21:22 alexeyqian 阅读(174) 评论(0) 推荐(0)
摘要:利用记忆数组减少重复计算int memo[MAX_N+1];int Fbi(int i){ if(i 0) return memo[i]; return memo[i] = Fbi(i-1) + Fbi(i-2);} 阅读全文
posted @ 2013-11-06 21:12 alexeyqian 阅读(180) 评论(0) 推荐(0)
摘要:Greated Common Divisorint GCD(int a, int b){ int temp; if(a < b) { temp = a; a = b; b = temp; } if(a % b == 0) return b; return GCD(b, a % b);}Least Common Multiple//最小公倍数等于两数之积除以最大公约数 int LCM(int a,int b){ return (a * b) / GCD(a, b); } 阅读全文
posted @ 2013-11-04 15:49 alexeyqian 阅读(186) 评论(0) 推荐(0)
摘要:include leap yearint dayOfYear(int year, int month, int day){ int months[13] = {0,31,30,28,31,30,31,31,30,31,30,31}, i, days = 0; if( (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) // is leap year months[2] = 29; for(i = 1; i < month; i++) days += months[i]; days ... 阅读全文
posted @ 2013-11-04 15:35 alexeyqian 阅读(238) 评论(0) 推荐(0)
摘要:string end with '#'void reversePrint(){ char c; scanf("%c", &c); if(c != '#') reversePrint(); if(c != '#') printf("%c", c);} 阅读全文
posted @ 2013-11-04 15:22 alexeyqian 阅读(753) 评论(1) 推荐(0)
摘要:整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 0),只有一种划分即{1}; (2) 当m=1时,不论n的值为多少,只有一种划分即n个1,{1,1,1,...,1}; (3) 当n=m时,根据划分中是否包含n,可以分为两种情况: (a). 划分中包含n的情况,只有一个即{n}; (b). 划分中不包含n的情况,这时划分中最大的数字也一定比n小,即n的所有(n-1)划分。 因此 f(n,n) =1 + f(n,n-1); (4) 当nm时,根据划分中是 阅读全文
posted @ 2013-10-26 19:55 alexeyqian 阅读(265) 评论(0) 推荐(0)
摘要:int factorial(int n){ int i, result; for(i = 1; i <= n; i++) result *= i; return result;}int factorial2(int n){ if(n <= 1) return 1; else return n * factorial2(n-1);}以下列出0至20的阶乘:0!=1,注意(0的阶乘是存在的)1!=1,2!=2,3!=6,4!=24,5!=120,6!=720,7!=5,040,8!=40,3209!=362,88010!=3,... 阅读全文
posted @ 2013-10-26 19:28 alexeyqian 阅读(563) 评论(0) 推荐(0)
摘要:Three methods to check is prime, the later, the better.#include #include int isPrime(int n){ int i; for( i = 2; i < n; i++) if(n % i == 0) return 0; return 1;}int isPrime2(int n){ int i; for( i = 2; i <= sqrt(n); i++) if(n % i == 0) return 0; ret... 阅读全文
posted @ 2013-10-26 19:11 alexeyqian 阅读(133) 评论(0) 推荐(0)
摘要:Quick Sortingint quickSortPartition(int a[], int low, int high){ int i = low, j = high, key = a[low]; while(i key) j--; if(i<j) a[j] = a[i]; while(i<j && a[i] < key) i++; if(i<j) a[i] = a[j]; } a[i] = key; return i;}voi... 阅读全文
posted @ 2013-10-26 12:02 alexeyqian 阅读(130) 评论(0) 推荐(0)
摘要:Bubble Sortingvoid bubbleSort(int a[], int n){ int i, j, flag; for(i = 0; i a [j+1]) swap(a[j], a[j+1]); if(!flag) break; }}O(n^2) 阅读全文
posted @ 2013-10-26 11:12 alexeyqian 阅读(100) 评论(0) 推荐(0)
摘要:Binary Searchint binarySearch(int a[], int n, int key){ int low = 0, high = n - 1, mid = 0; while(low <= high) { mid = (low + high) / 2; if(a[mid] == key) return mid; else if(a[mid] < key) low = mid + 1; else high = mid - 1; } ... 阅读全文
posted @ 2013-10-26 09:43 alexeyqian 阅读(116) 评论(0) 推荐(0)
摘要:Insert Sortingvoid insertSort(int a[], int n){ int i = 0, j = 0, temp = 0; for(i = 1; i = 0) a[j+1] = a[j--]; a[j+1] = temp; }}O(n^2) 阅读全文
posted @ 2013-10-26 09:34 alexeyqian 阅读(126) 评论(0) 推荐(0)
摘要:Select Sortingvoid selectSort(int a[], int n){ int i = 0, j = 0, min= 0, temp = 0; for(i = 0; i a[j]) min = j; } if(min != i) swap(a[min], a[i]); } }O(n^2) 阅读全文
posted @ 2013-10-26 09:26 alexeyqian 阅读(113) 评论(0) 推荐(0)