首页 > 试题广场 >

最长无重复子数组

[编程题]最长无重复子数组
  • 热度指数:329303 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。
子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组

数据范围:
示例1

输入

[2,3,4,5]

输出

4

说明

[2,3,4,5]是最长子数组        
示例2

输入

[2,2,3,4,3]

输出

3

说明

[2,3,4]是最长子数组        
示例3

输入

[9]

输出

1
示例4

输入

[1,2,3,1,2,3,2,2]

输出

3

说明

最长子数组为[1,2,3]       
示例5

输入

[2,2,3,4,8,99,3]

输出

5

说明

最长子数组为[2,3,4,8,99]     
function maxLength( arr ) {
// write code here
// 队列 + hash 遇到重复的元素将队列中重复元素之前的元素出队
const hash = {}, queue = [];
let max = 0;
for(let i = 0; i < arr.length; i++) {
if (hash[arr[i]]) {
let tmp;
max = Math.max(queue.length, max);
while(arr[i] !== tmp) {
tmp = queue.shift();
delete hash[tmp];
}
}
hash[arr[i]] = 1;
queue.push(arr[i]);
}
max = Math.max(queue.length, max);
return max;
}
编辑于 2024-02-29 14:25:26 回复(0)
/**
 * 
 * @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
};

发表于 2022-12-27 16:12:26 回复(0)
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
    
}

发表于 2022-03-22 13:45:53 回复(0)
/**
 * 
 * @param arr int整型一维数组 the array
 * @return int整型
 */
function maxLength( arr ) {
   let map = new Map()
    let max = 0
    let left = 0
    for (let i = 0; i < arr.length; i++) {
        if (typeof(map.get(arr[i]))!='undefined') {
            left = Math.max(map.get(arr[i]) + 1,left)
        }
        max = Math.max(max, i - left + 1)
        map.set(arr[i], i)
    }
    return max
}
module.exports = {
    maxLength : maxLength
};
发表于 2021-11-13 21:40:56 回复(0)
/**
 * 
 * @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
};

编辑于 2021-11-25 11:33:33 回复(0)
function maxLength( arr ) {
    // write code here
    let startIdx = 0;
    let endIdx = arr.length - 1;
    let resArr = [];
    while(startIdx <= endIdx) {
        let curArr = [];
        for(let i = startIdx; i< arr.length; i++){
              const isFind = curArr.indexOf(arr[i]);
            if(isFind > -1) {
                if(resArr.length < curArr.length) {
                    resArr = [...curArr];
                }
                startIdx = startIdx + isFind + 1;
                curArr = [];
                break;
            } else {
                curArr.push(arr[i])
                if(i === endIdx) {
                    startIdx = endIdx + 1;
                     if(resArr.length === 0) {
                        resArr = [...curArr];
                    }
                }
            }
        }
        
    }
   return resArr.length;
}
发表于 2021-11-03 14:47:02 回复(0)
/**
 * 
 * @param arr int整型一维数组 the array
 * @return int整型
 */
function maxLength( arr ) {
    if(arr.length == 0) return 0
//     记录最大长度
    let max = 0
//     记录当前重复数字的下标
    let index = 0
    let map = new Map()
    for(let i = 0;i < arr.length;i++){
        if(map.has(arr[i])){
            index = Math.max(index,map.get(arr[i])+1)
        }
        map.set(arr[i],i)
        max = Math.max(max,i - index + 1)
    }
    return max
}
module.exports = {
    maxLength : maxLength
};
发表于 2021-09-29 19:18:01 回复(0)
function maxLength(arr) {
  const temp = [];
  let length = 0

  for (var i = 0; i < arr.length; i++) {
    const index = temp.indexOf(arr[i]);
    if (index > -1) {
      if(length < temp.length) {
        length = temp.length
      }

      // 截取
      temp.splice(0, index + 1);

      // 继续往temp里面添加
      temp.push(arr[i]);
    } else {
      temp.push(arr[i]);
    }
  }

  if(length < temp.length) {
    length = temp.length
  }

  return length
}
module.exports = {
  maxLength: maxLength,
};
发表于 2021-09-09 22:21:16 回复(0)
function maxLength(arr) {
  let len = arr.length, maxLen = 0, a = [], index
  for (let i = 0; i < len; i++) {
    index = a.indexOf(arr[i])
    if (index != -1) {
      a.splice(0, index + 1)
    }
    a.push(arr[i])
    maxLen = Math.max(maxLen, a.length)
  }
  return maxLen
}
发表于 2021-08-29 08:58:34 回复(0)
/**
 *
 * @param arr int整型一维数组 the array
 * @return int整型
 */
function maxLength( arr ) {
    // write code here
    let leftPoint = 0
    let rightPoint = 0
    let len = 0
    let maxLen = 0
    let flag = false
    let obj = {}
    if(arr.length === 0) {
        return 0
    }
    while(rightPoint <= arr.length) {
        if(obj[arr[rightPoint]] !== undefined) {
            if(!flag){flag= true}
            len = rightPoint - leftPoint
            maxLen = Math.max(maxLen, len)
            leftPoint = obj[arr[rightPoint]] + 1
            rightPoint = leftPoint
            obj = {}
        } else {
            obj[arr[rightPoint]] = rightPoint++
        }
    }
    if(flag){
        return maxLen
    } else {
        return arr.length
    }
}
module.exports = {
    maxLength : maxLength
};

还可以完善,先就这样
发表于 2021-08-20 16:24:05 回复(0)
/**
 * 
 * @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
};

发表于 2021-08-19 18:26:30 回复(0)
var arr1 = [12345688113333222244];
        var arr2 = arr1.sort(function(ab) {
            return a - b
        });
        var set = new Set(arr2);
        var newArry = [...set];
        console.log(newArry);
发表于 2021-07-23 20:08:06 回复(0)
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
}

发表于 2021-07-17 18:44:32 回复(0)
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]
  
}

发表于 2021-07-15 23:58:05 回复(0)
双指针:

1. map中不存在右指针, 记录当前长度。
2. map 中存在右指针:
    a: map中 右指针位置在左指针的左边,完全不影响,继续记录当前长度
    b. map中 右指针位置在左指针右边,需要重新选取长度。

3. 存右指针到map

时间复杂度: O(n)
空间复杂度:O(n)

JS 代码如下

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]));


发表于 2021-06-16 20:29:21 回复(0)
function maxLength(arr){
    // write code here
    let maxnum=1
    let newArr=[]
    
    sss:for(let n=0;n<arr.length;n++){
        for (let i=n;i<arr.length;i++){
            if(newArr.indexOf(arr[i])===-1){
                newArr.push(arr[i])
            }else{
                if(newArr.length>maxnum){
                    maxnum=newArr.length
                }
                    newArr=[]
                   continue sss
            }
        }
    }
    return maxnum
}
module.exports = {
    maxLength : maxLength
};
发表于 2021-05-24 15:27:59 回复(0)
JavaScript版 利用队列的性质
/**
 * 
 * @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
};


发表于 2021-05-21 17:13:00 回复(0)
这种代码的复杂度怎么降低

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)

发表于 2021-04-03 01:56:00 回复(0)