递归与分治
谛听-
线上幽灵
展开
-
数组中第 k 大的数字
#include <iostream>using namespace std;int partion(int arr[], int left, int right) { if (left >= right) { return left; } int i = left, j = right; int tmp = arr[i]; while (i < j) { while (i < j &am原创 2021-01-24 16:12:38 · 158 阅读 · 0 评论 -
字符串数组最长公共前缀
#include <iostream>#include <vector>using namespace std;string str_longest_prefix(string str1, string str2) { if (str1 == "" || str2 == "") { return ""; } int i = 0, j = 0; string result = ""; while (i < str原创 2021-01-21 21:07:44 · 167 阅读 · 0 评论 -
集合的划分问题(二)
#include "iostream"#include "algorithm"#include "fstream"using namespace std;//集合划分,s(i,j)表示元素个数为i的集合可以划分为j个集合//s(i, 0) = 0//s(i, i) = 1//s(i, 1) = 1//s(i, j) = s(i-1, j-1) + j * s(i-1, j)//i-原创 2015-11-17 08:19:53 · 979 阅读 · 0 评论 -
集合划分问题(一)
#include "iostream"#include "algorithm"#include "fstream"using namespace std;//集合划分,s(i,j)表示元素个数为i的集合可以划分为j个集合//s(i, 0) = 0//s(i, i) = 1//s(i, 1) = 1//s(i, j) = s(i-1, j-1) + j * s(i-1, j)//i-原创 2015-11-16 22:33:36 · 1492 阅读 · 0 评论 -
有向直线2中值问题
#include "iostream"#include "fstream"using namespace std;const int INF = 100000;int w[100];int d[100];int total = 0; int n; int mincost = INF; //最小整体转移费用int min(int a, int b){ return a<b?a原创 2015-11-17 12:56:43 · 4252 阅读 · 3 评论 -
排列的字典序问题
#include "iostream"#include "algorithm"#include "fstream"using namespace std;//求n的阶乘int factorial(int n){ int f = 1; for(int i=2; i<=n; i++) f *= i; return f;}/*2 6 4 5 8 1原创 2015-11-16 22:07:21 · 775 阅读 · 0 评论 -
有重复元素的排列问题
#include "iostream"#include "algorithm"#include "fstream"using namespace std;int ans = 0;//判断list数组中第i个元素是否在前面元素list[k...i-1]中出现过//如果出现过,返回0, 否则返回1int ok(char list[], int k, int i){ if(i>k)原创 2015-11-16 20:33:19 · 595 阅读 · 0 评论 -
标准二维表问题
#include "iostream"#include "algorithm"#include "fstream"using namespace std;/*令h(0)=1,h(1)=1,catalan数满足递推式[1] :h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)例如:h(2)=h(0)*h(1)+h(1)*h(0)=原创 2015-11-17 09:37:35 · 1556 阅读 · 0 评论 -
半数集问题
#include "iostream"using namespace std;int a[100];int comp(int n){ int ans = 1; if(a[n]>0) return a[n]; for(int i=1; i<=n/2; i++) ans += comp(i); a[n] = ans; r原创 2015-11-16 18:25:34 · 508 阅读 · 0 评论 -
众数问题
#include "iostream"#include "algorithm"#include "fstream"using namespace std;//数组a[l,h]中,将小于a[l]的放其左,大于a[l]的放其右int partition(int y[], int l, int r){ int i = l, j = r+1; int x = y[l];原创 2015-11-16 14:45:26 · 451 阅读 · 0 评论 -
整数因子分解问题
#include "iostream"#include "algorithm"#include "fstream"using namespace std;/*h(n)为n的划分数h(1) = 1h(2) = 1h(n) = h(n/2) + h(n/3) + ... + h(n/n) 前提是能被整除 */int h[100];//动态规划int solve(int n){原创 2015-11-17 10:08:54 · 3136 阅读 · 0 评论 -
邮局选址问题
#include "iostream"#include "algorithm"#include "fstream"using namespace std;//数组a[low,heigh]中,将小于a[low]的放其左,大于a[low]的放其右int partition(int y[], int low, int heigh){ int i = low, j = heigh+1;原创 2015-11-16 16:23:13 · 1187 阅读 · 0 评论 -
剑指offer---二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。class Solution {public: bool ok(vector<int> sequence, int start, int end) { int root = sequence[end]; ...原创 2018-03-06 08:22:38 · 160 阅读 · 0 评论 -
leetcode---surrounded-regions
Given a 2D board containing’X’and’O’, capture all regions surrounded by’X’. A region is captured by flipping all’O’s into’X’s in that surrounded region . For example, X X X X X O O X X X O X ...原创 2018-02-21 12:21:05 · 179 阅读 · 0 评论 -
leetcode---combination-sum-ii---dfs
Given a collection of candidate numbers ( C ) and a target number ( T ), find all unique combinations in C where the candidate numbers sums to T . Each number in C may only be used once in the combina原创 2017-10-02 15:21:10 · 213 阅读 · 0 评论 -
leetcode---search-in-rotated-sorted-array---查找
题目描述Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e.,0 1 2 4 5 6 7might become4 5 6 7 0 1 2). You are given a target value to search. If found in the array return its原创 2017-10-01 15:45:43 · 343 阅读 · 0 评论 -
leetcode---search-for-a-range---查找
Given a sorted array of integers, find the starting and ending position of a given target value. Your algorithm’s runtime complexity must be in the order of O(log n). If the target is not found in th原创 2017-10-01 15:13:08 · 380 阅读 · 0 评论 -
leetcode---sqrtx---分治
Implementint sqrt(int x). Compute and return the square root of x.class Solution {public: int sqrt(int x) { unsigned long long low = 0; unsigned long long high = x; w原创 2017-09-21 20:12:18 · 234 阅读 · 0 评论 -
leetcode---powx-n---dfs
Implement pow(x, n).class Solution {public: double pow(double x, int n) { if(n == -2147483648) return 1.0/(x*pow(x, -n-1)); else if(n == 0) return 1;原创 2017-09-24 14:55:40 · 210 阅读 · 0 评论 -
leetcode---restore-ip-addresses---dfs
Given a string containing only digits, restore it by returning all possible valid IP address combinations. For example: Given”25525511135”, return[“255.255.11.135”, “255.255.111.35”]. (Order does no原创 2017-09-24 14:52:03 · 210 阅读 · 0 评论 -
半数单集问题
#include "iostream"using namespace std;int a[100];int comp(int n){ int ans = 1; if(a[n]>0) return a[n]; for(int i=1; i<=n/2; i++) { ans += comp(i); if(i>10原创 2015-11-16 18:36:10 · 971 阅读 · 0 评论 -
网球循环赛日程表--多边形法
#include "iostream"#include "cmath"using namespace std;int arr[20][20];int b[20];int odd(int n) //如果是奇数,返回1,否则返回0{ return n&1;}void construct(int n){ if(n==1) return; int m = odd(n)?原创 2015-11-15 22:23:51 · 1472 阅读 · 0 评论 -
O(1)空间子数组换位算法
#include "iostream"#include "algorithm"using namespace std;//向前循环换位法//将数组a[0,k-1]与a[k,n-1]换位void forward(int a[], int n, int k){ for(int i=0; i<k; i++) { int temp = a[0]; f原创 2015-11-15 18:45:16 · 1815 阅读 · 0 评论 -
整数划分问题
#include "stdio.h"int q(int n, int m) //正整数n的划分中,最大加数不超过m的划分个数{ if(m==1) return 1; //当最大加数不超过1时,只有一种形式 n=1+1+1+1... else if(n<m) return q(n, n); //最大加数实际上不能大于n else if(n==m) return 1 +原创 2015-10-10 22:23:22 · 407 阅读 · 0 评论 -
线性时间选择2
#include "stdio.h"void swap(int &a, int &b){ int temp = a; a = b; b = temp;}int part(int a[],int left, int right, int x) { //将小于x的元素移到左区间,将大于x的元素移到右区间 int i = left, j = right;原创 2015-10-10 22:22:49 · 474 阅读 · 0 评论 -
棋盘覆盖
#include "stdio.h"#include "string.h"const int N = 11;int board[N][N]; //棋盘布局int tile = 0; //覆盖时所用的方块,编号递增/* (r,c)棋盘左上角坐标 r----左上角行号 c----左上角列号 (tr,tc)特殊方格坐标 tr---特殊方格所在行号 tc---特殊方格原创 2015-10-10 22:21:45 · 423 阅读 · 0 评论 -
排列问题
#include "stdio.h"#include "iostream"#include "string.h"using namespace std;void Perm(char list[], int k, int m)//递归产生所有前缀是list[0:k-1],后缀是list[k:m]的全排列{//产生list[k:m]的所有排列 if(k==m) //只剩下一个元素原创 2015-10-10 22:20:58 · 456 阅读 · 0 评论 -
快速排序 -- C 语言
#include "stdio.h"int partion(int a[], int left, int right){ //将小于数组a[]第一个元素的元素移到左区间,将大于a[0]的元素移到右区间 int i = left; int j = right; int temp = a[left]; while(i原创 2015-10-10 22:20:03 · 541 阅读 · 1 评论 -
二分搜索
#include "stdio.h"int BianrySearch(char a[], int key, int n) //升序a[0:n-1]中搜索某一特定字符key,返回其下标{ int left = 0; int right = n-1; while(left <= right) { int mid = (left + right)/2;原创 2015-10-10 22:18:02 · 366 阅读 · 0 评论 -
hanoi塔
#include "stdio.h"void hanoi(int n, char a, char b, char c) { if(n==1) //如果只剩下一个盘子,则直接从a柱移到c柱 printf("%d %c --> %c\n", n, a, c); else { hanoi(n-1, a, c, b); //借助于c柱,将n-1个原创 2015-10-10 22:24:11 · 446 阅读 · 0 评论 -
归并排序
#include "stdio.h"int b[100];void merge(int a[], int left, int mid, int right){ int l = left; int m = mid+1; int k = 0; while(l<=mid && m<=right) //如果左半区间或右半区间结束,则跳出循环 {原创 2015-10-10 22:19:22 · 325 阅读 · 0 评论 -
线性时间选择1
#include "stdio.h"int partion(int a[], int left, int right){ //将小于数组a[]第一个元素的元素移到左区间,将大于a[0]的元素移到右区间 int i = left; int j = right; int temp = a[left]; while(i<j) { whil原创 2015-10-10 22:22:19 · 629 阅读 · 0 评论 -
输油管道问题
#include "iostream"#include "cmath"#include "fstream"using namespace std;//在元素个数为n的数组a中寻找第k小的元素//如果成功,返回第k小的元素,否则返回0int select(int a[], int n, int k){ int low = 1; int heigh = n; whil原创 2015-11-16 08:57:17 · 715 阅读 · 0 评论 -
士兵站队问题
#include "iostream"#include "algorithm"#include "fstream"using namespace std;//将大于a[low]的元素置其右,小于a[low]的元素置其右//最后将a[low]放在合适的位置,并返回其下标int partition(int a[], int low, int heigh){ int temp = a[原创 2015-11-16 19:37:25 · 3292 阅读 · 0 评论 -
网球循环赛日程表
#include "iostream"#include "cmath"using namespace std;int arr[20][20];int b[20];int odd(int n) //如果是奇数,返回1,否则返回0{ return n&1;}//如果n/2为偶数void copy(int n){ int m = n/2; for(int i=1;原创 2015-11-15 21:35:29 · 973 阅读 · 1 评论 -
马的Hamilton周游路线问题
#include "iostream"#include "iomanip"#include "cstdlib"using namespace std;int board[100][100];int dx[8] = {-2, -1, 1, 2, -2, -1, 2, 1}; //马可走的八个方向int dy[8] = {-1, -2, -2, -1, 1, 2, 1, 2};int原创 2015-11-16 17:20:23 · 2903 阅读 · 0 评论 -
构造Gray码的分治算法
#include "iostream"#include "cmath"using namespace std;int arr[1024][1024]; //arr[i][j]表示第i个格雷码的第j位//构造b位格雷码//a为格雷码的个数void gray(int a, int b){ if(b==1) //如果格雷码宽度为1 { arr[0][0] = 0;原创 2015-11-15 20:14:13 · 9984 阅读 · 5 评论 -
最大子段和
#include "stdio.h"#include "stdlib.h"#include "math.h"#include "string.h"#define N 100int max(int a, int b){ return a>b?a:b;}int MaxSum(int a[N], int left, int right){ //返回数组a[left:right]最大原创 2015-10-11 19:53:11 · 326 阅读 · 0 评论 -
最近点对
#include "stdio.h"#include "stdlib.h"#include "math.h"#define INF 100000000#define N 100000struct { double x; double y;}point[N];int temp[N];int cmpy(const void * y1, const void * y2) //根原创 2015-10-11 12:48:05 · 478 阅读 · 0 评论 -
循环赛日程表
#include "stdio.h"#include "stdlib.h"#include "math.h"#define N 20int t[N][N];void table(int k) //k为单循环赛日程表的级数,即日程表大小为2^k * 2^k{ //将日程表保存在t[][]中 int m = 1; //刚开始块的规模 int n = 1; //n=2^k,原创 2015-10-11 15:31:48 · 517 阅读 · 0 评论