题目
题目链接:
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,
};