题解 | #最长无重复子数组#

最长无重复子数组

http://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param arr int整型一维数组 the array
 * @return int整型
 */

/**
 * 解法一:滑动窗口(reduce累加器)
 * 此题与leetcode 003 题类似
 * 思路:
 * (1)先判断数组 arr 的长度,如果 arr.length <= 1 直接返回 arr.length
 * (2)使用数组的 reduce 累加器,滑动窗口过程处理(详细过程看以下代码)
 * (3)返回最长无重复子数组的长度 maxLen
 * 时间复杂度:O(n),n 代表数组长度,reduce 会将数组遍历一遍
 * 空间复杂度:O(1)
 */
export function maxLength(arr: number[]): number {
    if (arr.length <= 1) return arr.length
    let maxLen = 0
    
    arr.reduce((total, value) => {
        const index = total.indexOf(value)
        
        // push 到 total 尾部
        total.push(value)
        
        if (index === -1) {
            // 如果该数字没有在 total 中出现过,获取目前为止滑动窗口的最大值
            maxLen = Math.max(total.length, maxLen)
        } else {
            // 如果该数字有在 total 中出现过,则剔除掉 total 中 0 ~ index 的字符
            total = total.slice(index + 1)
        }
        
        return total
    }, [])
    
    return maxLen
}

/**
 * 解法二:滑动窗口(双指针&哈希)
 * 思路:
 * (1)先判断数组 arr 的长度,如果 arr.length <= 1 直接返回 arr.length
 * (2)窗口左右界都从数组首部开始,每次窗口优先右移右界,并统计进入窗口的元素的出现频率。
 * (3)一旦右界元素出现频率大于1,就需要右移左界直到窗口内不再重复,将左边的元素移除窗口的时候
 *     同时需要将它在哈希表中的频率减1,保证哈希表中的频率都是窗口内的频率。
 * (4)每轮循环维护最长子串的长度 maxLen
 * 时间复杂度:O(n),外循环窗口右界从数组首右移到数组尾,内循环窗口左界同样如此,因此复杂度为O(n + n) = O(n)
 * 空间复杂度:O(n),最坏情况整个数组都是不重复的,哈希表的长度就是数组长度
 */
export function maxLength(arr: number[]): number {
    if (arr.length <= 1) return arr.length
     
    let maxLen = 0
    const map = new Map()
    
    // 设置窗口左右边界
    for (let left = 0, right = 0; right < arr.length; right++) {
        if (map.has(arr[right])) {
            // 窗口右移进入哈希表统计次数
            map.set(arr[right], map.get(arr[right]) + 1)
        } else {
            map.set(arr[right], 1)
        }
        
        // 出现次数大于1,则窗口内有重复
        while (map.get(arr[right]) > 1) {
            // 窗口左移,同时减去该数字出现的次数
            map.set(arr[left], map.get(arr[left++]) - 1)
        }
         
        maxLen = Math.max(maxLen, right - left + 1)
    }
    
    return maxLen
}

一站式解决前端面试高频算法题

https://github.com/hovinghuang/fe-agorithm-interview

全部评论

相关推荐

真tmd的恶心,1.面试开始先说我讲简历讲得不好,要怎样讲怎样讲,先讲背景,再讲技术,然后再讲提升多少多少,一顿说教。2.接着讲项目,我先把背景讲完,开始讲重点,面试官立即打断说讲一下重点,无语。3.接着聊到了项目的对比学习的正样本采样,说我正样本采样是错的,我解释了十几分钟,还是说我错的,我在上一家实习用这个方法能work,并经过市场的检验,并且是顶会论文的复现,再怎么不对也不可能是错的。4.面试官,说都没说面试结束就退出会议,把面试者晾在会议里面,丝毫不尊重面试者难受的点:1.一开始是讲得不好是欣然接受的,毕竟是学习。2.我按照面试官的要求,先讲背景,再讲技术。当我讲完背景再讲技术的时候(甚至已经开始蹦出了几个技术名词),凭什么打断我说讲重点,是不能听出人家重点开始了?这也能理解,每个人都有犯错,我也没放心上。3.我自己做过的项目,我了解得肯定比他多,他这样贬低我做过的项目,说我的工作是错误的,作为一个技术人员,我是完全不能接受的,因此我就和他解释,但无论怎么解释都说我错。凭什么,作为面试官自己不了解相关技术,别人用这个方式work,凭什么还认为这个方法是错的,不接受面试者的解释。4.这个无可厚非,作为面试官,不打招呼就退出会议,把面试者晾着,本身就是有问题。综上所述,我现在不觉得第一第二点也是我的问题,面试官有很大的问题,就是专门恶心人的,总结面试官说教,不尊重面试者,打击面试者,不接受好的面试者,技术一般的守旧固执分子。有这种人部门有这种人怎么发展啊。最后去查了一下,岗位关闭了。也有可能是招到人了来恶心人的,但是也很cs
牛客20646354...:招黑奴啊,算法工程师一天200?
点赞 评论 收藏
分享
酷酷的喜马拉雅山:感觉这比一直在初筛不动的好多了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务