Shortest Subarray with Sum is at least k | Algorithms Notes



Shortest Subarray with Sum is at least k | Algorithms Notes

Given an integer array A of length n and a number k, design a linear time algorithm to find the shortest subarray whose sum is at least k.

Solution:

Let P[i] be the sum of A[1..i]. For an ending index e, we want to compute the largest index b, such that the sum of A[b..e] = P[e+1] – P[b] is at least k. If there exists i and j, such that i < j and P[i] > P[j], then i cannot be the answer for any ending index at least j. Hence, we can maintain a queue q initialized empty. The queue stores indices increasing by position and also by P value. When processing A[i], dequeue all elements x, such that P[i+1] – P[x] is at least k. The last dequeued element is the optimal solution ending at i and we can update the current optimal solution. Then, enqueue i if P[i] is larger than the P value of the tail of the queue. Since every index will be considered as a starting index and an ending index only once, this algorithm runs in linear time.

解法

P[i]為A[1..i]的總和。對於一結尾索引e而言,我們想要計算最大的索引b使得A[b..e] = P[e+1] – P[b]至少為k。如果存在ij,使得i < jP[i] > P[j],那麼i不可能是至少為j的結尾的最佳解。 因此,我們維護一個佇列q初始為空。此佇列儲存的陣列的索引值,且依照索引以及P值的大小遞增。當處理到A[i]時,把所有x使得P[i+1] – P[x] ≥ k從佇列中移除。最後一個移除的元素即是在i結尾的最佳解。所以我們可以依此更新當前最佳解。接著,如果P[i]大於佇列尾端索引的P值,那麼就把i enque。因為每個索引只會被考慮為開始和結束各一次,此演算法時間為線性。


Read full article from Shortest Subarray with Sum is at least k | Algorithms Notes


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