暴力遍历方法:
如【0,1,1,0,0,0】,期待输出4
设计思路:
1、先遍历{0,1,1,0,0,0},统计得到{0,1} {0,1,1,0}
2、遍历{1,1,0,0,0},统计得到{1,1,0,0}
2、遍历{1,0,0,0},统计得到{1,0}
2、遍历{0,0,0},统计得到无
package 数组;
/**
* 暴力循环法,利用冒泡排序遍历的特点
*/
public class T011 {
public static void main(String[] args) {
int[] a = {0,1,1,1,0,0,0};
System.out.println(findMaxLength(a));
}
public static int findMaxLength(int[] nums) {
if(nums==null||nums.length<2) return 0;
int zero = 0;
int one = 0;
int ans = 0;
int count = 0;
for(int i=0;i<nums.length;i++) {
zero = 0;
one = 0;
for(int j=i;j<nums.length;j++) {
if(nums[j]==0) ++zero;
if(nums[j]==1) ++one;
if(zero==one) count = zero;
}
ans = Math.max(ans,count);
}
return ans;
}
}
前缀和:
题目:求0 和 1 个数相同的子数组,就是找到满足一定条件的子数组个数。
前面一题求满足和为k的子数组个数,使用前缀和加哈希表优化的
此题【0,1,1,0,0,0】可以修改为求【-1,1,1,-1,-1,-1】中和为0的子数组个数,
public class T011_b {
public static void main(String[] args) {
int[] a = {0,1,1,0,0,0};
System.out.println(findMaxLength(a));
}
/**
* 用-1替换掉0
* 前缀和:范围区间内的和为0,说明满足条件
* @param nums
* @return
*/
public static int findMaxLength(int[] nums) {
HashMap<Integer,Integer> hashMap = new HashMap();
hashMap.put(0,-1);
for (int i = 0; i < nums.length; i++) {
if(nums[i] == 0){
nums[i] = -1;
}
}
System.out.println(Arrays.toString(nums));
int pre_sum=0;
int ans=0;
for (int i = 0; i < nums.length; i++) {
pre_sum +=nums[i];
if(hashMap.containsKey(pre_sum)){
ans = Math.max(ans, i - hashMap.get(pre_sum));
}else hashMap.put(pre_sum, i);
}
return ans;
}
}