给定无序数组arr,返回其中最长的连续序列的长度(要求值连续,位置可以不连续,例如 3,4,5,6为连续的自然数)
数据范围: ,数组中的值满足
要求:空间复杂度 ,时间复杂度
public int MLS (int[] arr) { // write code here Arrays.sort(arr); int res=0; for(int i=0;i<arr.length;i++){ int num=1; while(i+1<arr.length && arr[i+1]-arr[i]<=1){ if(arr[i]+1==arr[i+1]){ num++; } i++; } res=Math.max(res,num); } return res; }
import java.util.*; public class Solution { /** * max increasing subsequence * @param arr int整型一维数组 the array * @return int整型 */ //1 2 3 4 100 200 public int MLS (int[] arr) { // write code here Arrays.sort(arr); int max=1; int count=1; for(int i=1;i<arr.length;i++){ if(arr[i]==arr[i-1]){ continue; } if(arr[i]-arr[i-1]==1){ count++; }else{ count=1; } max=Math.max(count,max); } return max; } }
//运行时间:343ms 占用内存:117184KB import java.util.*; public class Solution { /** * max increasing subsequence * @param arr int整型一维数组 the array * @return int整型 */ public int MLS (int[] arr) { // write code here int count=0; int ans=0; boolean has[]=new boolean[100000006]; for(int i=0;i<arr.length;i++){has[arr[i]]=true;} for(int i=1;i<=100000;i++){ if(has[i]){count++;} else{ ans=Math.max(ans,count); count=0; } } return Math.max(ans,count); } }
public int MLS (int[] arr) { // write code here Arrays.sort(arr); int max = 0; int count = 0; for(int i=0;i<arr.length;i++){ count = 1; while(i+1<arr.length){ if(arr[i+1]==arr[i]+1) count++; else if(arr[i+1]!=arr[i]) break; i++; } max = Math.max(max,count); } return max; }
// 换个方向,不连续的时候记录,代码会简单许多 public int MLS (int[] arr) { int ans = 0; Arrays.sort(arr); int l = 0; int repeat = 0; for (int i = 1; i < arr.length; i++) { if (arr[i] == arr[i - 1]) { repeat++; continue; } if (arr[i] != arr[i - 1] + 1) { ans = Math.max(ans, i - l - repeat); l = i; repeat = 0; } } // 最后一个元素 if (l != arr.length - 1) { ans = Math.max(ans, arr.length - l - repeat); } return ans; }
import java.util.*; public class Solution { /** * max increasing subsequence * @param arr int整型一维数组 the array * @return int整型 */ public int MLS (int[] arr) { // write code here // 先对arr排序 Arrays.sort(arr); // <arr[i], {index1,index2...}> // 存在值相同的情况 Map<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>(); int len = arr.length; for(int i=0;i<len;i++){ int num = arr[i]; if(map.keySet().contains(num)){ map.get(num).add(i); }else{ List<Integer> list = new ArrayList<Integer>(); list.add(i); map.put(num, list); } } if(len == 0) return 0; int max = 1; // dp[i] 表示以arr[i]为结尾的元素所能表示最长连续子序列长度 int[] dp = new int[len]; // 初始时,每个arr[i]结尾的元素所能表示的最长连续子序列长度为1 Arrays.fill(dp,1); for(int i=1;i<len;i++){ int curValue = arr[i]; if(map.keySet().contains(curValue-1)){ List<Integer> indexList = map.get(curValue-1); for(int index : indexList){ dp[i] = Math.max(dp[index]+1,dp[i]); } max = Math.max(max, dp[i]); } } return max; } }
public class Solution { /** * max increasing subsequence * @param arr int整型一维数组 the array * @return int整型 */ public int MLS (int[] arr) { // write code here Arrays.sort(arr); int max = 1,len = 1; for (int i = 1; i < arr.length; i++) { if (arr[i]==arr[i-1]) continue; if (arr[i]==arr[i-1]+1) len++; else len = 1; max = Math.max(max,len); } return max; } }
//手动去重+排序 import java.util.*; public class Solution { /** * max increasing subsequence * @param arr int整型一维数组 the array * @return int整型 */ public int MLS (int[] arr) { // write code here if(arr.length==1) return 1; int len; int res=0; Arrays.sort(arr); int i=1; while(i<arr.length){ len=1; if(arr[i]==arr[i-1]+1){ while(i<arr.length&&arr[i]==arr[i-1]+1){ i++; len++; while(i<arr.length&&arr[i]==arr[i-1]) i++; } } else i++; res=Math.max(res,len); } return res; } }
import java.util.*; public class Solution { /** * max increasing subsequence * @param arr int整型一维数组 the array * @return int整型 */ public int MLS (int[] arr) { // write code here Arrays.sort(arr); int res = 0; int cnt = 1; for(int i=0;i<arr.length-1;i++){ if(arr[i+1]-arr[i]==1){ cnt++; if(cnt>res){ res = cnt; } }else if(arr[i+1]==arr[i]){ continue; }else{ cnt = 1; } } return res; } }
public class Solution { /** * max increasing subsequence * @param arr int整型一维数组 the array * @return int整型 */ public int MLS (int[] arr) { // write code here Set<Integer> set = new HashSet<>(); for (int t : arr) set.add(t); int max = Integer.MIN_VALUE; for (int t : arr) { if (set.contains(t - 1)) continue; int len = 1; while (set.contains(++t)) len++; max = Math.max(max, len); } return max; } }