连续数组–java–前缀和
思路:
这道题的暴力解法应该是很容易想到的,使用两层循环,很容易求解。但超时是肯定的。
比较难想的是第二种解法,使用前缀和+哈希表。这个想法最关键的地方在于想到前缀和
主要用于求连续子数组和,能想到这一点就很好做了,只需把0换成-1,然后考虑前缀和值
相等的情况即可。
class Solution {
// public int findMaxLength(int[] nums) {
// int max = 0;
// for( int i = 0; i < nums.length; ++i ){
// int num0 = 0;
// int num1 = 0;
// for( int j = i; j < nums.length; ++j ){
// if( nums[j] == 0 ){
// ++num0;
// }else {
// ++num1;
// }
// }
// if( num0 == num1 ){
// max = max > (num1 + num0) ? max : (num1 + num0);
// }
// }
// return max;
// }
public int findMaxLength(int[] nums) {
// 先将0换为-1
for( int i = 0; i < nums.length; ++i ){
if( nums[i] == 0 ){
nums[i] = -1;
}
}
int[] arr = new int[nums.length + 1];
// 求前缀和
for( int i = 1; i < arr.length; ++i ){
arr[i] = arr[i - 1] + nums[i - 1];
}
int max = 0;
Map<Integer,Integer> map = new HashMap<>();
for( int i = 1; i < arr.length; ++i ){
if( arr[i] == 0 ){
max = i;
continue;
}
if( map.containsKey(arr[i]) ){
int preIndex = map.get(arr[i]) + 1;
int newLength = i - preIndex + 1;
max = max > newLength ? max : newLength;
}
if( !map.containsKey(arr[i]) ){
map.put(arr[i],i);
}
}
return max;
}
}
作者:mai-jia-jun
链接:https://leetcode-cn.com/problems/contiguous-array/solution/lian-xu-shu-zu-by-mai-jia-jun-tgi8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。