算法
城北programmer
*
展开
-
验证IP地址是否正确
class Solution {public: /** * 验证IP地址 * @param IP string字符串 一个IP地址字符串 * @return string字符串 */ string solve(string IP) { istringstream is(IP); string tmp = ""; int cnt = 0; if (IP.find(':')==IP.npo.原创 2021-08-10 00:32:32 · 277 阅读 · 0 评论 -
二叉树遍历(C++)
#include<iostream>#include<stack>//二叉树节点struct Node { int value; Node* left; Node* right; Node(int value): value(value), left(nullptr), right(nullptr) {}};//递归方式实现先序遍历void preOrderRecur(Node* head) { if (head .原创 2021-08-01 14:23:21 · 76 阅读 · 0 评论 -
常见位运算表达式
1. x &= x-1含义: 丢弃 x 二进制最右边的1用途:统计二进制中1的个数int count = 0;while(x){ x &= x-1 ; count++;}2. n & 1用途:判断一个整数是奇数还是偶数n & 1 ==0 n为偶数n & 1 ==1 n为奇数3.a ^= b; b ^= a; a ^= b;用途:交换两数字4.n & (n...原创 2021-07-31 13:43:34 · 312 阅读 · 0 评论 -
单链表逆置
单链表逆置//带头结点的void Reverse(List plist){ assert(plist!=NULL); List p,q,s; p = plist->next; q = NULL; plist->next = NULL; while (p != NULL) { s = p->next; p->next = q; q = p; p = s; } plist->next = q;}/* 利用头插实现单链表的原创 2021-03-09 13:32:45 · 238 阅读 · 0 评论 -
动态规划
动态规划问题动态规划法的基本思想:动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题, 先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法解这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费指数时间。然而,不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重原创 2021-04-27 22:55:36 · 118 阅读 · 0 评论 -
红黑(RB)树
RB 树的定义RB树概述:红黑树(Red Black Tree)是一种种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的:它可以在 O(log2 n)时间内做查找,插入和删除,这里的n是树中元素的数目。RB树性质红黑树是每个节点都带有颜色属性的二叉查找树,颜色是红色或黑色。在二叉原创 2021-04-23 17:27:25 · 480 阅读 · 0 评论 -
求两个字符串的最长公共子序列(动态规划)
#include<iostream>#include<vector>#include<deque>#include<limits.h>#include<string>using namespace std;int LCSLength(char X[], char Y[], int i, int j, vector<vector<int> > &c,vector<vector<int...原创 2021-04-20 22:34:11 · 313 阅读 · 0 评论 -
归并排序
递归实现void Copy(int* dist, int* src, int left, int right){ for (int i = left; i <= right; ++i) { dist[i] = src[i]; }}void Merge(int *dist,int *src, int left, int m, int right){ int i = left, j = m + 1; int k = left; while (i <= m &&原创 2021-04-20 20:15:16 · 52 阅读 · 0 评论 -
平衡(AVL)二叉树
AVL树 解决二叉查找(BST)树所有节点都倾向一边,退化成链表的缺点具有二叉查找树的全部特性。每个节点的左子树和右子树的高度差至多等于1定义节点#include<iostream>#include<vector>#include<stack>using namespace std;typedef int KeyType;typedef struct AVLNode{ AVLNode* leftchild; AVLNode* parent;.转载 2021-04-20 19:46:53 · 73 阅读 · 0 评论 -
求一维点集最接近点对算法
#include<iostream>#include<vector>#include<deque>#include<limits.h>using namespace std;#define INT_MAX 2147483647int Parition(vector<int>& br, int left, int right)//划分区间{ int i = left, j = right; int tmp = br..原创 2021-04-19 21:15:57 · 201 阅读 · 0 评论 -
一次遍历寻找数组中最大的前两个数
void PrintMax12(const vector<int>& br){ if (br.size() < 2) return; int max1 = br[0] > br[1] ? br[0] : br[1]; int max2 = br[0] > br[1] ? br[1] : br[0]; for (int i = 2; i < br.size(); ++i) { if (br[i] > max1) { max2 = ma原创 2021-04-19 17:30:11 · 334 阅读 · 0 评论 -
寻找数组中第K小的数(分治策略实现)
#include<iostream>#include<vector>#include<deque>using namespace std;int Parition(vector<int>& br, int left, int right)//划分区间函数{ int i = left, j = right; int tmp = br[i]; while (i < j) { while (i < j &&原创 2021-04-19 17:28:00 · 223 阅读 · 0 评论 -
(分治策略)快排的不同方法实现(递归、非递归、随机分区、单向划分、链表快排)
快速排序递归快排一void quickSort(int *array, int left, int right){ if(left < right) { int pivot = array[left]; int low = left, high = right; while(low < high) { while(array[high] >= pivot && low < high) high--; array[low]原创 2021-04-18 17:26:56 · 130 阅读 · 0 评论 -
二叉搜索树(BST)
定义结点#include<iostream>#include<vector>#include<stack>using namespace std;typedef int KeyType;typedef struct BstNode{ KeyType key; BstNode* leftchild; BstNode* parent; BstNode* rightchild;}BstNode, * BSTree;原创 2021-04-06 23:20:38 · 148 阅读 · 0 评论 -
二叉树遍历、查找、判段满二叉树、完全二叉树(C++)
结点#include<iostream>#include<stack>using namespace std;typedef char ElemType;typedef struct BtNode // BinaryTreeNode{ BtNode* leftchild; BtNode* rightchild; ElemType data;}BtNode, * BinaryTree;新建结点BtNode* Buynode(){ BtNode* s原创 2021-03-30 12:55:45 · 234 阅读 · 0 评论 -
分治策略
分治策略递归与分治策略:是将规模比较大的问题可分割成规模较小的相同问题。问题不变,规模变小。 这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。递归:若一个函数直接地或间接(最好不用间接)地调用自己,则称这个函数是递归的函数。(简单地描述为 “自己调用自己”) .分治法所能解决的问题-般具有以下四个特征:该问题的规模缩小到 定的程度就可以容易地解决。该问题可以分解为若干个规模较小的相同问题。使用小规模的解 可以合并成,该问题原规模的原创 2021-03-22 20:12:43 · 372 阅读 · 0 评论