![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 64
Splendour
MSDN C++ 版主
C++ MVP
展开
-
二叉搜索树中查找与目标数字最接近的节点
struct Node{int value;Node* left;Node* right;};Node* LeftPrev = NULL;Node* RightPrev = NULL;Node* GetNearestNode(Node* root, int k){ if(NULL == root) { return NULL; } if(k == root->valu原创 2012-07-04 21:26:07 · 2174 阅读 · 0 评论 -
四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())
其实就是一个排列问题,唯一的区别是,需要注意右括号的数量不能超过左括号。#include void BracesHelper(int left, int right, int cur, int size,std::string output){ if(size == right) { printf("%s",0,output.c_str()); return;原创 2012-08-19 19:02:00 · 3643 阅读 · 0 评论 -
在两个有序数组中找到第k小的数
我们知道如果数组有序,我们可以在O(1)的时间内找到第k小的数,但是如何在两个有序数组中找到第k的数呢?我们可以在O(logn)的时间内找到这个数。貌似只要是在有序数列中找东西,大部分的时间复杂度都是O(logn),因为我们有神器二分查找。。int GetTopK(int* A, int * B, int lengthA, int lengthB, int k){ if(lengthA原创 2012-08-18 12:49:59 · 4912 阅读 · 1 评论 -
一道google的比较经典算法题
这是一道google的比较经典算法题,题目是:已经两个已经排好序的数组,找出两个数组合起来的中间大的数字。要求算法复杂度尽可能低。如:x数组:1,7,9,10,30 y数组:3,5,8,11 则中间大数为:8 时间复杂度是logn,我们可以比较两个数组的中位数,然后根据中位数的关系来进行二分查找。在边界条件判断上,我们要注意奇偶情况,如果是偶数个元素的数组,我们需要取上中位数,原创 2012-08-11 22:24:19 · 1008 阅读 · 0 评论 -
查询序列中的最长递增子序列的长度
int FindMaxSS(int* list, int n){ if( 0 >= n) { return 0; } if( 1 == n) { return 1; } int * maxv = new int[n]; int* maxL = new int[n]; for(int i = 0;i<n; ++i) { maxv[i原创 2012-07-09 21:51:32 · 877 阅读 · 0 评论 -
求子数组的和最接近特定值
昨天写了关于子数组的和等于特定值的算法。今天和大家分享求子数组的和最接近特定值,和等于特定值的区别在于只是建树的过程不太一样。需要插入,每个节点的时候记录与当前节点最接近的节点,并且将差值保存起来。差值越小说明越接近特定值。struct Node{ Node* left; Node* right; int value; int pos;};int g_min = -1;原创 2012-07-22 17:28:14 · 1348 阅读 · 0 评论 -
有两个序列a,b,要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。例如: var a=[100,99,98,1,2, 3];var b=[1, 2, 3, 4,5,40]; 网上对于这道题的描述很多,所以拿来练习练习。最直接了当的方法就是尝试各种组合。当然这种解法的时间复杂度是阶乘,显然不能接受。下面原创 2012-07-29 12:05:51 · 2770 阅读 · 0 评论 -
求整数随机数构成的数组中找到最长的等差数列
格式:输入[1,3,0,5,-1,6]输出[-1,1,3,5]要求时间复杂度,空间复杂度尽量小第一反应还是动态规划,我们可以先将数组排序,然后建立一个二维数组,来记录每一个输入数组中的数字和比他小的数字所有的相减结果的当前最长等差数列长度。我们用n代表当前的数字,d代表等差数列的差值。于是f(n,m) = f(n-m,m) + 1。 f(n-m,m)为比n小m的数字所包含的等差数列原创 2012-08-06 22:44:03 · 1145 阅读 · 0 评论 -
子数组的和等于特定值
这是一道比较经典的数组算法题。很多地方都有解法。当然蛮力肯定是不得分的。我们来看一个数组A1,A2...An. 如果我们想得到Ai到Aj的和。我们可以求A1..Ai-1的和,然后再求A1到Aj的和。用这两个和相减,得到的就是Ai到Aj的和。因为A1到Aj的和包括A1到Ai-1,Ai到Aj。那么通过一次遍历数组我们就能够得到A1到An中任意数的和。但是我们要找的是子数组之和等于特定值。我们如何利原创 2012-07-21 22:30:23 · 4217 阅读 · 2 评论 -
求最大和子矩阵
这道题大家在很多地方都能找到。基本思路首先将矩阵二维问题转换为求一维数组的子数组问题。前面我们已经提到如何求一维数组的最大和子数组。我们可以写出每一列的全排列然后把每种排列都视为一个数组,然后输出最大的结果的矩阵就可以了。该实现我还没有验证。抽空将验证下。 void getMaxSumSubArray(int* list, int length, int& MaxSum,int& Maxs原创 2012-07-15 21:09:35 · 976 阅读 · 0 评论 -
通过前序和中序遍历数组重建树
其实通过前序中序和后序遍历的数组重建树是一件很好理解的过程。前序的特点是根节点先被输出,中序是左节点,根节点和右节点。后续是左右根。有了这个特点后,中序遍历数组中首先找前序中的第一个节点,也就是树的根节点,如果发现在中序数组中这个根节点前面有元素,代表该跟节点有左孩子,也就是中序中前面的子数组。该子数组包含的元素和在前序遍历中根节点后的子数组长度内的元素是一致的。因为既然有左节点,所以前序原创 2012-06-30 13:09:44 · 1465 阅读 · 0 评论 -
判断循环链表
分别用两个指针步进一步和两步,如果存在循环,则最差在不仅两步的指针遍历循环节两遍后可发现链表循环。 struct Node{ Node* next;};bool LoopList(Node* head){ if(NULL == head) { return false; } Node* SinglePace = head->next; N原创 2012-06-29 09:50:34 · 1447 阅读 · 0 评论 -
2006 年百度之星程序设计大赛初赛题目 5
座位调整 题目描述: 百度办公区里到处摆放着各种各样的零食。百度人力资源部的调研发现,员工如果可以在自己喜欢的美食旁边工作,工作效率会大大提高。因此,百度决定进行一次员工座位的大调整。调整的方法如下: 1 . 首先将办公区按照各种零食的摆放分成 N 个不同的区域。(例如:可乐区,饼干区,牛奶区等等)。 2 . 每个员工对不同的零食区域有不同的喜好程度(喜原创 2012-06-28 22:45:16 · 1410 阅读 · 0 评论 -
字符串全排列算法
可以分为两种方式,递归和循环oid swap(char* a, char*b){ char temp = *b; *b = *a; *a = temp;}void permute(char* source, int length, int cnt){ if(length == cnt) { printf("%s ", source);原创 2012-06-28 11:16:17 · 562 阅读 · 0 评论 -
有序 循环数组的二分查找
例如 10,11,12,13,14,1,2,3,4,5,6,7,8,9虽然整体上不是有序的,但是只是在某个节点进行了循环。在这样的数组中进行查找,可以使用二分查找法。但是需要判断选环节的位置。int Find(int* source, int size, int num){ if(NULL == source || size < 0) { return -1; } i原创 2012-06-28 14:31:11 · 1532 阅读 · 0 评论 -
24点实现
void SwapNumber(int* a, int*b){ if(NULL != a && NULL !=b) { return; } int temp = *b; *b = *a; *a = temp;}int G24points(int* source, int length, int cnt){ if(length < 0 || NULL原创 2012-06-28 11:51:07 · 609 阅读 · 0 评论 -
求给定值以内的所有素数
首先如果一个数不能被任何小于等于该数平方根的数整除,则其是一个素数,这个很好理解。例如数m=n*n,则m一定不是素数因为可以被n整除。如果m=k*j.k大于m的平方根。那么j一定小于其平方根。所以可以证明m只要不能被小于平方根的数整,则一定不会被大于平方根的数整除。第二,如果一个数不能被比他小的所有素数整除,则其是一个素数。因为比这个数小的其他数都应该可以用比他小的素数整除。另外程序中第六原创 2012-07-07 17:53:22 · 858 阅读 · 0 评论 -
在有序递增数组中查找一个缺少的数字
例如2,3,4,5,6,8,9.在这个数组中我们要找到缺少的7。从直觉上看,我们可以把2到9求和,然后把数组的成员求和。用数字的和减去数组的和得到的就是缺少的数字。但是这个办法的时间复杂度是O(n)。但是我们看到数组是有序的,能不能通过二分法找到数字呢,答案是肯定的。我们可以发现规律,如果数字缺少在数组的前半部分,那么数组的中间节点会大于数字的中间节点。例如1,3,4由于缺少2,所以数组的中间节点原创 2012-07-05 22:07:46 · 4846 阅读 · 3 评论 -
求双调节点
如果一个数组是双调的,即1,2,3,6,4,2或者7,6,4,3,5,8,9我们需要能够找到双调的中心节点在什么位置。int DoubleTuning(int* list, int length){ int* mid = list + length / 2; int* start = list; int* end = list+length - 1; while(原创 2012-08-29 22:58:44 · 1987 阅读 · 0 评论