C++
imprincess
这个作者很懒,什么都没留下…
展开
-
lintcode254——Drop eggs(动态规划)
#include<iostream>#include<vector>#include<algorithm>using namespace std;//鸡蛋数为2个int dropEggs(int n) { if(n <= 0) return -1; int **dp = new int *[3];//n层楼,两个原创 2018-08-29 17:24:43 · 370 阅读 · 0 评论 -
剑指offer——数组中出现次数超过一半的数字
给定一个字符串,求一个最长子串使得A和B数量相等#include<iostream>#include<string>#include<vector>using namespace std;int getSubstring(string &s){ if(s.empty()) return -1;原创 2018-08-23 17:39:00 · 175 阅读 · 0 评论 -
360笔试(2018.08.27)
#include<iostream>#include<vector>#include<algorithm>using namespace std;int main(){ int N; cin>>N; vector&am原创 2018-08-27 23:04:59 · 455 阅读 · 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 · 102 阅读 · 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 · 3472 阅读 · 1 评论 -
连续子数组最大和
对于其中的测试用例:{-5,3,2,-1,4,-3}; arr -5 3 2 -1 4 -3 sum_index 3 8 5 3 4 -3 sum_max_index 4 4 4 4 4 5sum_max[i]代表i开头的所有子数组的最大累加和 sum_max_index[i]取得最大...原创 2018-08-22 21:51:03 · 123 阅读 · 0 评论 -
简单的动态规划----爬楼梯问题
#include<iostream>#include<map>using namespace std;/*有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。*///递归算法int getClimbingWays(int n){ if(n < 1){ return ...原创 2018-08-19 21:47:39 · 366 阅读 · 0 评论 -
杨辉三角
#include<stdio.h>#include<iostream>using namespace std;//第n层(顶层为0层)正好对应于二项式展开系数//创建杨辉三角,N表示三角形的行数void main(){ int rows = 10; for(int i = 0; i < rows; i ++){ int n...原创 2018-08-22 16:48:26 · 103 阅读 · 0 评论 -
冒泡和快排数据元素交换过程
#include<iostream>#include<windows.h>using namespace std;void swap(int *arr, int i, int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;}void printArray(int *arr, ...原创 2018-08-22 15:41:24 · 131 阅读 · 0 评论 -
贪心策略——项目利润
题目描述: 输入: cost[]:每个项目的花费 profits[]:每个项目的利润(纯利润) k:最多能做k个项目 w:表示初始资金 输出:最后获得的最大钱数 说明:一次只能做一个项目,且做完一个之后马上就能获得收益,可以支持做下一个项目/*贪心策略:当资金有限时如何选择那个项目使得挣的钱最多算法思想:(1)将所有项目按照花费值costs加入到小根堆中(2)从小根堆中取...原创 2018-08-22 15:01:42 · 313 阅读 · 0 评论 -
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 · 237 阅读 · 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 · 1295 阅读 · 1 评论 -
堆排序
#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 · 101 阅读 · 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 · 141 阅读 · 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 · 319 阅读 · 0 评论 -
动态规划求组合数
动态规划求组合数 C(n,m)=C(n-1,m)+C(n-1,m-1), 满足n>=m且n>0 (1)n=0时,无意义,n< m时,无意义 (2) m = 0时,C(n, 0) =1; m=1时, C(n, 1)=n; (3) n=1时,C(n,m) = 1; m=n时,C(n,m)=1; (4) 否则C(n, m) = C(n-1, m-1)+ C(n-1...原创 2018-09-01 11:57:42 · 2606 阅读 · 0 评论 -
小Q的歌单
#include&amp;amp;lt;iostream&amp;amp;gt;#include&amp;amp;lt;vector&amp;amp;gt;using namespace std;long long dp[101][101];const int M = 1000000007;//求组合数C(n,m)void fun(){ for(int i = 0; i &amp;amp;lt; 102;原创 2018-09-01 12:32:22 · 230 阅读 · 0 评论 -
lintcode100——删除排序数组中的重复数字
题目说明:给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度。 要求:不要使用额外的数组空间,必须在原地没有额外空间的条件下完成。 算法思想:通过遍历数组,记录重复元素区间的第一个位置和最后一个元素的下一个位置,通过copy将后面的元素往前移动,过滤掉多余的重复元素,同时通过resize更新数组的最新长度,继续遍历,重复该过滤操作。最后返回最新数组的...原创 2018-08-25 14:39:19 · 152 阅读 · 0 评论 -
找出所有路径跨越的总和
解题思路: (1)将输入的路径按照起点值的大小排序:如测试用例1中排序完后应该是 1 2 4 7 5 8 (2)依次计算每段路径的长度,且要判断是否与前面的路径发生重叠,如果发生重叠,则以当前路径的终点减去上一段路径的终点;如果没有重叠时,则以当前路径的终点减去当前路径的起点;即以当前路径的终点减去二者之间的最大值(上一段路径的终点和当前路径的起点)#include&amp;lt;ios...原创 2018-09-15 14:30:56 · 146 阅读 · 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 · 148 阅读 · 0 评论 -
圈地运动——多边形构成问题
题目描述:给n个木棒以及木棒的长度,求最少能构成多边形的木棒数目。要求如果选择第i个木棒,就必须选择前面的(i-1)个,即要按照木棒给出的顺序来选择。如果不能构成多边形,则返回-1;否则返回构成多边形的木棒数量。输入描述:3 (木棒数量)6 8 10 (每根木棒对应的长度)输出描述:3 (6,8,10刚好能构成三角形,满足两边之和大于第三边)同理:N多边形的构成条件也是(N-1)条边...原创 2018-09-18 11:15:05 · 674 阅读 · 0 评论 -
Leecode3——无重复字符的最长子串
题目说明: 如,在”abcabcbb”中,其无重复字符的最长子字符串是”abc”,其长度为 3; 对于,”bbbbb”,其无重复字符的最长子字符串为”b”,长度为1。 基本思路: 遍历该字符串,往集合里面插入元素; (1)插入成功,说明无重复,继续插入; (2)插入不成功时,元素有重复,记录当前最大长度,查找与当前元素重复的前面重复元素的下标,并清空集合,并从该下标的下一个位置继续插入...原创 2018-09-10 18:39:35 · 168 阅读 · 0 评论 -
给定一个数组arr,返回子数组的最大累加和
#include <iostream>using namespace std; int maxSum(int *arr, int L){ if(arr==NULL || L == 0){ return 0; } int Max=INT_MIN; int cur=0; for(int i=0;i!=L;i++){ ...原创 2018-09-10 18:26:37 · 1050 阅读 · 1 评论 -
剑指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 · 150 阅读 · 0 评论 -
leetcode8——字符串转整数
分三种情况讨论: 1. 判断是否为空:输入为空时,输出0,并标记是因为非法输入导致的 2. 错误输入:如果字符串的前部分字符为空,此时忽略前面为空的部分,即从有正常字符的位置开始计算,如输入字符串为“ 42”,则输出为42; 3. 特殊输入:第一个有效字符是否为‘+’或‘-’,则先判断最后输出的整数位正还是负数 4. 考虑溢出等情况,如INT_MIN, INT_MAX;class ...原创 2018-09-12 14:20:25 · 372 阅读 · 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 · 89 阅读 · 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 · 583 阅读 · 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 · 116 阅读 · 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 · 110 阅读 · 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 · 75 阅读 · 0 评论 -
剑指offer——包含min函数的栈
(1) 每次弹出栈顶能保证min,因此压入栈的时候我们队栈里面的元素做排序操作,使得最小的元素处于栈顶的位置, 但是这样不能保证栈的先入后出的规则 (2) 对于时间复杂度有一定的要求,那么我们可以考虑以空间换时间的思想#include<iostream>#include<stack>using namespace std;//包含min函数的栈class S...原创 2018-09-04 14:53:30 · 92 阅读 · 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 · 1098 阅读 · 0 评论 -
荷兰国旗问题
给一个数组arr和一个数字num,小于num放在左边,等于num的放在中间,大于num的放在右边void *partition(int *arr, int L, int R, int num){ int less = L - 1; int more = R + 1; int cur = L; while(cur < more){ if(a...原创 2018-08-12 22:14:03 · 220 阅读 · 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 · 336 阅读 · 0 评论 -
冒泡排序的对数器使用——C++版本
#include<iostream>#include<math.h>#include<algorithm>#include<vector>#include<time.h>#include<malloc.h>using namespace std;//void swap(int *arr, int i, int ...原创 2018-08-12 17:23:38 · 449 阅读 · 4 评论 -
malloc/free与new/delete有什么不同?
操作对象不同 (1) malloc/free是C/C++语言的标准库函数,而new/delete是C++的运算符 (2) 由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,所以无法执行构造和析构函数 (3) new的执行过程:首先调用名为operator new的标准库函数,分配足够大的原始的未类型化的内存,保存指定类型的一个对象;然后运行该类型的一个构造函数,用指定...原创 2018-03-15 21:47:30 · 147 阅读 · 0 评论 -
CCF认证——201412-1门禁系统(C++)
试题编号: 201412-1 试题名称 门禁系统 时间限制 1.0s 内存限制 256.0MB 问题描述 问题描述 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况。每位读者有一个编号,每条记录用读者的编号来表示。给出读者的来访记录,请问每一条记录中的读者是第几次出现。输入格式 输入的第一行包含一个整数n,表示...原创 2018-03-08 19:05:03 · 748 阅读 · 0 评论 -
CCF认证——201503-1图像旋转(C++)
试题编号 201503-1 试题名称 图像旋转 时间限制 5.0s 内存限制 256.0MB 问题描述 问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。输入格式 输入的第一行包含两个整数n, m...原创 2018-03-08 16:24:07 · 371 阅读 · 0 评论 -
CCF认证——201512-1位数之和(C++)
试题编号: 201512-1 试题名称: 数位之和 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个十进制整数n,输出n的各位数字之和。输入格式 输出一个整数,表示答案。 样例输入 20151220样例输出 13样例说明 20151220的各位数字之和为2+0+1+5+1+2+2+...原创 2018-03-08 15:17:57 · 487 阅读 · 0 评论 -
CCF认证——201604-1折点计数(C++)
试题编号: 201604-1 试题名称: 折点计数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个整数表示一个商店连续n天的销售量。如果某天之前销售量在增长,而后一天销售量减少,则称这一天为折点,反过来如果之前销售量减少而后一天销售量增长,也称这一天为折点。其他的天都不是折点。如下图中,第3天...原创 2018-03-08 14:27:48 · 251 阅读 · 0 评论