
算法
闪闪亮亮
人生就是这样,耐得住寂寞,才能守得住繁华。每一个优秀的人,都有一段沉默的时光。那一段时光,付出了很多努力,忍受孤独和寂寞,不抱怨不诉苦,日后说起时,连自己都能被感动。
展开
-
买卖股票的最佳时机I、II、III、IV
买卖股票的最佳时机I假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。 思路:这个比较简单,只要遍历一次就好,同时更新最小的值。可以得到最大的利润。 代码如下:class Solution {public: /* * @param prices: Given an int...原创 2017-09-04 16:12:24 · 657 阅读 · 1 评论 -
优先队列
删除优先级高的元素和插入元素,这种数据结构称为优先队列。优先队列的实现方法主要有三种:优先队列的各种实现在最坏的情况下运行时间的增长数量级 数据结构 插入元素 删除最大元素 有序数组 N 1 无序数组 1 N 堆 logN logNpriority_queue调用 STL里面的 make_heap(), pop_heap(), push_heap()原创 2017-11-06 16:02:24 · 246 阅读 · 0 评论 -
比较排序算法的时间复杂度的下限
原因: 对于n个待排序元素,在未比较时,可能的正确结果有n!种。 在经过一次比较后,其中两个元素的顺序被确定,所以可能的正确结果剩余n!/2种(确定之前两个元素的前后位置的情况是相同,确定之后相当于少了一半的可能性)。 依次类推,直到经过m次比较,剩余可能性n!/(2^m)种。 直到n!/(2^m)<=1时,结果只剩余一种。根据斯特灵公式,此时的比较次数m为o(nlogn)次。 所以基于排原创 2017-10-26 21:48:48 · 5810 阅读 · 0 评论 -
插入排序的变形
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:如果这里不考虑空间的复杂度,可以用O(n),但是为了节约空间,我们采用插入排序的方法处理这个问题。代码如下:class Solution {public: //简单用插入排序的方法处理 //交换原创 2017-10-28 11:50:27 · 258 阅读 · 0 评论 -
最长回文子串
0. 问题定义最长回文子串问题:给定一个字符串,求它的最长回文子串长度。如果一个字符串正着读和反着读是一样的,那它就是回文串。下面是一些回文串的实例: 12321 a aba abba aaaa tattarrattat(牛津英语词典中最长的回文单词)1. Brute-force 解法对于最长回文子串问题,最简单粗暴的办法是:找到字符串的所有子串,遍历每一个子串以验证它们是否为回文串。一个子串转载 2017-09-03 11:41:14 · 345 阅读 · 0 评论 -
最小子串覆盖
问题描述Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n). For example, S = “ADOBECODEBANC” T = “ABC” Minimum window is “BANC”.原创 2017-09-11 22:15:56 · 383 阅读 · 0 评论 -
染色问题
思路:只要遍历一次,分别统计左侧的g的数量和右侧r的数量,就可以得到染色的次数。 代码如下:#include<string>#include<iostream>#include<vector>#include<algorithm>using namespace std;int gettimes(string str){ int rsum = 0; int gsum = 0原创 2017-09-10 20:06:23 · 701 阅读 · 0 评论 -
快乐数(环路检测)
问题描述写一个算法来判断一个数是不是”快乐数”。 一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为他每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,或是无限循环但始终变不到1。如果可以变为1,那么这个数就是快乐数。 样例 19 就是一个快乐数。 1^2 + 9^2 = 82 8^2 + 2^2 = 68 6^2 + 8^2 = 100 1^2 + 0^2 +原创 2017-09-08 11:49:38 · 424 阅读 · 0 评论 -
乱序字符串
问题描述:给出一个字符串数组S,找到其中所有的乱序字符串(Anagram)。如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中。注意事项所有的字符串都只包含小写字母 对于字符串数组 [“lint”,”intl”,”inlt”,”code”] 返回 [“lint”,”inlt”,”intl”]思路:认为每一组乱序字符串都有唯一的相同的“ Hash 值 ”,但是这个值原创 2017-09-08 11:19:17 · 352 阅读 · 0 评论 -
海量数据中找出前k大数(topk问题)
前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些。 先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。建堆时转载 2017-09-15 10:12:11 · 1711 阅读 · 0 评论 -
接雨水
问题描述:Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. 如上图所示,海拔分别为 [0,1,0,2,1,0,1,3,2,1,2,1], 返回 6.原创 2017-09-05 18:33:31 · 286 阅读 · 0 评论 -
装最多水的容器
装最多水的容器给定 n 个非负整数 a1, a2, …, an, 每个数代表了坐标中的一个点 (i, ai)。画 n 条垂直线,使得 i 垂直线的两个端点分别为(i, ai)和(i, 0)。找到两条线,使得其与 x 轴共同构成一个容器,以容纳最多水。注意事项容器不可倾斜。样例给出[1,3,2], 最大的储水面积是2.思想:可以理解容纳的水量是两条边最短的那条*两条边的距离。需要定义left和righ原创 2017-09-05 16:52:51 · 428 阅读 · 0 评论 -
二分查找时间复杂度的计算(转)
二分查找的基本思想是将n个元素分成大致相等的两部分,去a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x< a[n/2],则只要在数组a的左半部分继续搜索x,如果x >a[n/2],则只要在数组a的右半部搜索x.时间复杂度无非就是while循环的次数!总共有n个元素,渐渐跟下去就是n,n/2,n/4,….n/2^k,其中k就是循环的次数,n,n/2,n...转载 2018-02-28 10:06:19 · 1559 阅读 · 0 评论