![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法学习
文章平均质量分 79
小小哇牛
jiayou
展开
-
算法学习-第一个缺失的正整数
题目给定一个数组A[0...N-1],找到从1开始,第一个不再数组中的正整数。如3,5,1,2,-3,7,14,8输出4。分析解法很多,如下:1、可以暴力求解,从1遍历到n,每次和数组对比,找到第一个不在数组中的,时间复杂度为O(N2)2、可以优化一下算法,先排序在进行2分查找,时间复杂度为N*log(N)。3、因为第一个缺失的正整数肯定小于等于原创 2016-12-05 17:02:40 · 825 阅读 · 0 评论 -
算法学习-局部最大值
没时间了,以后补上原创 2016-11-23 11:49:26 · 5492 阅读 · 1 评论 -
算法学习-绝对众数
题目定义:给定N个数,称出现次数最多的数为众数;若某众数出现的次数大于N/2,称该众数为绝对众数。如:A={1,2,1,3,2}中,1和2都是众数,但都不是绝对众数。如:A={1,2,1,3,1}中,1是绝对众数。已知给定的N个整数存在绝对众数,以最低的时空复杂度计算该绝对众数。算法分析删除数组A中两个不同的数,绝对众数不变。原因:若两个树中有1个是原创 2016-11-23 11:45:47 · 1050 阅读 · 0 评论 -
算法学习-二分查找
int Find(const int *array, int size, int a){ int nHigh = size - 1; int nLow = 0; int nMid; while (nLow <= nHigh) { nMid = (nHigh + nLow) / 2; if (array[nMid] > a) { nHigh = nMid - 1;原创 2016-11-23 10:50:03 · 411 阅读 · 0 评论 -
算法学习-天平与假币
题目有12枚硬币,其中有且只有1枚是假币,但不知道是重还是轻。现给定一架没有发吗的天平,问至少需要多少次称量才能确保找到这枚假币?进一步思考:如何证明某个方案是最少次数?分析随机将12枚硬币等分成3分,每份4枚,标机为A、B、C三份。将A放于左侧,B放于右侧,用天平称量A和B,分三种情况:天平平衡A(左)比B(右)重A(左)比B(右)轻,与2原创 2016-11-23 10:25:42 · 1685 阅读 · 0 评论 -
算法学习-二叉树节点和两种实现方法,递归非递归
struct Node{ Node* m_child[2]; int m_i;};int getSum(struct Node* pRoot){ if (!pRoot) { return 0; } return pRoot->m_i + getSum(pRoot->m_child[0]) + getSum(pRoot->m_child[1]);}int getS原创 2016-11-22 16:47:14 · 512 阅读 · 0 评论 -
算法学习-最大连续子数组
题目给定一个数组A[0,...,n-1],求A的连续子数组,使得孩子数组的和最大。例如数组:1,-2,3,10,-4,7,2,-5的最大子数组是:3,10,-4,7,2分析记S[i]为以A[i]为结尾的数组中和最大的子数组则:S[i+1]=max(S[i]+A[i+1],A[i+1])S[0]=A[0]遍历i:0动态规划:最优子问题时间复原创 2016-11-22 15:53:08 · 392 阅读 · 0 评论 -
算法学习-树的基本操作
typedef struct tagSTreeNode{ int value; tagSTreeNode* pLeft; tagSTreeNode* pRight; tagSTreeNode(int v) : value(v), pLeft(NULL), pRight(NULL){}}STreeNode;typedef void (*VISIT)(int value); //原创 2016-11-21 16:41:40 · 600 阅读 · 0 评论 -
算法学习-树转二叉树
普通树转换为二叉树的方法是:①树中所有相同双亲结点的兄弟节点之间加一条连线②对树中不是双亲结点第一个孩子的结点,只保留新添加的该结点与左兄弟结点之间的连线,删去该结点与双亲结点之间的连线③整理所有保留和添加的的连线,使每个结点的第一个孩子结点连线位于左孩子指针位置,使每个结点的右兄弟结点连线位于右孩子指针位置:整个转换过程如下图从左到右所示转载 2016-11-21 14:40:54 · 433 阅读 · 0 评论 -
算法学习-汉诺塔(hanoi)
题目有三根相邻的柱子,标号为ABC,A柱子上按从小到大叠放着n个不同大小的盘子,要求把所有盘子每次移动一个,最终放到C柱子上;移动过程可以借助B柱子,但要求每次移动中必须保持小盘子在大盘子的上面。比如n=10,请给出最少次数的移动方案。#include "stdafx.h"#include void MoveOne(char from, char to){ s原创 2016-11-19 09:13:21 · 663 阅读 · 0 评论 -
算法学习-查找旋转数组的最小值
题目假定一个排序数组以某个位置元素为支点做了旋转,如:原数组0 1 2 4 5 6 7旋转后得到 4 5 6 0 1 2.请找出旋转后数组的最小值,假定数组中没有重复数字分析旋转之后的数组实际上可以划分成两个有序的组数组:前面子数组的大小都大于后面子数组的元素,注意到实际上最小的元素就是两个子数组的分界线用索引left,right分别指向收尾元素,元素不重复。原创 2016-12-05 17:25:08 · 412 阅读 · 0 评论 -
算法学习-零子数组,最大连续子数组
题目对于长度为N的数组A,求连续子数组的和最接近0的值。如:数组A:1,-2,3,10,-4,7,2,-5它是所有子数组中,和最接近0的是哪个?算法流程申请比A长1的空间sum[-1,0,...,N-1],sum[i]是A的前i项和。定义sum[-1]=0显然有:A的i到j项和=sum(j)-sum(i-1)算法思路:原创 2016-12-05 17:55:41 · 1299 阅读 · 1 评论 -
MD5 标准C++实现
工作中需要用到MD5进行加密,在网上搜的一个代码,亲测可用,留作以后需要#ifndef MD5_H#define MD5_H// Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All// rights reserved.// License to copy and use this software is g转载 2017-07-21 20:32:23 · 638 阅读 · 0 评论 -
算法学习-Huffman编码
Huffman编码是一种无损压缩编码方案。思想:根据源字符出现的(估算)概率对字符编码,概率搞的字符使用较短的编码,概率低的使用较长的编码,从而使得编码后的字符串长度期望最小。Huffman编码是一种贪心算法:每次总选择两个最小概率的字符结点结合。称字符出现的次数为频数,则概率约等于频数初一字符总长,因此,概率可以用频数代替。算法演示原创 2016-12-18 18:05:26 · 1161 阅读 · 0 评论 -
算法学习-所有括号匹配的字符串
题目:N对括号能够得到的有效括号序列有哪些?如N=3时,有效括号串共5个,分别为:1:()()()2:()(())3:(())()4:(()())5:((()))问题分析:任何一个括号,都可以写成形式A(B)A、B都是若干括号对形成的合法串(可为空串)若N=0,括号序列为空。原创 2016-12-24 11:20:47 · 848 阅读 · 0 评论 -
算法学习-二叉树的翻转
题目给定一颗二叉树,将其左右翻转。如下图代码如下void CBinaryTree::Reverse(){ _Reverse(m_pRoot);}void CBinaryTree::_Reverse(STreeNode* pRoot){ if (pRoot) { swap(pRoot->pLeft, pRoot->pRight); _Rever原创 2016-12-24 10:37:27 · 776 阅读 · 0 评论 -
算法学习-求最大二查搜索子树
题目:给定某二叉树,计算它的最大二查搜索子树。返回该最大二查搜索子树的根节点。规定:如果某子树拥有更多的节点,则该子树更大。一颗树的子树,指以某节点为根的所有节点。如下图的二叉树,返回81.题目解析:若某节点的左右子树都是二查搜索树,且能够计算该节点左子树的最大值max和右子树的最小值min,记该节点的值为value若value>max且va原创 2016-12-24 10:09:35 · 579 阅读 · 0 评论 -
算法学习-二叉查找树
二叉查找树(二叉搜索树)是满足一下条件的二叉树:左子树上的所有结点值均小于根结点值,右子树上的所有结点值均不小于根结点值,左右子树也满足上述两个条件。结点的查找STreeNode* CBinaryTree::Find(int value) const{ if (!m_pRoot) { return NULL; } STreeNode* pNode = m_pRo原创 2016-11-22 15:42:05 · 529 阅读 · 0 评论 -
算法学习-Cantor数组
题目已知数组A[0...N-1]乱序着前N个正整数,现统计后缀数组A[i+1...N-1]中小于元素A[i]的数目,并存放在数组C[i]中。如给定数组A={4,6,2,5,3,1},得到数组C={3,4,1,2,1,0}。问:给定数组C={3,4,1,2,1,0},如何恢复数组A?我们称A为原数组,C为Cantor数组。求Cantor数组代码如下void Can原创 2016-12-06 16:21:02 · 937 阅读 · 0 评论 -
算法学习-数组的最大间隔
题目给定整数数组A[0...N-1],求这N个数排序后最大间隔。如1,7,14,9,4,13的最大减个为4。排序后:1,4,7,9,13,14,最大间隔是13-9=4显然,对原来数组排序,然后求后项减前项的最大值,即为解,但还有更好的方法。分析假定N个数的最大最小之为max,min,则这N个数形成N-1个间隔,最大间隔的最小值是(max-min)/(N-原创 2016-12-06 15:33:26 · 1814 阅读 · 2 评论 -
算法学习-荷兰国旗问题
题目现有红、白、蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。问题分析问题转换为:给定数组A[0...N-1],元素只能取0、1、2三个值,设计算法,使得数组排列成“00...0011...1122...22”的形式借鉴快速排序中partition的过程,定义三个指针begin=0,current=0,end=N原创 2016-12-06 11:27:39 · 1420 阅读 · 0 评论 -
算法学习-数字连续的子数组
题目给定长度为N的数组A[0...N-1],求递增且连续数字最长的子数组。如数组:1,2,3,34,56,57,58,59,60,61,99,121的连续数字最长的一段位56,57,58,59,60,61.代码int MaxSequence(const int* a, int size, int& from, int& to){ int* p = new原创 2016-12-06 10:32:14 · 502 阅读 · 0 评论 -
算法学习-字符串循环左移
题目给定一个字符串S[0...N-1],要求把S的前K个字符移动到S的尾部,如把字符串“abcdef”前面的2个字符‘a’、‘b’移动到字符串的尾部,得到新字符串“cdefab”:即字符串循环左移K。循环左移n+k位和k位的效果相同。循环左移k位等价于循环右移n-k位。算法要求:时间复杂度为O(n),空间复杂度为O(1)。分析原创 2016-11-15 15:29:35 · 1139 阅读 · 0 评论 -
算法学习-单链表公共结点问题
题目得定两个单向链表,计算两个链表的第一个公共结点,若没有公共结点,返回空。分析令两个链表的长度为m、n,不放认为m>=n,由于两个链表从第一个公共结点到链表的为节点是完全重合的。所以前面的(m-n)个结点一定没有公共结点。先分别遍历两个链表得到他们的长度m,n。长链表空转|m-n|次,同步遍历两链表,知道找到相同结点或到链表结束。时间复杂度为O(m+n)。原创 2016-11-14 15:23:41 · 526 阅读 · 0 评论 -
算法学习-链表划分
题目给定一个链表和一个值X,将链表划分成两部分,使得划分后小于X的结点在前,大于等于X的结点在后。在这两部分中要保持原链表中的出现顺序。如:给定链表1->4->3->2->5->2和X=3,返回1->2->2->4->3->5。分析分别申请两个指针p1和p2,小于x的添加到p1种,大于等于x的添加到p2中,最后,将p2连接到p1的末端即可。时间复杂度是O原创 2016-11-14 15:05:02 · 341 阅读 · 0 评论 -
算法学习-排序链表中去重
题目给定排序的链表,删除重复元素,只保留重复元素第一次出现的结点。如:给定:2->3->3->5->7->8->8->8->9->9-10返回:2->3->5->7->8->9-10解析若p->next的值和p的值相等,则将p->next->next赋值给p,删除p->next;重复上述过程,直至链表尾端。原创 2016-11-14 13:45:37 · 441 阅读 · 0 评论 -
算法学习-链表的部分翻转
题目给定一个链表,翻转该链表从m到n的位置。要求直接翻转而非申请新空间。如:给定1->2->3->4->5,m=2,n=4,返回1->4->3->2->5。假定给出的参数满足:1原创 2016-11-14 11:35:13 · 618 阅读 · 0 评论 -
算法学习- 皇帝、穷人、守财奴
题目 皇帝不是穷人,在守财奴之中也有穷人,所以,有一些_______并不是_______。 A:皇帝,皇帝 B:守财奴,守财奴 C:守财奴,皇帝 D:皇帝,守财奴首先在网上看别人的方法当然你硬想也行,但怎么说这里是原创 2016-11-13 17:54:34 · 1420 阅读 · 0 评论 -
算法学习-足球比赛最少最大出线分数
足球比赛,一个小组有8支球队进行单循环赛,胜者积3分,平则算法同积1分,负则不积分,规定积分最高的4支球队出线,则出线至少需要多少分?未出线最多可能有多少分?思路:循环赛的概念是每一支球队会与其他所有球队各进行一场比赛。8支球队共进行8*7/2=28场比赛。1、出线至少需要多少分? 赢得比赛积分最快,打平积分增长慢,输掉比赛积分不变。如果想以最少的积分赢,着眼点应原创 2016-11-13 17:38:48 · 1190 阅读 · 0 评论 -
算法学习-三字母字符串组合
题目仅由三个字符A、B、C构成字符串,且字符串任意三个相邻元素不能完全相同。如“ACCCAB”不合法,“ABBCBCA”合法。求满足条件的长度为n的字符串个数。假定不考虑整数溢出。要求时间和空间复杂度不高于O(N)。分析若当前已经有了所有长度为n-1的合法字符串,如何在末端增加一个字符串,形成长度为n的字符串呢?将长度为n-1字符串分成“末尾原创 2016-11-16 18:09:49 · 1415 阅读 · 0 评论 -
算法学习-最长回文子串
题目给定字符串str,若子串s是回文串,称s为str的回文字串。设计算法,计算str的最长回文字串。枚举所有字串,显然是一种解法,但效率太过低下。原创 2016-11-16 13:13:55 · 475 阅读 · 0 评论 -
算法学习-八皇后问题
想把代码贴这里,有时间在慢慢讨论/* * Copyright (c) leo * All rights reserved. * filename: nQueens* summary : * version : 1.0 * author : * date : 8.12.2011 *问题:* 在n*n (n=1 or n>=4 )的棋盘上放置n个皇后,如果在同一行,同一列,原创 2016-11-16 14:40:14 · 492 阅读 · 0 评论 -
算法学习-字符串的全排列
题目给定字符串S[0...N-1],设计算法,枚举S的全排列分析以1234为例:1-2342-1343-2144-231如何保证不遗漏:保证递归前1234的顺序不变代码如下#include "stdafx.h"#include void Print(const int* a, int size){ for (int i原创 2016-11-16 11:41:14 · 445 阅读 · 0 评论 -
算法学习-拓扑排序(队列应用)
题目对一个有向无环图G进行拓扑排序,是将G中所有定点排成线性序列,使得途中任意一堆顶点u、v,若边(u,v)∈E(G),则在线性序列中u出现在v之前。分析一个节点没有节点指向(即入度为0)的时候可以顺利输出,如果有则不能。可以用邻接矩阵的方式来存储现有的图,将某节点列下所有的相加后如果等于0这说明当前结点可输出。这里给出关键代码和原创 2016-11-14 16:18:24 · 2108 阅读 · 0 评论 -
算法学习-最短路径条数问题(队列相关)
题目给定如图所示的无向连通图,嘉定图中所有边的权值都为1,显然,从原点A到终点T的最短路径有多条,求不同的最短路径的数目。分析权值相同的最短路径问题,则单元点Dijkstra算法退化成BFS广度优先搜索,假定起点为0,终点为N:结点步数step[0...N-1]初始化为0,记录从A到其他结点的最短路径的步数路径数目pathNum[0...N-1]原创 2016-11-14 17:46:53 · 3486 阅读 · 0 评论 -
算法学习-逆波兰表达式RPN
Reverse Polish Notation,即后缀表达式。习惯上,二元运算符总是置于与之相关的两个运算对象之间,即中缀表达方法。波兰逻辑学家xxxxxxx于1929年提出了运算符都置于其运算对象之后,故称为后缀表达式。如:中缀表达式:a+(b-x)*d 后缀表达式:abc-d*+原创 2016-11-15 14:10:36 · 2547 阅读 · 0 评论 -
算法学习-循环染色方案
题目用红、蓝两种颜色将围成一圈的8个旗子染色。规定:若某两种染色方案通过旋转的方式可以重合,则只算一种。问:一共有多少种不同的染色方案?问题分析用0/1表示颜色方案,8个棋子对应8位二进制数。”旋转重合则只算一种”即:将x循环左移以为得y,则x和y属于相同类别(等价类):若y若y>x,则删除y;该算法借鉴求素数的筛法由原创 2016-11-18 17:28:28 · 911 阅读 · 0 评论 -
算法学习-eratosthenes筛法求素数
题目给定正整数N,求小于等于N的全部素数。eratosthenes筛法将2到N写成一排;记派头元素为x,则x是素数;除x以外,将x的倍数全部划去;重复以上操作,知道没有元素被划去,则剩余的即小于等于N的全部素数为表述方便,将派头元素成为“筛数”。代码如下,对于N我们只需筛带小于N的开方的那个整数就行,对于筛数i,i以前的倍数就不用筛了,因为之前就已经原创 2016-11-18 16:59:29 · 864 阅读 · 0 评论 -
算法学习-角谷猜想
转自http://blog.csdn.net/qq_26570353/article/details/51049745题目描述角谷猜想: 日本一位中学生发现一个奇妙的“定理”,请角谷教授证明,而教授无能为力,于是产生角谷猜想。猜想的内容是:任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为1。请编程验证。输入转载 2016-11-18 16:35:51 · 848 阅读 · 0 评论 -
算法学习-求平方根函数
感觉数学基础有点吃力,未完待续。。。。。。原创 2016-11-18 16:25:00 · 735 阅读 · 0 评论