import java.util.*; public class Solution { /** * max increasing subsequence * @param arr int整型一维数组 the array * @return int整型 * * 将序列排成递增序列。然后遍历数组,依次将其与前一个数比较,若是比前一个大1, * 则连续子序列增加1;若是与前一个一样大,需要不管直接进入下一循环(去重); * 若是比前一个大超过1,则连续断掉,重新计数,同时比较并更新最大值。 */ public int MLS (int[] arr) { if (arr == null) { return 0; } if (arr.length == 1) { return 1; } /** * 复杂度分析: * 时间复杂度:O(ngln),快速排序的时间复杂度 * 空间复杂度:O(1),没有额外空间 */ quickSort(0, arr.length - 1, arr); int max = 1; int tempMax = 1; for (int i = 1; i < arr.length; i++) {//逐一比较该数与前一个数 if (arr[i] == arr[i-1] + 1) { tempMax++; } else if (arr[i] == arr[i-1]) {//重复元素情况 若是相等,则跳过 continue; } else { tempMax = 1; } max = Math.max(tempMax, max);//防止最后一个数字重复,跳过了上面的最大值比较 } return max; } public void quickSort (int start, int end, int[] arr) { if (start > end) { return; } int left = start; int right = end; int target = arr[start]; while (left < right) { while (left < right && arr[right] >= target) { right--; } while (left < right && arr[left] <= target) { left++; } if (left < right) { int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; } } arr[start] = arr[left]; arr[right] = target; quickSort(start, left -1, arr); quickSort(left + 1, end, arr); } }