2013.6.30-待字闺中-最多连续数的子集 | 源代码



2013.6.30-待字闺中-最多连续数的子集 | 源代码

题目描述:
给一个整数数组, 找到其中包含最多连续数的子集,比如给:15, 7, 12, 6, 14, 13, 9, 11,则返回: 5:[11, 12, 13, 14, 15] 。最简单的方法是sort然后scan一遍,但是要o(nlgn). 有什么O(n)的方法吗?
算法一:
用一个map,它的key是一个起始的数字,value是这个起始数字起连续的个数。这样这个数组遍历一遍下来,只要map维护好了,自然就能得到最长的连续子串了,并且算法复杂度应该是O(n)。(不考虑map函数实现的复杂度)
(1) 取出当前的整数,在map里看一下是否已经存在,若存在则直接取下一个,不存在转2 (为什么要看是否已经存在,因为题目没有说不会有重复的数字。)
(2) 查看下map里面当前数字的前一个是否存在,如果存在,当前的最长长度就是前一个最长长度+1
(3) 查看下map里面当前数字的后一个是否存在,如果存在,那么就将以下一个数字开始的子串的最后一个更新下,因为本来没有连上的2个子串,因为当前数字的出现连起来了
(4) 接着再看下前面数字是否存在,如果存在,就更新以这个数字结尾的子串的第一个数字的连续子串长度,原因同上
算法就是如上所示了,我们拿例子演练一遍。
1)   首先给定15,这个时候map里面没有15也没有14和16,那么这个执行完了之后map是map[15] = 1;
2)   然后遇到7,同上,也没有6,7和8,所以执行玩了之后变成map[7]=1, map[15]=1;
3)   12同上,map[7]=1, map[12]=1, map[15]=1;
4)   接下来是6,6就不一样了,因为7存在的,所以执行上面第3步之后,map[6]=2,map[7]=2,map[12]=1,map[15]=1;
5)   14的情况跟6一样,结果是map[6]=2,map[7]=2,map[12]=1,map[14]=2,map[15]=2;
6)   13的情况相对复杂一些,因为12和14都存在了 ,所以它会执行以上1,2,3,4的所有4步:首先12存在,所以13的最长子串是2,14存在,所以会更新到14起始的最后一个数字的最长长度,这里就是15的长度=它自己的加上13的长度,也就是4,同时我们把13的长度也改成4,最后因为12存在,我们要更新以12结尾的连续子串的开始处,本例中就是12自己,12对应更新成4。
7)   最后是11,11的前面一个数字不存在,后一个数字存在,也就是要执行以上1,3,第3步结束的时候已经是11和15都更新成5了。最后的结果也就是5,并且是从11起始的。

 算法二:

设置一个bitmap,初始值为0,如果出现则设置为1,这样看有多少个1连续就可以了。
转自陈立人的待字闺中微信账号,欢迎关注。

Read full article from 2013.6.30-待字闺中-最多连续数的子集 | 源代码


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts