![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
imprincess
这个作者很懒,什么都没留下…
展开
-
切金条——贪心策略(堆)
题目说明: 一块金条切成两半,是需要花费和长度数值一样的铜板的。比如 长度为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 评论 -
剑指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 评论 -
等式去括号后的等价变换
题目说明:等式只包括+、-、(、)以及小写字母等字符,判断去掉括号后的等价等式,如以下例子: 输入样例:(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 评论 -
leetcode8——字符串转整数
分三种情况讨论: 1. 判断是否为空:输入为空时,输出0,并标记是因为非法输入导致的 2. 错误输入:如果字符串的前部分字符为空,此时忽略前面为空的部分,即从有正常字符的位置开始计算,如输入字符串为“ 42”,则输出为42; 3. 特殊输入:第一个有效字符是否为‘+’或‘-’,则先判断最后输出的整数位正还是负数 4. 考虑溢出等情况,如INT_MIN, INT_MAX;class ...原创 2018-09-12 14:20:25 · 394 阅读 · 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 评论 -
给定一个数组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 · 1057 阅读 · 1 评论 -
Leecode3——无重复字符的最长子串
题目说明: 如,在”abcabcbb”中,其无重复字符的最长子字符串是”abc”,其长度为 3; 对于,”bbbbb”,其无重复字符的最长子字符串为”b”,长度为1。 基本思路: 遍历该字符串,往集合里面插入元素; (1)插入成功,说明无重复,继续插入; (2)插入不成功时,元素有重复,记录当前最大长度,查找与当前元素重复的前面重复元素的下标,并清空集合,并从该下标的下一个位置继续插入...原创 2018-09-10 18:39:35 · 174 阅读 · 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 评论 -
找出所有路径跨越的总和
解题思路: (1)将输入的路径按照起点值的大小排序:如测试用例1中排序完后应该是 1 2 4 7 5 8 (2)依次计算每段路径的长度,且要判断是否与前面的路径发生重叠,如果发生重叠,则以当前路径的终点减去上一段路径的终点;如果没有重叠时,则以当前路径的终点减去当前路径的起点;即以当前路径的终点减去二者之间的最大值(上一段路径的终点和当前路径的起点)#include&amp;lt;ios...原创 2018-09-15 14:30:56 · 152 阅读 · 0 评论 -
lintcode100——删除排序数组中的重复数字
题目说明:给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度。 要求:不要使用额外的数组空间,必须在原地没有额外空间的条件下完成。 算法思想:通过遍历数组,记录重复元素区间的第一个位置和最后一个元素的下一个位置,通过copy将后面的元素往前移动,过滤掉多余的重复元素,同时通过resize更新数组的最新长度,继续遍历,重复该过滤操作。最后返回最新数组的...原创 2018-08-25 14:39:19 · 157 阅读 · 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 · 234 阅读 · 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 · 455 阅读 · 4 评论 -
基于荷兰国旗问题的快速排序
//基于荷兰国旗问题的快排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 评论 -
堆排序
#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 评论 -
贪心策略——项目利润
题目描述: 输入: cost[]:每个项目的花费 profits[]:每个项目的利润(纯利润) k:最多能做k个项目 w:表示初始资金 输出:最后获得的最大钱数 说明:一次只能做一个项目,且做完一个之后马上就能获得收益,可以支持做下一个项目/*贪心策略:当资金有限时如何选择那个项目使得挣的钱最多算法思想:(1)将所有项目按照花费值costs加入到小根堆中(2)从小根堆中取...原创 2018-08-22 15:01:42 · 317 阅读 · 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 · 136 阅读 · 0 评论 -
连续子数组最大和
对于其中的测试用例:{-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 · 129 阅读 · 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 评论 -
剑指offer——数组中出现次数超过一半的数字
给定一个字符串,求一个最长子串使得A和B数量相等#include&lt;iostream&gt;#include&lt;string&gt;#include&lt;vector&gt;using namespace std;int getSubstring(string &amp;s){ if(s.empty()) return -1;原创 2018-08-23 17:39:00 · 183 阅读 · 0 评论 -
lintcode254——Drop eggs(动态规划)
#include&lt;iostream&gt;#include&lt;vector&gt;#include&lt;algorithm&gt;using namespace std;//鸡蛋数为2个int dropEggs(int n) { if(n &lt;= 0) return -1; int **dp = new int *[3];//n层楼,两个原创 2018-08-29 17:24:43 · 379 阅读 · 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 · 2706 阅读 · 0 评论