XMOJ 4. 最长连续数列
题目:4. 最长连续数列
描述:
输入一个乱序的连续数列,输出其中最长连续数列长度,要求算法复杂度为 O(n)
输入:
54,55,300,12,56
输出:
你的输出是对一行数据处理的结果,也即 a+b 的结果。
输入样例:
100,4,200,1,3,2
54,55,300,12
1
5,4,3,2,1
1,2,3,4,5,6
输出样例:
4
2
1
5
6
方法:hash
思路:hash表,将输入数字依次加入hash表中,然后依次根据输入数字去删除hash表中的数字,以及相邻数字的,记录删除的数字的个数,数字个数即为该输入数字所在连续数列的长度,之后继续通过上述方法获取每一个输入数据所在连续序列的长度,其中最长的连续序列长度,即为整个乱序的连续数列的最长连续数列长度。
运行数据:最大执行时间:106.15 ms,内存消耗:17344 KiB
复杂度分析:
由于输入数据组数无法确定,时间复杂度和空间复杂度只考虑一组数据。
- 时间复杂度:O(n),n为一组输入数据的个数,加入hash表的时间复杂度为O(n),删除hash表中所有数字的时间复杂度也为O(n)。
- 空间复杂度:O(n),n为一组输入数据的个数,主要为保存拆分字符串的字符串数组的空间消耗以及hash表的空间消耗。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| import java.util.HashSet; import java.util.Scanner; import java.util.Set;
public class Main {
public static void main(String args[]) { Scanner scan = new Scanner(System.in); String line; while (scan.hasNextLine()) { line = scan.nextLine().trim(); System.out.println(LongestContinuousSequence(line)); } }
private static int LongestContinuousSequence(String line) {
String[] strs = line.split(","); Set<Integer> set = new HashSet<>();
for (String string : strs) { set.add(Integer.valueOf(string)); }
int ans = 0;
for (String string : strs) {
int count = 0; int i = Integer.valueOf(string); int j = i + 1;
while (set.remove(i)) { count++; i--; }
while (set.remove(j)) { count++; j++; }
ans = Math.max(ans, count); }
return ans; } }
|
学习所得,资料、图片部分来源于网络,如有侵权,请联系本人删除。
才疏学浅,若有错误或不当之处,可批评指正,还请见谅!