第128题 最长连续序列
题目
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
示例 1:
输入:nums = [100,4,200,1,3,2] 输出:4 解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1] 输出:9
示例 3:
输入:nums = [1,0,1,2] 输出:3
思路
从示例3可以看出这个数字连续的最长序列不包括重复数字的,所以这个数组需要去重
常见的数组去重的方式
排序 + 数组中相邻数字相同跳过
排序之后,连续最长序列寻找思路
数组中相邻数字后面的比前面的多1就统计
否则就比出连续数字序列的最大值,重新进行统计
代码示例
import java.util.Arrays;
import java.util.Scanner;public class lc128 {public static void main(String[] args) {//数组输入的方法Scanner scanner = new Scanner(System.in);String str = scanner.nextLine();String[] split = str.substring(1, str.length() - 1).split(",");int[] arr = new int[split.length];for (int i = 0; i < split.length; i++) {arr[i] = Integer.parseInt(split[i]);}lc128 solution = new lc128();int res = solution.longestConsecutive(arr);System.out.println(res);}public int longestConsecutive(int[] nums) {//判空条件if(nums == null || nums.length == 0){return 0;}//排序,为后续去重和连续数组的判断做准备Arrays.sort(nums);int sum = 1, max = 1;for (int i = 1; i < nums.length; i++) {//如果相邻数组的数字相同就去重if(nums[i-1] == nums[i]){continue;}//如果前面的数字和后面的数字连续就统计if(nums[i-1] + 1 == nums[i]){sum++;//否则就比出最大值,让sum重新统计}else{max = Math.max(sum, max);sum = 1;}}//对最后sum统计的结果比出最大值max = Math.max(sum, max);return max;}
}