1、题目描述
1.1 移动所有零至数组末尾
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
1.2 示例
示例 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
2、解题思路
2.1 思路讲解
- 可利用滑动窗口
- 利用 L 和 R 标记最长序列的首位下标
- 连续数列即相邻的两个数字相同或差值为 1
- 循环中,当前值和上一次循环时数值不连续,统计R 和 L 的差值即可
- 每次计算连续数列,更新最大长度,最终输出最大序列的长度
- 注意边界值的处理
2.2 动画演示( 待补充)
3、答案
3.1 Java 代码
public class _03_最长连续序列 {
public static void main(String[] args) {
System.out.println(longestConsecutive(new int[]{}));
System.out.println(longestConsecutive(new int[]{0, 1, 1, 2, 4, 5, 5, 6, 7, 8}));
System.out.println(longestConsecutive(new int[]{0, 1, 1, 2, 4, 5, 5, 6, 7, 8, 10}));
System.out.println(longestConsecutive(new int[]{100, 4, 200, 1, 3, 2}));
System.out.println(longestConsecutive(new int[]{0, 3, 7, 2, 5, 8, 4, 6, 0, 1}));
}
public static int longestConsecutive(int[] nums) {
if (nums == null || nums.length < 1) {
return 0;
}
Arrays.sort(nums);
// ans:返回值 left、right:连续序列 min、max 值的下标,diff:连续两个数值的差值
int ans = 1, left = 0, right = 0, diff;
for (int i = 1; i < nums.length; i++) {
diff = nums[i] - nums[i - 1];
if (diff <= 1) // 和上一个数字是连续的
right++;
if (diff > 1) { // 和上一个数字不连续,计算上个连续序列的长度
ans = Math.max(ans, nums[right] - nums[left] + 1);
left = i;
right = i;
}
if (i == nums.length - 1) // 边界值
ans = Math.max(ans, nums[i] - nums[left] + 1);
}
return ans;
}
}