525.连续数组

题目描述:

image.png


解:

题目要求0和1数量相同的最长子数组,假如将0看做-1,那就是和为0的最长子数组。
那么依然是先做前缀和处理。然后通过哈希表记录某个前缀和出现的最小下标(以求最大子数组)

  1. class Solution {
  2. public int findMaxLength(int[] nums) {
  3. int n = nums.length;
  4. int[] sum = new int[n+1];
  5. for (int i = 1; i <= n; i++) {
  6. sum[i] = sum[i-1] + (nums[i-1] == 0 ? -1 : nums[i-1]); //前缀和处理
  7. }
  8. int ret = 0;
  9. Map<Integer, Integer> map = new HashMap<Integer, Integer>();
  10. map.put(0,0);
  11. for(int i = 2; i <= n; i++) {
  12. if(!map.containsKey(sum[i-2])) {
  13. map.put(sum[i-2], i-2); //记录最左端点
  14. }
  15. if(map.containsKey(sum[i])) {
  16. ret = Math.max(ret, i-map.get(sum[i]));
  17. }
  18. }
  19. return ret;
  20. }
  21. }