Tổng các phần tử liên tục

Đề bài

Cho một mảng số nguyên nums và một số nguyên k, trả về true nếu nums có một dãy con tốt, ngược lại trả về false.

Một dãy con tốt là một dãy con thỏa mãn:

Độ dài của nó ít nhất là hai.
Tổng các phần tử của dãy con là một bội số của k.
Lưu ý:

Một dãy con là một phần liên tục của mảng.
Một số nguyên x là bội số của k nếu tồn tại một số nguyên n sao cho x = n * k. Lưu ý rằng 0 luôn là bội số của k.
Ví dụ 1:
Đầu vào: nums = [23,2,4,6,7], k = 6

Đầu ra: true

Giải thích: [2, 4] là một dãy con liên tục có độ dài 2 mà tổng của các phần tử bằng 6, là một bội số của 6.

Ví dụ 2:
Đầu vào: nums = [23,2,6,4,7], k = 6

Đầu ra: true

Giải thích: [23, 2, 6, 4, 7] là một dãy con liên tục có độ dài 5 mà tổng của các phần tử bằng 42, là một bội số của 6.

Ví dụ 3:
Đầu vào: nums = [23,2,6,4,7], k = 13

Đầu ra: false

Ràng buộc:
1 <= nums.length <= 100,000
0 <= nums[i] <= 1,000,000,000
1 <= k <= 2,147,483,647

Cách làm

#include <iostream>
#include <unordered_map>
using namespace std;

bool coDayConTot(int nums[], int n, int k) {
    unordered_map<int, int> mapDu;
    mapDu[0] = -1; // Khoi tao de xet truong hop tong tu dau den i la boi cua k
    int tong = 0;

    for (int i = 0; i < n; i++) {
        tong += nums[i];
        int du = tong % k;
        
        if (du < 0) du += k; // Xu ly truong hop du am
        
        if (mapDu.find(du) != mapDu.end()) {
            if (i - mapDu[du] > 1) {
                return true;
            }
        } else {
            mapDu[du] = i;
        }
    }

    return false;
}

int main() {
    int nums[] = {23, 2, 4, 6, 7};
    int n = sizeof(nums) / sizeof(nums[0]);
    int k = 6;

    cout << (coDayConTot(nums, n, k) ? "true" : "false") << endl;

    return 0;
}

Bình luận