语言:python
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例 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
思路:
(1)使用set函数对数组进行排序并去重
(2)对集合进行遍历,如果他是最长连续序列中的第一个值,也就是该值-1不在集合中,那么把最长序列长度设为1,并把current_num设为该值
(3)循环判断下一个值(current_num+1)是否在集合中,如果在的话,最长序列长度+1
(4)在判断他是否是最长连续序列中第一个值的最后,比较这次的最长序列长度与上一次最长度序列的长度,保留最大值
提示
中等
2.1K
相关企业
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的连续子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2 输出:2
示例 2:
输入:nums = [1,2,3], k = 3 输出:2
1.总体思路:前缀和+哈希表
由于pre[i]+sum(nums[i:j])=pre[j],现在要求sum(nums[i:j])=k,那么这个问题可以转变成根据pre[j]-k寻找pre[i],我们可以将pre[j]出现的频率存入哈希表中,再在遍历时,寻找哈希表中pre[j]-k的值
注意hashmap[0]=1,因为pre[j]-k刚好为0时,也是找到了和为k的子串。
这题不能用滑动窗口,因为滑动最左边的值可能是负值,不能通过减去最左边的值来实现窗口右移。
提示
困难
1.9K
相关企业
给你一个未排序的整数数组 nums
,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n)
并且只使用常数级别额外空间的解决方案。
示例 1:
输入:nums = [1,2,0] 输出:3
示例 2:
输入:nums = [3,4,-1,1] 输出:2
示例 3:
输入:nums = [7,8,9,11,12] 输出:1
1.总体思路:原地哈希
(1)如何构建哈希表:将数组的值与index对应起来,构成哈希表的形式。将每个大于0小于len(nums)-1的值nums[i]调整到nums[i]-1的位置上去,这样key为i的哈希值为i+1
(2)如何调整数组顺序:使用while循环判断nums[nums[i]-1]的值是否为nums[i],这样子就会一直进行交换,直到当前第i个位置的值nums[i]与i对应,即nums[i]=nums[nums[i]-1]=i+1,或者当前的值len(nums)+1<nums[i]或者nums[i]<=0,说明这个位置的值很可能就是缺少那个正整数。
(3)如何找到最小的正整数:遍历调整完的数组,由于数组与index相对应的值,已经按升序排列,那么当Nums[i]!=i+1时,此时i+1一定是最小那个正整数。
附一个大佬的生动比喻