题解 | #连续数组的长度#

连续数组的长度

http://www.nowcoder.com/practice/6e231c66d7864266b55395cde5bcac27

解题思路,分两步:

    1. 计算每一位的01差,观察各位数之间的关系
    1. 计算相同差位数之间的距离

现在有一个数组:[0,0,1,0,0,0,1,1]

  1. 对数组进行01差计算,数值为0时水平+1,数值为1时水平-1。计算结果为:[1,2,1,2,3,4,5,4,3]
  2. 对计算结果进行分析,我们可以发现相同01差的(相同水平高度)之间的数总能保持01平衡。 alt

我们可以得出结论相同水平高度之间的数长度就是我们要找的连续数组长度。还有一个问题就是我们要找到最大的连续的长度,这个问题我们现在也能轻松解开了。

计算相同差位数之间的距离,找到最大连续长度

  • 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;
}
全部评论
该牛油正在参与牛客写题解薅羊毛的活动,牛币,周边,京东卡超多奖品放送,活动进入倒计时!快来捡漏啦https://www.nowcoder.com/discuss/888949?source_id=profile_create_nctrack&channel=-1
点赞
送花
回复
分享
发布于 2022-04-20 17:12
这个问题可以看做`和为K的最大连续子数组`变形,令k=0,0值元素为-1.这两题就相同了
点赞
送花
回复
分享
发布于 2022-11-15 15:51 广东
秋招专场
校招火热招聘中
官网直投

相关推荐

头像
04-29 10:53
已编辑
东北大学 自动化类
点赞 评论 收藏
转发
2 收藏 评论
分享
牛客网
牛客企业服务