![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
imprincess
这个作者很懒,什么都没留下…
展开
-
剑指offer——包含min函数的栈
(1) 每次弹出栈顶能保证min,因此压入栈的时候我们队栈里面的元素做排序操作,使得最小的元素处于栈顶的位置, 但是这样不能保证栈的先入后出的规则 (2) 对于时间复杂度有一定的要求,那么我们可以考虑以空间换时间的思想#include<iostream>#include<stack>using namespace std;//包含min函数的栈class S...原创 2018-09-04 14:53:30 · 97 阅读 · 0 评论 -
剑指offer——从上往下打印二叉树
一开始没有写(1)(2)判断语句,提交答案出错class Solution {public: vector<int> PrintFromTopToBottom(TreeNode* root) { vector<int> result; if(root == NULL)//(1)重要 return resu...原创 2018-09-04 15:14:45 · 79 阅读 · 0 评论 -
剑指offer——二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。class Solution { bool judge(vector<int> &sequence, int l, int r){ if(l>=r) return true; int i = ...原创 2018-09-04 15:49:27 · 111 阅读 · 0 评论 -
合并两个排序的链表
#include&lt;iostream&gt;using namespace std;struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};class Solution {public: L...原创 2018-09-02 20:16:26 · 123 阅读 · 0 评论 -
等式去括号后的等价变换
题目说明:等式只包括+、-、(、)以及小写字母等字符,判断去掉括号后的等价等式,如以下例子: 输入样例:(a+b)-(d-f+e)+h-i-(k-s)+(n-r) 输出样例:a+b-d+f-e+h-j-k+s+n-r 思路:(1)设定两个指针st1,st2,指针st1始终跟在st2后面遍历,当st2碰到’(‘时,判断st1指向的字符是否为‘-’, (2)若是,则括号内的符号需要变号,即从’...原创 2018-09-15 20:00:16 · 595 阅读 · 0 评论 -
最小的k个数
#include &lt;iostream&gt;#include &lt;stdio.h&gt;#include &lt;math.h&gt;#include &lt;string&gt;#include &lt;vector&gt;using namespace std;int Partition(int low,int high,原创 2018-09-06 16:41:00 · 92 阅读 · 0 评论 -
剑指offer——把数组排成最小的数
方法一:用标准库中的next_permutation()进行暴力法求解:class Solution {public: string PrintMinNumber(vector&lt;int&gt; numbers) { if(numbers.empty()){ return NULL; } sort(numbe...原创 2018-09-17 14:09:28 · 155 阅读 · 0 评论 -
圈地运动——多边形构成问题
题目描述:给n个木棒以及木棒的长度,求最少能构成多边形的木棒数目。要求如果选择第i个木棒,就必须选择前面的(i-1)个,即要按照木棒给出的顺序来选择。如果不能构成多边形,则返回-1;否则返回构成多边形的木棒数量。输入描述:3 (木棒数量)6 8 10 (每根木棒对应的长度)输出描述:3 (6,8,10刚好能构成三角形,满足两边之和大于第三边)同理:N多边形的构成条件也是(N-1)条边...原创 2018-09-18 11:15:05 · 688 阅读 · 0 评论 -
剑指offer——数组中出现次数超过一半的数字
class Solution {public: int MoreThanHalfNum_Solution(vector<int> numbers) { int length = numbers.size(); if(CheckInvalidArray(numbers, length)){ return 0; ...原创 2018-09-19 21:41:13 · 154 阅读 · 0 评论 -
切金条——贪心策略(堆)
题目说明: 一块金条切成两半,是需要花费和长度数值一样的铜板的。比如 长度为20的 金条,不管切成长度多大的两半,都要花费20个铜 板。一群人想整分整块金 条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共三个人,整块金条长度为 10+20+30=60. 金条要分成10,20,30三个部分。 如果, 先把长 度60的金条分成10和50,花费60 再把长度50的金条分成2...原创 2018-08-25 21:30:53 · 1111 阅读 · 0 评论 -
两个队列实现栈
#include<iostream>#include<stack>#include<queue>using namespace std;int popStack(queue<int> &q1, queue<int> &q2){ int top; if(q1.empty() && q原创 2018-08-22 23:23:21 · 105 阅读 · 0 评论 -
一个数组,负数放左边,正数放右边
快速排序一次划分的应用#include&lt;iostream&gt;using namespace std;void swap(int *arr, int i, int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;}void paritition(int *arr, int n){ i...原创 2018-08-22 22:39:22 · 3530 阅读 · 1 评论 -
排序后的数组相邻元素之间的最大差值
题目描述:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。思想:基于桶排序的基本思想。 分成n+1个桶,首先找出最小和最大值分别放在第一个桶和最后一个桶,剩下的n-1个桶按照数组的最大和最小值平均分。当数组元素大于2时,排序之后的相邻元素的最大差值肯定不是存在于同一个桶内,因此只需存储每个桶内的最大和最小值,以及该桶内是否有元素(1表示...原创 2018-08-14 20:28:21 · 2310 阅读 · 0 评论 -
二叉树的递归与非递归遍历
/*二叉树的递归遍历与非递归遍历*/#include<iostream>#include<stack>using namespace std;struct BiTreeNode{ int value; BiTreeNode *left; BiTreeNode *right; BiTreeNode(int data){ ...原创 2018-08-15 11:58:03 · 338 阅读 · 0 评论 -
基于荷兰国旗问题的快速排序
//基于荷兰国旗问题的快排partition2int *partition2(int *arr, int L, int R){ int less = L - 1; int more = R; while(L < more){ if(arr[L] < arr[R]){ swap(arr, ++ less, L ++); ...原创 2018-08-13 20:46:53 · 324 阅读 · 0 评论 -
经典快速排序
int partition(int *arr, int low, int high){ int pivot = arr[low]; while(low < high) { while(low < high && arr[high] >= pivot) --high; if(low &...原创 2018-08-13 21:38:27 · 144 阅读 · 0 评论 -
堆排序
#include&amp;lt;iostream&amp;gt;#include&amp;lt;math.h&amp;gt;#include&amp;lt;algorithm&amp;gt;#include&amp;lt;vector&amp;gt;#include&amp;lt;time.h&amp;gt;#include&原创 2018-08-13 22:00:59 · 105 阅读 · 0 评论 -
两个有序数组中,求所有数中第k个大的数字
#include&amp;lt;iostream&amp;gt;using namespace std;//两个有序数组中,求所有数中第k个大的数字int FirstKMax(int arr1[], int arr2[], int k, int L1, int L2){ if(L1 + L2 &amp;lt; k) return -1;//表示不存在第k个大的数 int count...原创 2018-08-22 13:31:18 · 1325 阅读 · 1 评论 -
leetcode197——排列序号
题目描述: 给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的编号。其中,编号从1开始。 例如,排列 [1,2,4] 是第 1 个排列。class Solution {public: long long permutationIndex(vector<int> &A) { vector<int> temp(A);...原创 2018-08-26 12:01:31 · 247 阅读 · 0 评论 -
贪心策略——项目利润
题目描述: 输入: cost[]:每个项目的花费 profits[]:每个项目的利润(纯利润) k:最多能做k个项目 w:表示初始资金 输出:最后获得的最大钱数 说明:一次只能做一个项目,且做完一个之后马上就能获得收益,可以支持做下一个项目/*贪心策略:当资金有限时如何选择那个项目使得挣的钱最多算法思想:(1)将所有项目按照花费值costs加入到小根堆中(2)从小根堆中取...原创 2018-08-22 15:01:42 · 317 阅读 · 0 评论 -
找出所有路径跨越的总和
解题思路: (1)将输入的路径按照起点值的大小排序:如测试用例1中排序完后应该是 1 2 4 7 5 8 (2)依次计算每段路径的长度,且要判断是否与前面的路径发生重叠,如果发生重叠,则以当前路径的终点减去上一段路径的终点;如果没有重叠时,则以当前路径的终点减去当前路径的起点;即以当前路径的终点减去二者之间的最大值(上一段路径的终点和当前路径的起点)#include&amp;lt;ios...原创 2018-09-15 14:30:56 · 152 阅读 · 0 评论