LeetCode刷题——最长连续序列#128#Medium

最长连续序列题目的思路探讨与源码
    最长连续序列的题目如下图,该题属于数组类型的题目,主要考察对于数组以及遍历的理解和认识。本文的题目作者想到2种方法,第一种方法是哈希表方法,第二种方法是动态规划方法。其中第一种方法使用java写、第二种方法使用Python写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
在这里插入图片描述
    本人认为该题目可以使用哈希表算法,首先新建一个集合,循环遍历数组,把不重复的值加入到集合里面。然后开始遍历这个集合,如果集合不包含当前元素小1的元素值,那么令flag标记为1,nowNum记录当前元素的值,然后遍历集合去寻找有没有比当前元素大1的元素值,如果有就把flag加上1,nowNum也加1,然后取返回值和flag的较大值进行记录,那么按照这个思路我们的代码如下:

#喷火龙与水箭龟
class Solution {
    public int longestConsecutive(int[] nums) {
		Set<Integer> setRecord = new HashSet<>();
        int resNum = 0;
		for (int jr:nums) {
            setRecord.add(jr);
        }
        for (int jr : setRecord) {
            if (! setRecord.contains(jr-1)) {
                int flag = 1;
				int nowNum = jr;
                while (setRecord.contains(nowNum+1)) {
                    flag += 1;
					nowNum += 1;
                }
                resNum=Math.max(resNum,flag);
            }
        }
        return resNum;
    }
}

在这里插入图片描述
    显然,我们还可以使用动态规划的方法来进行解决,首先我们初始化一个字典,并且将最终返回值初始化为0,然后开始遍历这个数组,如果元素不在字典里,那么就取出其左右相邻数已有的连续区间长度 a和b,并且计算当前元素的区间长,如果当前元素的区间长大于最大连续值,则将区间长赋值给最大连续值。然后把当前元素的区间长记录到字典里,并且让它左边和右边的区间长和当前元素的区间长保持一致。所以根据这个思路就可以写出代码,下面是Python代码部分:

#喷火龙与水箭龟
class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        dt={}
        resNum=0
        for jr in nums:
            if(jr not in dt):
                a=dt.get(jr-1,0)
                b=dt.get(jr+1,0)
                flag=a+b+1
                if(resNum<flag):
                    resNum=flag
                dt[jr]=flag
                dt[jr-a]=flag
                dt[jr+b]=flag
        return resNum

在这里插入图片描述
    从结果来说java版本的哈希表方法和python版本的动态规划算法速度都比较一般,应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。

おすすめ

転載: blog.csdn.net/qq_26727101/article/details/118045649