旋转数组最小数字

给定一个一个排序数组, 将前端部分数字放到数组尾部, 求出数组中的最小数字, [4,5,6,1,2,3] 返回1. 对于有序数组, 考虑使用二分查找法. 当 arr[mid] > arr[high] 时, 最小值必在【

动态规划集合

动态规划,提起来就头大┭┮﹏┭┮, 以本文记录常考的动态规划算法 在问题满足动态规划求解的时候, 动态规划主要靠维护一个数组来记录状态转移值, 只要

数组中数字出现的次数

给定一个数组, 假设其中有两个数只出现了一次, 其它均出现了两次, 让找出只出现了一次的两个数字. 对于数字出现次数, 可从异或角度出发. 当数组中只有

字符串全排列

给定字符串, 输出或统计全排列个数. 并去重 void judge(char* p, char* P1){ while(p<p1){ if(*p==*p1) return true; } return false; } void permutation(char* orig, char* ind_cur){ if(*ind_cur=='\0') cout<<orig<<endl; else{ for(char* p=ind_cur;p!='\0';p++){ if(judge(ind_cur, p)) continue; char temp = *p; *p=*ind_cur; *ind_cur=temp; permutation(orig, ind_cur+1); temp=*p; *p=*ind_cur; *ind_cur=temp; } } } void permutation(char* str){ if(str==nullptr) return; permutation(str,str); }

二叉树

树节点 struct TreeNode{ int val; TreeNode * left, * right; TreeNode(int val){ this->val = val; this->left=nullptr; this->right= nullptr; } }; 二叉树前中后序遍历递归非递归 // 递归实现 void pre_order(TreeNode * head){ if(head==nullptr) return; cout<<head->val<<endl; if(head->left) pre_order(head->left); if(head->right) pre_order(head->right); } void in_order(TreeNode * head){ if(head->left) in_order(head->left); cout<<head->val<<endl; if(head->right) in_order(head->right); } void post_order(TreeNode * head){ if(head->left) post_order(head->left); if(head->right)

堆排序以及topk问题

大根堆排序流程: 建堆, 构建二叉树, 父节点均大于子节点 将堆首元素与堆尾元素交换 重新调整堆, 不包含堆尾元素 void adjustHeap(std::vector<int> &arr, int p_ind, int size){ int l_child = 2 * p_ind + 1; while(l_child < size){ if(l_child