![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法+数据结构
litoujkl
这个作者很懒,什么都没留下…
展开
-
调整数组顺序使奇数位于偶数前面
void Process(int a[], int n){ if (a == NULL || n < 2) return; int low = 0, high = n - 1; int last = low; for (int i = 0; i < n; ++i) { if (a[i] % 2 == 1) { swap(a, last++, i); } }}voi原创 2015-08-28 15:48:53 · 254 阅读 · 0 评论 -
输入一个正数s,打印出所有和为s的连续正数序列(至少包含两个数)
void FindContinuousSequence(int sum){ if (sum < 3) return; int small = 1; int big = 2; int middle = (1 + sum) / 2; int curSum = small + big; while (small < middle) { if (curSum == sum)转载 2015-09-07 16:53:10 · 633 阅读 · 0 评论 -
二叉树中和为某一值的路径
void FindPath(BinaryTreeNode *pRoot, int expectedSum){ if (pRoot == NULL) return; std::vector path; int currentSum = 0; FindPath(pRoot, expectedSum, path, currentSum);转载 2015-08-04 12:40:05 · 242 阅读 · 0 评论 -
判断一个二叉树是否是平衡二叉树(AVL)
要求:输入一个二叉树的根节点,判断该树是不是平衡二叉树平衡二叉树:任意一节点左右子树的高度之差的绝对值小于2bool isAVL(BinaryTreeNode *pRoot, int &height){if (pRoot == NULL){height = 0;return true;}// 判断左子树是否是平衡树int heightLeft;原创 2015-05-25 10:28:35 · 1409 阅读 · 1 评论 -
二叉树遍历---非递归实现
// 二叉树的二叉链表存储表示typedef int ElemType;typedef struct BinaryTreeNode { ElemType data; struct BinaryTreeNode *lchild; struct BinaryTreeNode *rchild;}BinaryTreeNode;// 先序遍历原创 2015-08-04 12:13:05 · 338 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数。例如输入数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4// 找出目标数字(target)在有序数组中第一次出现的位置int searchFirstPos(int A[], int N, int target){if (N return -1;int low = 0,原创 2015-05-25 08:30:56 · 463 阅读 · 0 评论 -
七大排序算法
// 冒泡排序 void bubble(int a[],int n) { int i,k,temp; for (k = 0; k < n-1; k++) { for (i = k + 1; i < n; i++) { if (a[k] > a[i原创 2015-08-28 17:26:39 · 523 阅读 · 0 评论 -
数组中出现次数超过一半的数字
一、基于Partition函数的O(n)算法数组中有一个数字出现的次数超过了数组长度的一半,如果把这个数组排序,那么排序之后位于数组中间的数字一定就是那个出现次数超过数组长度一半的数字。int MoreThanHalfNum(int *numbers, int length){if (CheckInvalidArray(numbers, length))return 0转载 2015-05-25 15:41:53 · 373 阅读 · 0 评论 -
对数组的两个子有序段进行合并
问题描述:数组a[0, mid - 1]和a[mid, n - 1]是各自有序的,对数组a[0, n - 1]的两个子有序段进行合并,得到a[0, n - 1]整体有序。要求空间复杂度为O(1)分析:由于限定的空间复杂度为O(1),因此不能使用归并排序。具体思路:首先遍历数组中下标为0 ~ mid - 1的元素,将遍历到的元素的值与a[mid]进行比较,当遍历到a[i](0 在a[mid,转载 2015-09-06 09:18:30 · 703 阅读 · 1 评论 -
求解数组中的逆序对
public class Test { public static int reverseCount = 0; public static void merge(int array[], int begin, int mid, int end) { int i, j, k, n1, n2; n1 = mid - begin + 1; n2 = end - mid; int[]转载 2015-09-06 10:49:39 · 285 阅读 · 0 评论 -
分治法:寻找最大子数组
#include #define MAGIC -999999/* 子数组结构体 */struct sub_array{ int low; int high; int sum; // 子数组的和};struct sub_array find_max_crossing_subarray(int a[], int low, int mid, int high);struct sub原创 2015-09-06 09:51:40 · 377 阅读 · 0 评论 -
求绝对值最小的数
问题描述:有一个升序排列的数组,数组中可能有正数、负数或0,求数组中元素的绝对值最小的数。例如,数组{-10, -5, -2, 7, 15, 50},绝对值最小的是-2思路:如果数组中第一个元素为非负数,那么绝对值最小的数就是数组的第一个元素;如果数组的最后一个元素为负数,那么绝对值最小的数肯定是数组的最后一个元素;当数组中既有正数又有负数时,利用二分法来查找正数和负数的分界点的方法。其主要思转载 2015-09-07 15:59:26 · 891 阅读 · 0 评论 -
反转单链表
ListNode * Reverse(ListNode *pHead){ if (pHead == NULL) return NULL; ListNode * pNewHead = NULL; ListNode * pCur = pHead; ListNode * pLast = NULL; while (pCur != NULL) { pLast = pCur; pC原创 2015-08-28 15:55:05 · 252 阅读 · 0 评论 -
移除源字符串中的目标串
private static String removeGivenSet(String src, Set set) { if (src != null) { for (String item : set) { int idx = src.indexOf(item); if (idx != -1)原创 2016-09-18 15:45:15 · 435 阅读 · 0 评论 -
最小的K个数
从“数组中出现次数超过一半的数字”得到启发,同样可以基于Partition函数来解决。void GetLeastNumbers(int *input, int n, int *output, int k){if (input == NULL || output == NULL || k > n || n return;int start = 0;int end转载 2015-05-25 19:12:28 · 295 阅读 · 0 评论 -
第一个只出现一次的字符
题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出'b'。char FirstNotRepeatingChar(char *pString){if (pString == NULL)return '\0';const int tableSize = 256;unsigned int hashTable[tableSize];for转载 2015-05-26 09:17:55 · 297 阅读 · 0 评论 -
1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次
(1) 方法一:(当N为比较大时警惕溢出)将1001个元素相加减去1,2,3,……1000数列的和,得到的差即为重复的元素。(2) 方法二:异或操作void FindRepeat(int array[], int length){ int result = 0; for(int i=1;i原创 2015-05-25 11:09:08 · 761 阅读 · 0 评论 -
将二叉查找树转换为有序的双向链表
// pFirstNode:转换后双向链表的第一个节点的指针// pLastNode:转换后双向链表的最后一个节点的指针void Convert(BinaryTreeNode *pRoot, BinaryTreeNode *&pFirstNode, BinaryTreeNode *&pLastNode){ BinaryTreeNode *pFirstLeft, *pLastLeft转载 2015-08-29 18:46:25 · 934 阅读 · 0 评论 -
求二叉树中两个节点的最低公共祖先
// 找到根节点到目标节点的一条路径,如果存在的话,保存到path中bool GetNodePath(BinaryTreeNode *pRoot, BinaryTreeNode *pNode, list &path){ if (pRoot == pNode) { path.push_back(pRoot); return true; } if (pRoot == NULL)转载 2015-08-29 17:27:56 · 432 阅读 · 0 评论 -
判断二叉树是不是平衡二叉树
递归解法:(1)如果二叉树为空,返回真(2)如果二叉树不为空,如果左子树和右子树都是AVL树,且左子树和右子树高度相差不大于1,返回真,其他返回假bool IsAVL(BinaryTreeNode *pRoot, int &height){ if (pRoot == NULL) { height = 0; return true; } int heightLeft;转载 2015-08-29 17:39:34 · 399 阅读 · 0 评论 -
求二叉树叶子节点的个数
递归解法:(1)如果二叉树为空,返回0(2)如果二叉树不为空且左右子树为空,返回1(3)如果二叉树不为空且左右子树不同时为空,返回左子树中的叶子节点个数加上右子树中的叶子节点个数int GetLeafNodeNum(BinaryTreeNode *pRoot){ if (pRoot == NULL) return 0; if (pRoot->lchild ==转载 2015-08-29 18:27:22 · 425 阅读 · 0 评论 -
斐波那契数列
已知斐波那契数列满足:fib(0) = 0;fib(1) = 1;fib(-1) = 1;fib(-2) = -1;fib(-5) = 5;fib(-8) = -21;给定一个整数n(可以为负),求出fib(n)按照思维定式,大家都会写出:fib(n) = fib(n-1) + fib(n-2) n >= 2 这样的递推公式;但是无法求出n为负原创 2015-08-29 16:08:48 · 422 阅读 · 0 评论 -
求二叉树节点的最大距离
即二叉树中相距最远的两个节点之间的距离。递归解法:(1)如果二叉树为空,返回0,同时记录左子树和右子树的深度,都为0(2)如果二叉树不为空,最大距离要么是左子树的最大距离,要么是右子树的最大距离,要么是左子树节点中到根节点的最大距离+右子树节点中到根节点的最大距离,同时记录左子树和右子树节点中到根节点的最大距离。int GetMaxDistance(BinaryTreeNode转载 2015-08-29 17:11:00 · 419 阅读 · 0 评论 -
求二叉树的镜像
递归解法:(1)如果二叉树为空,返回空(2)如果二叉树不为空,求左子树和右子树的镜像,然后交换左子树和右子树BinaryTreeNode *Mirror(BinaryTreeNode *pRoot){ if (pRoot == NULL) return NULL; BinaryTreeNode *pLeft = Mirror(pRoot->lchild); //转载 2015-08-29 17:50:58 · 376 阅读 · 0 评论 -
判断两棵二叉树是否同构
不考虑数据内容。意味着对应的左子树和右子树都结构相同。递归解法:(1)如果两棵二叉树都为空,返回真(2)如果两棵二叉树一颗为空,另一棵不为空,返回假(3)如果两棵二叉树都不为空,如果对应的左子树和右子树都同构,返回真,其他返回假bool StructureCmp(BinaryTreeNode *pRoot1, BinaryTreeNode *pRoot2){ if (p转载 2015-08-29 18:12:49 · 2541 阅读 · 0 评论 -
求二叉树第K层的节点个数
递归解法:(1)如果二叉树为空或者K(2)如果二叉树不为空且K=1,返回1(3)如果二叉树不为空且K>1,返回左子树中K-1层的节点个数与右子树K-1层节点个数之和int GetNodeNumKthLevel(BinaryTree *pRoot, int k ){if (pRoot == NULL || k return 0;if (k == 1)ret转载 2015-08-29 18:19:22 · 785 阅读 · 0 评论 -
二维数组的合并为有序的一维数组
java案例:new int[][] {new int[] {2, 3, 4},new int[] {2, 3, 4, 5},new int[] {4, 5, 6, 8}}; 每个一维数组都有序合并为有序的一维数组:{2, 3, 3, 4, 4, 4, 5, 5,6, 8}思路:多路归并算法将二维数组视为k个一维数组,每次取k个数组里面第一个最小的,然后从其原创 2015-08-29 16:21:59 · 2210 阅读 · 0 评论 -
斐波那契数列第N项的值---动态规划
const int MAX = 101;double map[MAX];// 数组map[MAX]暂存中间调用结果,避免重复计算 */double fib(int n){ if (n == 1 || n == 2) { return 1; } else if (map[n] > 0) { return map[n]; } else { map[n] =原创 2015-08-28 16:24:31 · 651 阅读 · 0 评论 -
有序数组,输出和为m的所有数对(pair)
例如:{-5, -1, 0, 1, 2, 3, 4, 7, 8,10} ,m=5,那么满足条件的pairs: (-5,10) (1, 4) (2, 3)void printPair(int A[], int N, int target){int i, j;i = 0, j = N - 1;while (i {if (A[i] + A[j] > targ原创 2015-05-25 14:40:06 · 530 阅读 · 0 评论 -
连续子数组的最大和
输入一个整型数组,数组里有正数也有负数,数组中一个或者连续的多个整数组成一个子数组。求所有子数组和的最大值,要求时间复杂度为O(n)int FindGreatestSumOfSubArray(int *pData, int nLength){assert (pData == NULL || nLength int nCurSum = 0;int nGreates转载 2015-05-25 20:53:23 · 235 阅读 · 0 评论 -
HTTPS
‘安全的HTTP协议’在应用层和传输层之间,引入(SSL/TLS)HTTPS涉及到的几个算法:非对称加密(握手阶段):主要用来确立双方通信的加密密钥。服务器返回给浏览器的证书中,包含其公钥等信息,浏览器会生产一串随机数的密码用于后面通信内容的加密(对称加密)。浏览器用服务器的公钥对该数字密码进行加密,发给服务器对称加密(正常通信阶段):考虑到算法效率等原因,握手成功后,通信内容利用对称加密HASH...原创 2018-05-13 15:51:24 · 312 阅读 · 0 评论