当前位置:网站首页>哈希表刷题(下)
哈希表刷题(下)
2022-07-27 03:44:00 【std i hurt o love】
一、缺失的第一个正整数
该题存在问题,除解法一,解法四外,其他解法适用于无重复元素
解法一:哈希表(推荐)
- 用unordered_map创建一个哈希表,记录数组中出现的数字
- 从1开始遍历到n,查询哈希表是否有有此数字,没有它即时数组第一个缺失的正整数
- 如果遍历到最后都找到了,则确实第n+1个
class Solution {
public:
int minNumberDisappeared(vector<int>& nums) {
// write code here
int n=nums.size();
unordered_map<int,int>um;
for(int i=0;i<n;i++)
um[nums[i]]++;//记录出现的数据
int pos=1;
while(um.find(pos)!=um.end())
pos++;
return pos;
}
};
时间复杂度:O(n),第一次遍历数组,为O(n),第二次最坏从1遍历到n,为O(n)
空间复杂度:O(n),哈希表记录n个不重复的元素,长度为n
解法二:原地哈希
- 先遍历数组将所有负数修改为n+1
- 再次遍历数组,当遇到的数的绝对值不超过n时,则表示该元素位1~n里的元素,将该数值对应的下标里的元素改为负数,相当于出现过的正整数的下标都指向一个负数,这是类似哈希表的实现原理的操作
- 最后遍历数组,遇到的第一个非负下标即为缺失正整数
class Solution {
public:
int minNumberDisappeared(vector<int>& nums) {
// write code here
int n=nums.size();
for(int&i:nums)
if(i<=0)
i=n+1;//负数标记为n+1
for(int&i:nums)
if(abs(i)<=n)
nums[abs(i)-1]=-1*abs(nums[abs(i)-1]);//将该数字的下标标记为负数
for(int i=0;i<n;i++)
if(nums[i]>0)//找到第一个不为负的下标
return i+1;
return n+1;
}
};
时间复杂度:O(n),多次遍历数组,都是单层循环
空间复杂度:O(1),原地哈希,以索引为指向,没有额外空间
解法三:排序
class Solution {
public:
int minNumberDisappeared(vector<int>& nums) {
// write code here
sort(nums.begin(),nums.end());
int n=nums.size(),ct1=0,ct2=0;
for(int&i:nums)
{
if(i<=0)//负数统计其个数
ct1++;
else if(i!=++ct2)//是正整数则从一开始找,不匹配的即为缺失值
return ct2;
}
return n-ct1+1;
}
};
时间复杂度:O(n log 2 \log_2 log2n),排序
空间复杂度:O(1)
解法四:二分查找
class Solution {
public:
int binarysearch(vector<int>&v,int target){
//在给定区间内二分查找
int l=0,r=v.size()-1;
while(l<=r){
int mid=l+(r-l)/2;
if(v[mid]==target)
return mid;
else if(v[mid]<target)
l=mid+1;
else
r=mid-1;
}
return -1;
}
int minNumberDisappeared(vector<int>& nums) {
int n=nums.size();
sort(nums.begin(),nums.end());//排序
for(int i=1;i<=n;i++){
//对1~n所有元素依次使用二分查找
if(binarysearch(nums,i)==-1)return i;//找不到说明出现次数为1
}
return n+1;//若从1到遍历n,这n个正整数都存在,则正整数n+1一定不存在
}
};
时间复杂度:O(n log 2 \log_2 log2n),排序
空间复杂度:O(1)
二、三数之和
解法一:暴力法
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int>>result;
int n=num.size();
if(n<3)
return result;
sort(num.begin(),num.end());//使结果升序
for(int i=0;i<n-2;i++)
{
if(i&&num[i]==num[i-1])//若循环的当前的数和之前一样则continue
continue;
for(int j=i+1;j<n;j++)//不重复当前数+1
{
if(j>i+1&&num[j]==num[j-1])
continue;
for(int k=j+1;k<n;k++)
{
if(k>j+1&&num[k]==num[k-1])
continue;
if(num[i]+num[j]+num[k]==0)
result.push_back({
num[i],num[j],num[k]});
}
}
}
return result;
}
};
时间复杂度:O(n log 2 \log_2 log2n) +O(n^3);排序算法O(n log 2 \log_2 log2n)+三重循环枚举
空间复杂度:O(1);数组存储与读取数据
解法二:双指针(推荐)
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int>>result;
int n=num.size();
if(n<3)
return result;
sort(num.begin(),num.end());
for(int i=0;i<n-2;i++)
{
if(i&&num[i]==num[i-1])
continue;
int l=i+1,r=n-1;
while(l<r)
{
if(num[l]+num[r]+num[i]==0)//若指针l,r加当前数i等于0,则找到答案
{
result.push_back({
num[i],num[l],num[r]});
while(num[l]==num[l+1]&&l+1<r)//判断指针指向是否重复,重复跳过
l++;
while(num[r]==num[r-1]&&r-1>l)
r--;
l++,r--;
}
else if(num[l]+num[r]+num[i]>0)//较大,缩减右区间
r--;
else//反之缩减左区间
l++;
}
}
return result;
}
};
时间复杂度:O(n log 2 \log_2 log2n) + O(n^2),排序算法O(n log 2 \log_2 log2n)+双指针
空间复杂度:O(1)
边栏推荐
- Cool Lehman VR panorama paves the way for you to start a business
- 项目参数做成可配置项,@ConfigurationProperties注解的使用
- JMeter download and installation
- 2022-07-26:以下go语言代码输出什么?A:5;B:hello;C:编译错误;D:运行错误。 package main import ( “fmt“ ) type integer in
- Standard C language 11
- Prometheus Node Exporter 常用监控指标
- 第六章:云数据库
- 管理信息系统期末复习
- Post analysis of Data Analyst
- tcp协议知识详解
猜你喜欢

JMeter学习笔记004-CSV文件行数控制循环次数

E-commerce system combined with commodity spike activities, VR panorama continues to bring benefits

Influxdb basic understanding
![[Code] sword finger offer 04 search in two-dimensional array](/img/7d/a6693bfd24af9d9587539dda458d27.png)
[Code] sword finger offer 04 search in two-dimensional array

Ant JD Sina 10 architects 424 page masterpiece in-depth distributed cache from principle to practice pdf

Rust:axum学习笔记(1) hello world

佳明手表怎么设置用户定制显示

网工知识角|只需四个步骤,教会你使用SecureCRT连接到eNSP,常用工具操作指南必看

Prometheus Node Exporter 常用监控指标

scala 不可变Map 、 可变Map 、Map转换为其他数据类型
随机推荐
Use the kubesphere graphical interface dashboard to enable the Devops function
【LeetCode】Day104-无重叠区间
scala 不可变Map 、 可变Map 、Map转换为其他数据类型
BSN IPFs (interstellar file system) private network introduction, functions, architecture and characteristics, access instructions
BigDecimal踩坑总结&最佳实践
sram、dram、sdram、ddr的区别和用途
一张图看懂KingbaseES V9
Redis面试题(2022)
[C language] recursively explain the tower of Hanoi problem
新互联网时代已来 WEB 3.0 会给我们带来哪些新机遇
Sed output specified line
JVM调优中的一些常见指令
Brightcove appoints Dan Freund as chief revenue Officer
sed输出指定行
Navicat exports Mysql to table structure and field description
Easy to use shell shortcuts
深度剖析 —— 动态内存管理
细说Hash(哈希)
【软件工程期末复习】知识点+大题详解(E-R图、数据流图、N-S盒图、状态图、活动图、用例图....)
shel自动设置目录权限