สมมติว่าเรามีรายการตัวเลขที่ไม่เป็นลบและจำนวนเต็มเป้าหมาย k เราต้องเขียนฟังก์ชันเพื่อตรวจสอบว่าอาร์เรย์มี subarray ย่อยต่อเนื่องที่มีขนาดอย่างน้อย 2 ที่ผลรวมเป็นทวีคูณของ k รวมกันได้ไม่เกิน n* k โดยที่ n เป็นจำนวนเต็มด้วย ดังนั้นหากอินพุตเป็น [23,2,4,6,7] และ k =6 ผลลัพธ์จะเป็น True เนื่องจาก [2,4] เป็นอาร์เรย์ย่อยต่อเนื่องของขนาด 2 และผลรวมสูงสุด 6
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สร้างแผนที่ m ตั้งค่า m[0] :=-1 และ sum :=0, n :=ขนาดของอาร์เรย์ nums
- สำหรับ i ในช่วง 0 ถึง n – 1
- sum :=sum + nums[i]
- ถ้า k ไม่ใช่ศูนย์ ให้ sum :=sum mod k
- ถ้า m มีผลรวม และ i – m[sum]>=2 แล้วคืนค่าเป็นจริง
- ถ้า m ไม่มีผลรวม ให้ตั้งค่า m[sum] :=i
- คืนค่าเท็จ
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
unordered_map<int, int> m;
m[0] = -1;
int sum = 0;
int n = nums.size();
for(int i = 0; i < n; i++){
sum += nums[i];
if(k)
sum %= k;
if(m.count(sum) && i - m[sum] >= 2){
return true;
}
if(!m.count(sum)) m[sum] = i;
}
return false;
}
};
main(){
vector<int> v = {23,2,4,6,7};
Solution ob;
cout << (ob.checkSubarraySum(v, 6));
} อินพุต
[23,2,4,6,7] 6
ผลลัพธ์
1