
算法
eversliver
这个作者很懒,什么都没留下…
展开
-
二叉搜索树的下一个结点
首先这题是有两种变形的,第一种TreeNode包含一个指向父节点的指针,然后直接给你一个节点,然你给出其下一个终须遍历节点的位置:/*struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *next;原创 2016-08-17 20:43:06 · 352 阅读 · 0 评论 -
二维子数组最大值
原数组B[M+1][N+1],但是存数的时候都是从1开始的,将B[i][0]和B[0][j]都初始化为0,方便未来的计算。下面计算以B[1][1]为左上角,右下角任意的矩形的元素和。用PS[M+1][N+1]存储。编程之美上的伪码如下for(i=0; i<=M; i++) PS[i][0]=0;for(j=0; j<=N; j++) PS[0][j]=0;for(i原创 2016-08-31 20:11:06 · 412 阅读 · 0 评论 -
旋转链表
注意不是翻转链表给出1->2->3->4->5->NULL 以及 k = 2, 返回 4->5->1->2->3->NULL.将链表从右边数第k个开始后面的全部交换到链表的左侧。例如对于1,2,3,4,5,6 和 k = 2,就有交换之后的节点就是5,6,1,2,3,4。注意这里的k可能会超过链表的长度大小。做法是首先可以计算链表的长度len,再将链表连成一个环状。接着从链表起始数len -原创 2016-08-19 20:45:57 · 335 阅读 · 0 评论 -
数组分割
数组分割先mark一下:数组分割原创 2016-08-31 21:01:50 · 353 阅读 · 0 评论 -
电话号码对应的英语单词
引用下别人的, 链接如下: 电话号码对应的英语单词原创 2016-08-31 21:41:29 · 608 阅读 · 0 评论 -
计算字符串的相似度-两种解法
计算字符串的相似度原创 2016-08-31 22:19:51 · 1940 阅读 · 0 评论 -
阶乘N!末尾0个数以及其最低位1的位置
首先是末尾的0的个数://这个实际上就是阶乘中含有的5的个数,如下://阶乘结尾0的个数int tailZero(int n){ int count = 0; for (int i = 0; i <= n; ++i){ while (i != 0 && i % 5 == 0){ count ++; //注意这里是++原创 2016-08-31 18:57:02 · 357 阅读 · 0 评论 -
最大乘积子数组
找到数组中的最大的子数组(连续的),使得他们的成绩最大:给出[2,3,-2,4],答案为[2,3] 结果为6,那么返回6.需要维护到目前位置连续的最大值以及最小值,因为负数最小值乘上正数的话那么就是最大值,所以也需要维护,代码如下:class Solution {public: int maxProduct(vector<int>& nums) { int sz =原创 2016-08-20 10:39:31 · 401 阅读 · 0 评论 -
找零问题
前面找钱问题的升级版本:返回给出硬币组合表示目标综合的最小的硬币数目:coins = [1, 2, 5], amount = 11, return 3 (11 = 5 + 5 + 1)coins = [2], amount = 3 return -1.int coinChange(vector<int>& coins, int amount) { vector<int> need(am原创 2016-08-20 11:17:59 · 398 阅读 · 0 评论 -
数独
有效数独 数独游戏原创 2016-08-31 17:30:05 · 587 阅读 · 3 评论 -
快排单链表
使用值排序可以借助快排来实现单链表的排序借一张图:代码如下://注意,慢指针始终停留在当前的最后一个小于pivot的节点上面struct ListNode{ ListNode * next; int val; ListNode(ListNode * _next, int _val) : next(_next), val(_val){}};ListNod原创 2016-08-18 16:16:16 · 434 阅读 · 0 评论 -
跳跃游戏
给一组数,每个格子中数字是可以向后跳的最大间隔,求是否可以跳到终点:A = [2,3,1,1,4],可以,返回trueA = [3,2,1,0,4], 不可以,返回false//贪心问题public boolean canJump(int[] nums) { int reachable = 0; for (int i=0; i<nums.length; ++i) {原创 2016-08-20 13:45:49 · 360 阅读 · 0 评论 -
分糖果
N个小孩站成一排,每个小孩必须给一块糖,标记等级高的小孩给的糖应该比其邻居高,且每个小孩至少要有一块,球所需的给的最少的糖的数目: int candy(vector<int> &ratings) { int size=ratings.size(); if(size<=1) return size; vector<int> num(size,1);原创 2016-08-20 14:07:04 · 398 阅读 · 0 评论 -
按之字形顺序打印二叉树
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。//使用两个栈可以完成class Solution {public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int> > result;原创 2016-08-17 21:05:12 · 824 阅读 · 0 评论 -
KMP算法
Next数组的含义是:next[i]分别代表长度为i的字符串的前缀与后缀的最大公共长度获得next数组vector<int> getNext(string str){ int len = str.length(); vector<int> next(len + 1); //分别代表长度为i的字符串的前缀与后缀的最大公共长度 if (len == 0) r原创 2016-08-20 17:44:15 · 298 阅读 · 0 评论 -
0-1背包问题
有n个物品,编号为i的物品的重量为w[i],价值为v[i],现在要从这些物品中选一些物品装到一个容量为m的背包中,使得背包内物体在总重量不超过m的前提下价值尽量大int maxPackage(vector<int> & w, vector<int> & v, int maxWeight){ int sz = w.size(); vector<int> dp(maxWeight +原创 2016-08-20 21:05:51 · 420 阅读 · 0 评论 -
二叉搜索树的第k个结点
给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。class Solution {private: int count = 0;public: TreeNode* KthNode(TreeNode* pRoot, unsigned int k){ if(pRoot){原创 2016-08-17 21:43:37 · 255 阅读 · 0 评论 -
树的几种非递归遍历
先序class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; if(!root) return res; stack<TreeNode * > s; s.push(root);原创 2016-08-19 15:12:55 · 326 阅读 · 0 评论 -
电梯调度算法
一栋楼有6层,现在设计一种电梯调度算法:电梯在一楼让大家上电梯,然后根据大家选择要到的楼层算出某一楼层i,电梯在i层停下让所有人下电梯,然后大家爬楼梯达到自己的楼层。请问电梯停在哪一层,可以使得这一次的所有乘客爬楼层之和最短?dp算法:假设停在i层,有N1个人在i层之下,N2个人在i层,N3个人在i层之上,若电梯停在i + 1层,则爬楼层总和需要增加 N1 + N2 - N3层,若N1 + N2原创 2016-08-31 15:53:42 · 3257 阅读 · 0 评论 -
堆箱子问题
有一堆箱子,每个箱子宽为wi,长为di,高为hi,现在需要将箱子都堆起来,而且为了使堆起来的箱子不到,上面的箱子的宽度和长度必须小于下面的箱子。请实现一个方法,求出能堆出的最高的高度,这里的高度即堆起来的所有箱子的高度之和。给定三个int数组w,l,h,分别表示每个箱子宽、长和高,同时给定箱子的数目n。请返回能堆成的最高的高度。保证n小于等于500。测试样例:[1,1,1],[1,1,1],[1原创 2016-09-01 09:59:22 · 2476 阅读 · 0 评论 -
变位词排序
请编写一个方法,对一个字符串数组进行排序,将所有变位词合并,保留其字典序最小的一个串。这里的变位词指变换其字母顺序所构成的新的词或短语。例如”triangle”和”integral”就是变位词。 给定一个string的数组str和数组大小int n,请返回排序合并后的数组。保证字符串串长小于等于20,数组大小小于等于300。测试样例:[“ab”,”ba”,”abc”,”cba”], 返回:[“原创 2016-09-01 10:13:56 · 383 阅读 · 0 评论 -
子串判断
难题,先mark: leetcode之word ladder原创 2016-09-01 16:33:23 · 489 阅读 · 0 评论 -
元素查找
有一个排过序的数组,包含n个整数,但是这个数组向左进行了一定长度的移位,例如,原数组为[1,2,3,4,5,6],向左移位5个位置即变成了[6,1,2,3,4,5],现在对于移位后的数组,需要查找某个元素的位置。请设计一个复杂度为log级别的算法完成这个任务。给定一个int数组A,为移位后的数组,同时给定数组大小n和需要查找的元素的值x,请返回x的位置(位置从零开始)。保证数组中元素互异。测试样原创 2016-09-01 11:00:13 · 435 阅读 · 0 评论 -
利用Trie树,来查找单词出现的次数
Trie节点class TrieNode { TrieNode nodes[]; boolean isSentence; //称为一个句子的话仍然可能会有子节点 int count; //表示当前节点实际上代表了多少个相同的单词 public TrieNode() { nodes = new TrieNode[26]; //26个英文字母原创 2016-09-13 16:24:06 · 1685 阅读 · 0 评论 -
2的个数
请编写一个方法,输出0到n(包括n)中数字2出现了几次。给定一个正整数n,请返回0到n的数字中2出现了几次。测试样例:10 返回:1/*需要优化进行求解,我们可以计算各个位置的2数字的个数;例如:xxxx2 仅仅是个位数字是2的情况 2的高位是0~1999 所以2000*1 2的后面没有低位同理 计算百位为2的情况:12209 当百位是2的时候,还是有200-299,1200-1299,原创 2016-09-01 15:12:23 · 862 阅读 · 0 评论 -
Hibernate的一级缓存以及二级缓存
Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存,这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。 Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。一级缓存和二级缓存的要点配置原创 2016-09-01 22:53:37 · 328 阅读 · 0 评论 -
java去除注释
将形如/**/已经//的注释都去掉,代码如下:这是别人写的,只是拿过来参考下package removeNotes;/** * Created by 12083 on 2016/9/7. */import java.io.BufferedReader;import java.io.FileInputStream;import java.io.IOException;import jav原创 2016-09-07 22:47:03 · 4303 阅读 · 1 评论 -
200层高的大楼,两个鸡蛋,如果在N扔下不碎的话,那么N-1之下都不碎。在最坏的情况下怎么用两个鸡蛋试出会碎掉的楼层
一般的思路是200层高的话,一般将楼层分成两部分,200开根号是14.X, 也就是15,那么每隔15层的时候,扔一个鸡蛋,然后碎了之后从上一个15层的时候开始向上累加,总共最多可能扔下的次数是15 + 15 = 30次。但是这种情况下实际上没有最优化均摊鸡蛋碎掉的楼层数目,假设第一次仍在x楼,那么第二次实际上应该仍在X + X - 1楼,这样可以扔的第一次带来的次数累积情况,通过第二个鸡蛋来弥原创 2016-09-14 16:32:29 · 2264 阅读 · 0 评论 -
常见几种排序算法的C++描述
首先看一下几种常见排序的特性插入排序void insertSort(vector<int> & arr){ int sz = arr.size(); int tmp; for (int i = 1; i < sz; ++i){ tmp = arr[i]; int j; for (j = i; j > 0 && tmp < ar原创 2016-08-18 22:30:41 · 367 阅读 · 0 评论 -
最长合成字符串
有一组单词,请编写一个程序,在数组中找出由数组中字符串组成的最长的串A,即A是由其它单词组成的(可重复)最长的单词。给定一个string数组str,同时给定数组的大小n。请返回最长单词的长度,保证题意所述的最长单词存在。测试样例:[“a”,”b”,”c”,”ab”,”bc”,”abc”],6,返回:3,因为abc可以由其他的字符串组成,/*先按字符串长度排个序哦,然后从长度最长的开始判断是否是原创 2016-09-01 16:27:34 · 685 阅读 · 0 评论 -
单词的最近距离
有一篇文章内含多个单词,现给定两个单词,请设计一个高效算法,找出文中这两个单词的最短距离(即最少相隔的单词数,也就是两个单词在文章中位置的差的绝对值)。给定一个string数组article,代表所给文章,同时给定文章的单词数n和待查找的两个单词x和y。请返回两个单词的最短距离。保证两个单词均在文中出现且不相同,同时保证文章单词数小于等于1000。代码如下public class Distan原创 2016-09-01 16:19:26 · 1095 阅读 · 0 评论 -
找出字符串
有一个排过序的字符串数组,但是其中有插入了一些空字符串,请设计一个算法,找出给定字符串的位置。算法的查找部分的复杂度应该为log级别。 给定一个string数组str,同时给定数组大小n和需要查找的string x,请返回该串的位置(位置从零开始)。测试样例:[“a”,”b”,”“,”c”,”“,”d”],6,”c”, 返回:3class Finder {public: int原创 2016-09-01 12:11:27 · 386 阅读 · 0 评论 -
维护x的秩
现在我们要读入一串数,同时要求在读入每个数的时候算出它的秩,即在当前数组中小于等于它的数的个数(不包括它自身),请设计一个高效的数据结构和算法来实现这个功能。 给定一个int数组A,同时给定它的大小n,请返回一个int数组,元素为每次加入的数的秩。保证数组大小小于等于5000。测试样例: [1,2,3,4,5,6,7],7 返回:[0,1,2,3,4,5,6]简单的方法可以像下面这样做:原创 2016-09-01 12:35:00 · 860 阅读 · 0 评论 -
无判断max
请编写一个方法,找出两个数字中最大的那个。条件是不得使用if-else等比较和判断运算符。 给定两个int a和b,请返回较大的一个数。若两数相同则返回任意一个。测试样例: 1,2 , 返回:2public int getMax(int a ,int b){ b = a-b;//此时b>>31为1则b小于0即a<b,若b>>31为0 则a>b a- = b&(b>>31); /原创 2016-09-01 14:00:23 · 522 阅读 · 0 评论 -
珠玑妙算
我们现在有四个槽,每个槽放一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。例如,可能的情况为RGGB(槽1为红色,槽2、3为绿色,槽4为蓝色),作为玩家,你需要试图猜出颜色的组合。比如,你可能猜YRGB。要是你猜对了某个槽的颜色,则算一次“猜中”。要是只是猜对了颜色但槽位猜错了,则算一次“伪猜中”。注意,“猜中”不能算入“伪猜中”。 给定两个string A和guess。分别表示原创 2016-09-01 14:29:54 · 2185 阅读 · 0 评论 -
最小调整有序
有一个整数数组,请编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n-m应该越小越好,也就是说,找出符合条件的最短序列。 给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的起点和终点。(原序列位置从0开始标号,若原序列有序,返回[0,0])。保证A中元素均为正整数。测试样例:[1,4,6,5,9,10],6 返回:[2,3]/*进行两原创 2016-09-01 14:38:53 · 759 阅读 · 0 评论 -
数字发音
有一个非负整数,请编写一个算法,打印该整数的英文描述。 给定一个int x,请返回一个string,为该整数的英文描述。测试样例: 1234 返回:”One Thousand,Two Hundred Thirty Four”private string[] belowTen = new String[] {"", "One", "Two", "Three", "Four", "Five",原创 2016-09-01 14:41:24 · 501 阅读 · 0 评论 -
词频统计
请设计一个高效的方法,找出任意指定单词在一篇文章中的出现频数。给定一个string数组article和数组大小n及一个待统计单词word,请返回该单词在文章中的出现频数。保证文章的词数小于等于1000。//可以直接使用STL的countclass Frequency {public: int getFrequency(vector<string> article, int n, str原创 2016-09-01 14:48:23 · 711 阅读 · 0 评论 -
下一个较大元素
现在我们有一个int数组,请你找出数组中每个元素的下一个比它大的元素。给定一个int数组A及数组的大小n,请返回一个int数组,代表每个元素比他大的下一个元素,若不存在则为-1。保证数组中元素均为正整数。测试样例:[11,13,10,5,12,21,3],7 返回:[13,21,12,12,21,-1,-1]/*从后向前维护一个递减栈。最右边的那个值肯定没有最大值,所以肯定是-1。初始栈为-原创 2016-09-01 16:01:53 · 1082 阅读 · 0 评论 -
加油站
加油站问题,每个加油站可以加的油给出来,从当前当下一个加油站会消耗的汽油量给出来了,求从哪个站点出发可以循环加油站一圈。首先可以使用一个二重循环来完成,这样复杂度为N^2:class Solution {public: int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { for(int i = 0;原创 2016-08-20 13:19:56 · 482 阅读 · 0 评论