leetcode热题100思路--哈希表

语言: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)在判断他是否是最长连续序列中第一个值的最后,比较这次的最长序列长度与上一次最长度序列的长度,保留最大值

560. 和为 K 的子数组

提示

中等

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的子串。

这题不能用滑动窗口,因为滑动最左边的值可能是负值,不能通过减去最左边的值来实现窗口右移。

41. 缺失的第一个正数

提示

困难

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一定是最小那个正整数。

附一个大佬的生动比喻

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值