• 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的数量
    s[R][1] - S[L][1] = S[R][0]-S[L][0];
    S[R][1] - S[R][0] = S[L][1]-S[L][0];
    3.遍历数组,找最大,所以存下标。
    4.要是不存在就存下来,有就不存了,因为要找最大的子数组,肯定是L的最小,相减起来才是最大的。


    4).代码示例

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    5).总结

    • HashMap的应用。
    • 存下标。

    试题链接:

  • 相关阅读:
    8/1 思维+扩展欧几里得+树上dp
    谷歌向全体员工发放万元红包:外包员工和实习生也不例外
    进阶高级,接口+接口自动化测试疑难解答,一篇带你策底打通...
    exesql=“UPDATE test set date=‘%s‘“ % date 是啥意思
    在家怎么做芋圆 芋圆的做法
    Linux下shell编写脚本指南
    1001 A+B Format(字符串处理)
    IDEA 全局查找 ctrl + shift + F 快捷键失效
    MapReduce执行流程
    web前端期末大作业 html+css学生心理 7页主题网页设计
  • 原文地址:https://blog.csdn.net/weixin_56715699/article/details/133140743