Solution:
The straightforward way is of O(n2) time complexity, which is not what the OJ wants. There are only two elements in the vectors: 0 and 1. So we can define one variable to record the number difference of 0 and 1: sum. When it is 0, --sum; and when it is 1, ++sum. A hashmap is needed to connect the sum to the current position from which we can calculate the length of the subarray with the same number of 0 and 1. Then we need find the one with the maximum length.
In short, we will use map[sum] = i to record the position of i when the difference of the 0's and 1's number is sum. When the same sum appears again, let's say at position of j, then the subarray between i and j must contain the same number of 0 and 1.
Further thinking: how about there are three different elements in the array, and ask for the maximum subarray with the same number of each of them?
Code:
- class Solution {
- public:
- int findMaxLength(vector<int>& nums) {
- int res = 0, sum = 0, n = nums.size();
- unordered_map<int, int> m;
- m[0] = 0;
- for(int i=0; i<n; ++i){
- if(nums[i] == 0) --sum;
- else ++sum;
- if(m.find(sum) != m.end()) res = max(res, i+1-m[sum]);
- else m[sum] = i+1;
- }
- return res;
- }
- };
No comments :
Post a Comment