LeetCode算法心得——连续数组(前缀和+HashMap)

大家好,我是晴天学长,公式的巧妙化简加上hashmap的灵活应用,需要的小伙伴可以关注支持一下哦!后续会继续更新的。


1) .连续数组

给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。

示例 1:

输入: nums = [0,1]
输出: 2
说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。

示例 2:

输入: nums = [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。


2) .算法思路

核心:由于以上碰1加一,碰0减一的操作,当0与1数量一致时(连续数组), 其连续数组的和为零。因此我们知道数组前面的 curcurcur 值是什么,在到达该连续数组尾部时就不会变。因此我们只需要检查哈希表中是否存在其相同的 curcurcur 值即可!(多读几遍)。

为什么在哈希表中找到了相同的 curcurcur 值则算找到了一串连续数组?

"如果这是一串连续子数组,那么cur的值,在到达该子数组尾部时(紫色箭头处),与在该子数组前一位时(绿色箭头处),是相等的" 。

为什么要在哈希表中插入{0, -1}? 这是为了辅助讨论该连续数组的起始点在 index == 0 的位置的情况,如果最长连续数组在数组的最前方,不插入{0,-1}会得到错误的答案,因此我们一定要插入该辅助键值!具体可以看看动图中的前几位数字看看{0,-1}是如何辅助我们得到答案的!


3) .算法步骤

连续数组

1.用hashmap统计每个下标 0 1 的数量

2.一段子数组的0和1的数量
sR1 - SL1 = SR0-SL0;
SR1 - SR0 = SL1-SL0;

3.遍历数组,找最大,所以存下标。

4.要是不存在就存下来,有就不存了,因为要找最大的子数组,肯定是L的最小,相减起来才是最大的。


4).代码示例

java 复制代码
class Solution {
    public int findMaxLength(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
            int zero = 0;
            int one = 0;
            int maxindex = 0;
            map.put(0,-1);
            for (int i = 0; i < nums.length; i++) {
                if (nums[i] == 0) {
                    zero++;
                } else {
                    one++;
                }
                int temp = one-zero;
                if (map.containsKey(temp)) {
                    if (maxindex < Math.abs((i - map.get(temp)))) {
                        maxindex = Math.abs((i - map.get(temp)));
                    }
                }
                else {
                    //没有再存
                    map.put(temp, i);
                }
            }
            return maxindex;
    }
}

5).总结

  • HashMap的应用。
  • 存下标。

试题链接:

相关推荐
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼5 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光5 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark5 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her15 天前
并查集-听课笔记
笔记·算法·并查集
码流子5 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven6 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark6 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218616 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法