Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Arithmetic Slices ใน C++ : นับ Slice ที่เป็น Arithmetic Sequence


โจทย์จริงของเนื้อหานี้คือ Arithmetic Slices** (Title "Remove K Digits" ผิดพลาด เนื้อหาเป็น Arithmetic Slices)

ให้ Array A หาจำนวน **Arithmetic Slices** คือ Subarray ความยาว ≥ 3 ที่ **ความต่างระหว่าง Adjacent Elements คงที่**

ตัวอย่าง

A = [1,2,3,4]

Arithmetic Slices: [1,2,3], [2,3,4], [1,2,3,4] -> 3 Slices

แนวทาง: DP (Dynamic Programming)

dp[i] = จำนวน Arithmetic Slices ที่ **ลงท้ายที่ Index i** (และมีความยาว ≥ 3)

  • ถ้า A[i] - A[i-1] == A[i-1] - A[i-2] (รักษา Common Difference):
  • ทุก Slice ที่ลงท้าย i-1 สามารถต่อยอดมาที่ i ได้ (+1 Slice ใหม่คือ [i-2, i-1, i])
  • dp[i] = 1 + dp[i-1]
  • สะสมคำตอบ ret += dp[i]

ตัวอย่างโค้ด C++

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& A) {
        int ret = 0;
        int n = A.size();
        vector<int> dp(n, 0);

        for (int i = 2; i < n; i++) {
            if (A[i] - A[i-1] == A[i-1] - A[i-2]) {
                dp[i] = 1 + dp[i-1];
                ret += dp[i];
            }
        }
        return ret;
    }
};

Input / Output

Input:  [1,2,3,4]
Output: 3

ความซับซ้อน (Complexity)

  • Time: O(N)
  • Space: O(N) (ลดเหลือ O(1) ได้โดยเก็บแค่ dp_prev)

หมายเหตุ

Title ใน XML เขียนว่า "Remove K Digits" แต่โค้ดและเนื้อหาเป็น **Arithmetic Slices** ครับ ขอแก้ไข Title ให้ตรงกับเนื้อหาจริง