给定一个长度为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)