题解 | #连续数组的长度#
连续数组的长度
http://www.nowcoder.com/practice/6e231c66d7864266b55395cde5bcac27
解题思路,分两步:
-
- 计算每一位的01差,观察各位数之间的关系
-
- 计算相同差位数之间的距离
现在有一个数组:[0,0,1,0,0,0,1,1]
- 对数组进行01差计算,数值为0时水平+1,数值为1时水平-1。计算结果为:[1,2,1,2,3,4,5,4,3]
- 对计算结果进行分析,我们可以发现相同01差的(相同水平高度)之间的数总能保持01平衡。
我们可以得出结论相同水平高度之间的数长度就是我们要找的连续数组长度。还有一个问题就是我们要找到最大的连续的长度,这个问题我们现在也能轻松解开了。
计算相同差位数之间的距离,找到最大连续长度
- 1.遍历计算结果[1,2,1,2,3,4,5,4,3],算出每一个水平高度到前一个水平高度之间的距离,记录最大距离即可。
上代码:
public int findMaxLength (ArrayList<Integer> nums) {
// write code here
// 存储最大长度
int max = 0;
// 存储0,1差
int[] data = new int[nums.size()];
Map<Integer, Integer> map = new HashMap<>();
map.put(0, -1);
for(int i=0;i<nums.size();i++){
int val = nums.get(i) == 0 ? 1: -1;
data[i] = i==0?val:data[i-1]+val;
// 记录水平高度的起始下标或计算当前水平高度到前一水平高度的距离
if(!map.containsKey(data[i])) {
map.put(data[i],i);
}else{
// 记录最大距离差
max = Math.max(max, i-map.get(data[i]));
}
}
return max;
}