牛客NC41 最长无重复子数组【高频 中等 滑动窗口,map 提供Java,Go,PHP,JS答案 】

文章介绍了如何使用同向双指针和哈希表的数据结构在不同编程语言(Java、Go、PHP、JS)中找到一个整型数组中,每个数出现位置的最大连续子序列长度。关键点在于用哈希表存储每个数字的最后出现位置,更新过程中动态计算子序列长度。
摘要由CSDN通过智能技术生成

题目

在这里插入图片描述
在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4

相同类型题目链接:
https://www.lintcode.com/problem/384

思路

同向双指针,用hashtable来保存数字最后一次出现的位置,没出现过则为位置-1。

参考答案Java

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int maxLength (int[] arr) {
         //同向双指针,用hashtable来保存数字最后一次出现的位置,没出现过则为位置-1。
            if(arr ==null || arr.length ==0) return 0;
            Map<Integer,Integer> map = new HashMap<>();
            for (int i : arr) {
                map.put(i,-1);
            }

            map.put(arr[0],0);  //非常关键
            int pre =1,ans =1;
            for (int i = 1; i < arr.length; i++) {
                int p1 = i-map.get(arr[i]);
                int p2 = pre+1;
                int cur = Math.min(p1,p2);
                ans = Math.max(ans,cur);
                pre = cur; //重新复制pre
                map.put(arr[i],i); //保存数字最后一次出现的位置
            }
            return ans;
    }
}

参考答案Go

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param arr int整型一维数组 the array
 * @return int整型
 */
func maxLength(arr []int) int {
	if arr == nil || len(arr) == 0 {
		return 0
	}
	//同向双指针,用hashtable来保存数字最后一次出现的位置,没出现过则为位置-1。
	help := map[int]int{}
	for _, v := range arr {
		help[v] = -1
	}

	help[arr[0]] = 0 //非常关键

	var pre int = 1
	var ans int = 1

	for i := 1; i < len(arr); i++ {
		p1 := i - help[arr[i]]
		p2 := pre + 1

		cur := p1 //cur=min(p1,p2)
		if p2 < p1 {
			cur = p2
		}

		if cur > ans { //ans = max(ans,cur)
			ans = cur
		}

		pre = cur //重新复制pre

		help[arr[i]] = i //保存数字最后一次出现的位置
	}
	return ans
}

参考答案PHP

<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param arr int整型一维数组 the array
 * @return int整型
 */
function maxLength( $arr )
{
    if ($arr == null || count($arr) == 0) return 0;
    //同向双指针,用hashtable来保存数字最后一次出现的位置,没出现过则为位置-1。
    //php里的hashtable用数组表示就行了
    $help = array();
    foreach ($arr as $v) {
        $help[$v] = -1;
    }

    $help[$arr[0]] = 0; //非常关键
    $pre = 1;
    $ans = 1;
    for ($i = 1; $i < count($arr); $i++) {
        $p1 = $i - $help[$arr[$i]];
        $p2 = $pre + 1;

        $cur = $p1; //cur = min($p1,$p2)
        if ($p2 < $p1) {
            $cur = $p2;
        }

        if ($cur > $ans) { //$ans = max($cur,$ans)
            $ans = $cur;
        }

        $pre = $cur; //重新赋值pre
        $help[$arr[$i]] = $i; //关键:记住数字最后一次出现的位置
    }
    return $ans;
}

参考答案JS

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param arr int整型一维数组 the array
 * @return int整型
 */
function maxLength(arr) {
    if (arr == null || arr.length == 0) return 0;
    var help = new Map();
    for (var i in arr) {
        help.set(arr[i], -1);
    }

    help.set(arr[0], 0); //关键点0

    var ans = 1;
    var pre = 1;
    for (var i = 1; i < arr.length; i++) {
        var p1 = i - help.get(arr[i]);
        var p2 = pre + 1;
        var cur = p1;
        if (cur > p2) {
            //关键点2 cur=min(p1,p2)
            cur = p2;
        }

        if (ans < cur) {
            // 关键点3 ans =max(ans,cur)
            ans = cur;
        }

        pre = cur; //关键点4
        help.set(arr[i], i); //关键点5
    }
    return ans;
}
module.exports = {
    maxLength: maxLength,
};

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵长辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值