-594. Longest Harmonious Subsequence – DeReK – Medium



-594. Longest Harmonious Subsequence – DeReK – Medium

简单难度的好题,我觉得不小心很容易跑偏的一道简单难度的题。先说说我自己的跑偏经历

首先这个是subsequence,所以其实原数组的顺序已经不重要了,或者说顺序根本不是考察的范围所能用得到的,所以我们要么可以排序再分析,要么就是利用HashMap来统计频率,这也是我知道的两个解法的始源

先说排序的算法:

  1. 排序了,然后怎么分析呢?一开始想的是直接遍历然后看是不是比前一个大一或者相等。我擦这么明显的错误都能犯?不是检测是不是递增,而是相差1的子数组相当于,否则连[1,2,3]这样的数组都不过测试。那就增加个临时变量表示之前的数字?还是不对因为这样还需要回溯,但是又回到哪里去呢?我们只设一个指针来遍历是不够的。那么我们用俩
  2. 两个指针其实就是我们最喜闻乐见的sliding window了。但是这个sliding window又稍微有些不一样。 一般siliding window是超出范围后结算的。但是这道题怎么说是"超出范围"呢?如果我们是决定num[right] 比 num[left] 大超过1是超出范围应该结算的话,那么这个test case就不对了:[1,1,1,4] 这个应该返回0,但是会被错误地返回3。 思来想去这道题的关键是当出现rigth比left的值大1的时候,我们才可以自信的说我们有harmonious subsequence,因为如果是1 1 1 1 或者 1,3,5,8都是不行的。
  3. 于是结算就不是发现窗口扩展不下去了再结算,而是每次只要有效都要结算。动态增加而不是最后结算。这样每次看到right比left的值大1就更新下res并right++。其他如果right比left大于超过1。left++,否则(其实也就是等于1) right++。

再说HashMap,这个思路完全不一样,先遍历数组统计各数字的频率,然后再遍历一次来看每个数字是否其+1和-1的数也在hashmap里,如果在就把俩人的freq的和跟res比,谁大要谁。然后将当前数字从map里删掉以免重复比较。

这个思路很简单而且只需要O(n)的时间和O(n)的space。但是其运行速度却比上一个要慢了50%,为什么呢?我能想到的就是hashmap的查找和增删时间的消耗。


Read full article from -594. Longest Harmonious Subsequence – DeReK – Medium


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