# #2 Validate Subsequence ###### tags: `Array` `Easy` ## Problem Given two non-empty arrays of integers, write a function that determines whether the second array is a subsequence of the first one. A subsequence of an array is a set of numbers that aren't necessarily adjacent in the array but that are in the same order as they appear in the array. For instance, the numbers `[1, 3, 4]` form a subsequence of the array `[1, 2, 3, 4]`, and so do the number `[2, 4]`. Note that a single number in an array and the array itself are both valid subsequences of the array. ### Sample Input ```javascript array = [5, 1, 22, 25, 6, -1, 8, 10] sequence = [1, 6, -1, 10] ``` ### Sample Output ```javascript true ``` <br/> <hr/> ## Solutions My own ```javascript= function isValidSubsequence(array, sequence) { let idx = 0; for(let i = 0; i < array.length; i++){ if(array[i]===sequence[idx]){ idx++ } } return idx === sequence.length } ``` **Official answers** option 1 ```javascript= time O(n) space O(1) function isValidSubsequence(array, sequence) { let seqIdx = 0; for(const value of array){ if(seqIdx === sequence.length) break; if(sequence[seqIdx] === value) seqIdx++; } return seqIdx === sequence.length; } ``` option 2 ```javascript= time O(n) space O(1) function isValidSubsequence(array, sequence) { let arrIdx = 0; let seqIdx = 0; //雙指針 while(arrIdx<array.length && seqIdx < sequence.length){ if(array[arrIdx] === sequence[seqIdx]) seqIdx++; arrIdx++; } return seqIdx === sequence.length; } ``` **key point** * use for ... of * 可直接取 array 資料,但不可用在 object 資料,需搭配 Object.keys() * 可用 break 中斷,map、forEach 不可中斷 * for ... in 裡,break、continue 沒作用 ### 補充:指針、指標 Pointer - 通過**地址**找到該單元的記憶體位置 - 將地址形象化 → 指針 - 作個比喻,假設將電腦存儲器當成一本書,一張內容記錄了某個頁碼加上行號的便利貼,可以被當成是一個指向特定頁面的指針;根據便利貼上面的頁碼與行號,翻到那個頁面,把那個頁面的那一行文字讀出來,就相當于是對這個指針進行反參考的動作。 - 快慢指標… ![](https://i.imgur.com/knf2ix0.jpg) - 本題雙指標為右邊上面 ![](https://i.imgur.com/eLPmvwA.png)