给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。
子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组
数据范围:
,
[2,3,4,5]
4
[2,3,4,5]是最长子数组
[2,2,3,4,3]
3
[2,3,4]是最长子数组
[9]
1
[1,2,3,1,2,3,2,2]
3
最长子数组为[1,2,3]
[2,2,3,4,8,99,3]
5
最长子数组为[2,3,4,8,99]
/**
*
* @param arr int整型一维数组 the array
* @return int整型
*/
function maxLength( arr ) {
let path=[],max=0;
for(let i=0;i<arr.length;i++){
if(path.includes(arr[i])){
if(path.length>max) max=path.length;
let idx=path.indexOf(arr[i]);
path=path.slice(idx+1);
}
path.push(arr[i]);
}
if(path.length>max) max=path.length;
return max;
}
module.exports = {
maxLength : maxLength
}; function maxLength( arr ) {
// write code here
let map=new Map()
let [l,r,res]=[0,0,0]
while(r<arr.length){
//有且在左边界的右边
if(map.has(arr[r])&&map.get(arr[r])>=l){
//把左边界定到map里面当前重复元素的下一个位置
l=map.get(arr[r])+1
}
//存起来
map.set(arr[r],r)
//右边界右移
r++
//取左右边界差与之前最大长度比,r++了所以是r-l不是r-l+1
res=Math.max(res,r-l)
}
return res
} /**
*
* @param arr int整型一维数组 the array
* @return int整型
*/
function maxLength( arr ) {
// write code here
//从数组本身入手
let max = 0;
let start = 0;
for(let i=0;i<arr.length;i++){
//console.log(arr.indexOf(arr[i],start),i);
if(arr.indexOf(arr[i],start)<i){//有重复,开始下标右移一位
start = arr.indexOf(arr[i],start)+1;
}else{
max = Math.max(max,i-start+1);//end下标-开始下标+1是长度
// console.log(max);
}
}
return max;
//滑动窗口
// let left = 0,right=0;
// let max=0;
// let map={};
// while(right<arr.length){
// let curr = arr[right];
// if(map[curr]){//计数 ++
// map[curr]++;
// }else{
// map[curr]=1;
// }
// right++;
// while(map[curr]>1){//大于1
// let del = arr[left];
// if(map[del]){//map里是否已经含有左指针的值,有则 --
// map[del]--;
// }else{
// map[del]=1;
// }
// left++;
// }
// max = Math.max(max,right-left)
// }
// return max;
}
module.exports = {
maxLength : maxLength
}; /**
*
* @param arr int整型一维数组 the array
* @return int整型
*/
function maxLength( arr ) {
// write code here
let map = new Map();
let k = 0;
let max = 1;
for(let i = 0; i < arr.length; i ++) {
if(map.has(arr[i])) {
k = Math.max(k, map.get(arr[i]) + 1);
}
map.set(arr[i], i);
max = Math.max(max, i-k+1);
}
return max;
}
module.exports = {
maxLength : maxLength
}; function maxLength( arr ) {
// write code here
let curArr = []
let max = 0
arr.forEach(x => {
if (curArr.includes(x)) {
max = Math.max(max,curArr.length)
let idx = curArr.indexOf(x)
curArr = curArr.slice(idx + 1, curArr.length)
}
curArr.push(x)
})
max = Math.max(max, curArr.length)
return max
} function maxLength( arr ) {
// write code here
let newArr = []; // 用来装所有子数组的长度
let len = arr.length;
if (len === 0 || len === 1) return len;
let l = 0
while (l < len) {
let arr1 = [];
for (let i = 0; i < len; i++) {
if (!arr1.includes(arr[i])) {
arr1.push(arr[i]);
if (i === len - 1) {
newArr.push(arr1.length);
l = len
}
} else {
let index = arr1.indexOf(arr[i]);// 找到重复元素的第一个下标
newArr.push(arr1.length);// 记录一次当前数组的长度
arr.splice(0, index + 1);
arr1 = [];
len = arr.length;
// 然后从这个下标的下一个开始组合 新的数组
l++;
if (i === len - 1) { // 最后一个
l = len
}
break;
}
}
}
let arr2 = newArr.sort((a, b) => b - a)
return arr2[0]
} function maxLength(arr) {
/*
two pointer: left right
map[all elements in array and index]
right in map, left = array[index] + 1
*/
// when array is empty
if (arr.length === 0) return 0
// init dic
let map = new Map();
// init two pointer
let left = 0;
let right = 0;
// max length
let res = 1;
// traverse array
while (left <= right && right < arr.length) {
// find new left
// new element not include
if (!map.has(arr[right])) {
res = Math.max(right - left + 1, res);
// save index to map
}
// right element exist
else {
// right element is lefter then left element
if (map.get(arr[right]) < left) {
res = Math.max(right - left + 1, res);
}
// right element is righter then left element
else {
left = map.get(arr[right]) + 1;
}
}
// get max length
// move pointer
map.set(arr[right], right)
right++;
}
return res;
}
// console.log(maxLength([2, 3, 4, 5]));
// console.log(maxLength([2, 2, 3, 4, 3]));
// console.log(maxLength([9]));
console.log(maxLength([2, 2, 3, 4, 8, 99, 3])); /**
*
* @param arr int整型一维数组 the array
* @return int整型
*/
function maxLength( arr ) {
if(!arr.length) return 0;
let queue = [];
let len = arr.length;
let maxLen = 1;
for(let i = 0;i<len;i++){
if(queue.indexOf(arr[i])!=-1){
let index = queue.indexOf(arr[i]);
queue.splice(0,index+1)
}
queue.push(arr[i]);
maxLen = Math.max(maxLen,queue.length);
}
return maxLen;
}
module.exports = {
maxLength : maxLength
}; 这种代码的复杂度怎么降低
function maxLength(arr) {
// write code here
for (var i = 0; i < arr.length; i++) {
for (var j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) {
arr.splice(j, 1)
j--
}
}
}
console.log(arr.length)
}
maxLength(arr)