Kân team v3
Senior Member
bài hôm lay toy là người có học tưởng là qhd classic trong cuốn CLRS nên code O(nlogn), beat 5%
bấm xem đáp án thấy nó chơi công thức tón học
còn O(n) thoy nên toy code lại "1" dòng
chọn số ở giữa cho là nó thuộc subarray chia hết cho k, tìm subarray chứa số ở giữa này trong O(n), nếu ko tìm ra thì đệ quy 2 nửa mảng trái và phải, tối đa đệ quy logn lần, mỗi lần O(n) là O(nlogn)
https://leetcode.com/problems/continuous-subarray-sum/submissions/830331101/
https://leetcode.com/problems/continuous-subarray-sum/submissions/830331101/
C++:
struct Solution {
array<int, 100'001> buf;
bool checkMid(const int* first, const int* last, const int k) {
const int n = last - first;
if (n < 2) return false;
if (n == 2) return (first[0] + first[1]) % k == 0;
buf[n / 2] = first[n / 2] % k;
for (int i = n / 2; i--;)
if ((buf[i] = (buf[i + 1] + first[i]) % k) == 0) return true;
unordered_set<int> rems;
rems.insert((buf[n / 2 + 1] = first[n / 2 + 1] % k));
for (int i = n / 2 + 2; i < n; ++i)
rems.insert((buf[i] = (buf[i - 1] + first[i]) % k));
for (int i = n / 2 + 1; i--;)
if (rems.find(buf[i] == 0 ? 0 : k - buf[i]) != end(rems)) return true;
return checkMid(first, first + n / 2, k) || checkMid(first + n / 2 + 1, last, k);
}
bool checkSubarraySum(vector<int>& nums, int k) {
return checkMid(&nums[0], &nums[0] + nums.size(), k);
}
};
bấm xem đáp án thấy nó chơi công thức tón học
https://leetcode.com/problems/continuous-subarray-sum/submissions/830338382/
C++:
struct Solution {
bool checkSubarraySum(vector<int>& nums, int k) {
return any_of(begin(nums), end(nums), [=, i = 0, s = 0, prefixSums = unordered_map<int, int>{{0, -1}}](int n) mutable {
if (auto it = prefixSums.find(s = (s + n) % k); it != end(prefixSums)) {
return i++ - it->second >= 2;
} else {
return prefixSums[s] = i++, false;
}
});
}
};
Sửa lần cuối:
bởi mới nói
mấy thằng ranh con trên voz Facebook cho hay
ai có nguồn hc phần này cho em xin lun thanks các thím
𝐂𝐨𝐝𝐢𝐧𝐠 𝐩𝐚𝐭𝐭𝐞𝐫𝐧𝐬 𝐞𝐧𝐡𝐚𝐧𝐜𝐞 𝐨𝐮𝐫 “𝐚𝐛𝐢𝐥𝐢𝐭𝐲 𝐭𝐨 𝐦𝐚𝐩 𝐚 𝐧𝐞𝐰 𝐩𝐫𝐨𝐛𝐥𝐞𝐦 𝐭𝐨 𝐚𝐧 𝐚𝐥𝐫𝐞𝐚𝐝𝐲 𝐤𝐧𝐨𝐰𝐧 𝐩𝐫𝐨𝐛𝐥𝐞𝐦.”