## Introduction + 通常答案和前後有關聯,所以必須先前後掃描才可以得出答案。 ## Problems ### [238. Product of Array Except Self](https://leetcode.com/problems/product-of-array-except-self/?envType=list&envId=5gno87pd) 給你一個vector<int> nums,輸出所有vector的乘積除了自己。 > 1. 因為每個答案和除了自己之外,前後的乘積,所以使用two-pass。 > 2. 先計算出自己以外的forward和backward,最後把兩個vector乘起來就是答案。 ```cpp= vector<int> productExceptSelf(vector<int>& nums) { int sz = nums.size(); vector<int> fw(sz, 1), bw(sz, 1); for(int i = 1; i < sz; ++i) { fw[i] = nums[i - 1] * fw[i - 1]; } for(int i = sz - 2; i >= 0; --i) { bw[i] = nums[i + 1] * bw[i + 1]; } vector<int> rtn(sz); for(int i = 0; i < sz; ++i) rtn[i] = fw[i] * bw[i]; return rtn; } ``` ### [1493. Longest Subarray of 1's After Deleting One](https://leetcode.com/problems/longest-subarray-of-1s-after-deleting-one-element/) 給你一個vector<int>只有binary 0和1,一定要刪除一個element,試找出最長的連續1的subarray。 > 1. 因為一定要刪除一個element,所以等於第i個的前面和後面連續的1的長度總和,所以使用two pass。 > 2. 先計算forward和backward,再找出刪除一個element之後的最長subarray。 ```cpp= int longestSubarray(vector<int>& nums) { int sz = nums.size(); vector<int> bwd(sz), fwd(sz); bwd[0] = nums[0]; for(int i = 1; i < sz; ++i) { if(nums[i]) bwd[i] = bwd[i - 1] + 1; } fwd[sz - 1] = nums[sz - 1]; for(int i = sz - 2; i >= 0; --i) { if(nums[i]) fwd[i] = fwd[i + 1] + 1; } int ans{}; for(int i = 0; i < sz; ++i) { ans = max(ans, (i - 1 >= 0 ? bwd[i - 1] : 0) + (i + 1 < sz ? fwd[i + 1] : 0)); } return ans; } ```