https://leetcode.com/problems/contiguous-array/

1. Use brute force:

  1. //Time Limit Exceeded
  2. class Solution {
  3. public:
  4. int findMaxLength(vector<int>& nums) {
  5. if(nums.size() == 0) return 0;
  6. int zero_count = 0, one_count = 0;
  7. for(int i = 0; i < nums.size(); i++){
  8. if(nums[i] == 0) zero_count++;
  9. else if(nums[i] == 1) one_count++;
  10. }
  11. int diff = one_count - zero_count;
  12. int result = 0;
  13. findMaxLength(nums, diff, result, 0, nums.size()-1);
  14. return result;
  15. }
  16. private:
  17. void findMaxLength(vector<int>& nums, int diff, int& result, int l, int r) {
  18. if(r - l < 1) return;
  19. //cout << l << " " << r << " " << diff << endl;
  20. if(diff == 0){
  21. result = max(result, r - l + 1);
  22. return;
  23. } else {
  24. if(nums[l] == 0)
  25. findMaxLength(nums, diff + 1, result, l + 1, r);
  26. else
  27. findMaxLength(nums, diff - 1, result, l + 1, r);
  28. if(nums[r] == 0)
  29. findMaxLength(nums, diff + 1, result, l, r - 1);
  30. else
  31. findMaxLength(nums, diff - 1, result, l, r - 1);
  32. }
  33. }
  34. };

2. Use hashmap:

  1. //300 ms 83.1 MB
  2. class Solution {
  3. public:
  4. int findMaxLength(vector<int>& nums) {
  5. if(nums.size() <= 1) return 0;
  6. unordered_map<int, int> map;
  7. //important
  8. map[0] = -1;
  9. int result = 0, count = 0;
  10. for(int i=0; i<nums.size(); i++){
  11. if(nums[i] == 0)
  12. count--;
  13. else
  14. count++;
  15. if(map.find(count) != map.end())
  16. result = max(result, i - map[count]);
  17. else
  18. map[count] = i;
  19. }
  20. return result;
  21. }
  22. };