classSolution: defcountAlternatingSubarrays(self, nums: List[int]) -> int: n = len(nums) ans = 1 dp = [1] * n for i inrange(1, n): if nums[i] != nums[i - 1]: dp[i] = dp[i - 1] + 1 ans += dp[i] return ans
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution { public: longlongcountAlternatingSubarrays(vector<int>& nums){ int n = nums.size(); longlong ans = 1; vector<int> dp(n, 1); for (int i = 1; i < n; i++) { if (nums[i] != nums[i - 1]) dp[i] = dp[i - 1] + 1; ans += dp[i]; } return ans; } };
令 f 表示以 nums[i] 結尾的交替子陣列的數量,則若 nums[i]=nums[i−1],則 f=f+1;否則 f=1 ,並在計算過程中累加 f 的值至答案中,同樣需將 ans 初始化為 1。
複雜度分析
時間複雜度:O(n),其中 n 為陣列 nums 的長度。
空間複雜度:O(1)。
1 2 3 4 5 6 7 8 9 10
classSolution: defcountAlternatingSubarrays(self, nums: List[int]) -> int: ans = f = 1 for x, y in pairwise(nums): if x != y: f += 1 else: f = 1 ans += f return ans
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution { public: longlongcountAlternatingSubarrays(vector<int>& nums){ int n = nums.size(); longlong ans = 1; int f = 1; for (int i = 1; i < n; i++) { if (nums[i] != nums[i - 1]) f += 1; else f = 1; ans += f; } return ans; } };
寫在最後
Cover photo is remixed from @吃肥皂泡泡, thanks for their work!