Đề 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;
}