สมมติว่าเรามีอาร์เรย์ไบนารี เราต้องหาความยาวสูงสุดของอาร์เรย์ย่อยที่อยู่ติดกันด้วยจำนวนเท่ากับ 0 กับ 1 ดังนั้นหากอินพุตเป็น [0,1,0] ผลลัพธ์จะเป็น 2 เป็น [0, 1] หรือ [1,0] เป็นอาร์เรย์ที่อยู่ติดกันที่ใหญ่ที่สุดโดยมีค่าเท่ากับ 0 และ 1 วินาที
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- ret :=0, n :=ขนาดของ nums, sum :=0
- ทำแผนที่ m ตั้งค่า m[0] :=- 1
- สำหรับ i ในช่วง 0 ถึงขนาดของ nums – 1
- sum :=sum + 1 เมื่อ nums[i] เป็น 1 มิฉะนั้น sum :=sum – 1
- ถ้า sum เป็น m แล้ว ret :=max ของ ret และ i – m[sum] มิฉะนั้น m[sum] :=i
- คืนสินค้า
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int findMaxLength(vector<int>& nums) {
int ret = 0;
int n = nums.size();
int sum = 0;
map <int, int> m;
m[0] = -1;
for(int i = 0; i < nums.size(); i++){
sum += nums[i] == 1 ? 1: -1;
if(m.count(sum)){
ret = max(ret, i - m[sum]);
}else m[sum] = i;
}
return ret;
}
};
main(){
vector<int> v = {0,1,0,0,1};
Solution ob;
cout << (ob.findMaxLength(v));
} อินพุต
[0,1,0,0,1]
ผลลัพธ์
4