给定无序数组arr,返回其中最长的连续序列的长度(要求值连续,位置可以不连续,例如 3,4,5,6为连续的自然数)
数据范围: ,数组中的值满足
要求:空间复杂度 ,时间复杂度
/** * max increasing subsequence * @param arr int整型一维数组 the array * @param arrLen int arr数组长度 * @return int整型 * * C语言声明定义全局变量请加上static,防止重复定义 */ #include <stdlib.h> int inc(const void *a,const void *b) { return *(int *)a-*(int *)b; } int MLS(int* arr, int arrLen ) { // write code here qsort(arr,arrLen,sizeof(int),inc); int max=0; for(int i=0;i<arrLen;i++) { int sum=1; if(arr[i]+1==arr[i+1]) { for(int j=i;j<arrLen-1;j++) { if(arr[j]+1==arr[j+1]) { sum+=1; } else if(arr[j]==arr[j+1]) { continue; } else { i=j; break; } } } if(max<sum) max=sum; } return max; }
static const int MAX_N = 100000000; static int bv[MAX_N/32+1]; inline void setb(int i) { bv[i/32] |= (0x01 << (i % 32)); } inline int getb(int i) { return (bv[i/32] >> (i % 32)) & 0x01; } int MLS(int* arr, int arrLen) { memset(bv, 0x00, sizeof(bv)); for (int i=0; i<arrLen; i++) setb(arr[i]); int len = 1, maxlen = 1; for (int i=2; i<MAX_N; i++) if (getb(i)) { if (getb(i-1)) len++; } else { if (len > maxlen) { maxlen = len; if (maxlen > MAX_N - i) break; // stop early } len = 1; } return maxlen; }