桶排序

对于0-1000 ,用1001个桶  简单版

或者用10个桶0-9,先按各位装桶,然后依(桶)次放回,然后再按十位放桶,放回,然后百位。

也就是基数排序

https://www.cnblogs.com/lqerio/p/11901828.html

Leetcode41

设数组长度为n

那么答案必在 1-n+1的范围内。那么一个萝卜一个坑

先做预处理。类似于桶排序,把正确的数放在正确的位置。

遍历数组,对于i+1,若i+1在1-n内,应该放在nums[i]的位置上

if (nums[i] <= 0 || nums[i] > nums.size() || nums[i] == nums[nums[i] - 1]) 跳过。因为没有正确的位置或者已经在正确的位置上了

然后遍历,从0开始到n,若nums[i]!=i+1,就输出i+1. 因为这时候,通过上面的预处理,说明不存在i+1这个数。

class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
for (int i = 0; i < nums.size(); i++) {
while (nums[i] != i + 1) {
if (nums[i] <= 0 || nums[i] > nums.size() || nums[i] == nums[nums[i] - 1])
break;
int idx = nums[i] - 1;
nums[i] = nums[idx];
nums[idx] = idx + 1;
}
}
for (int i = 0; i < nums.size(); i++) {
if (nums[i] != (i + 1)) {
return (i + 1);
}
}
return (nums.size() + 1);
}
};

然后官方题解为hash表

首先可知结果最大为n+1,n为数组长度

预处理:

1.先判断是否有1,无则输出1

2.否则遍历数组,对大于n或者小于1的数改为1

3.然后遍历数组,对于num[k]=i,将nums[i]设置为负数。 nums[i]<0说明数组中存在i  (用自己做hash表)

class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
int flag = 0; // 1 not exist
for (int i = 0; i < n; i++)
if (nums[i] == 1) {
flag=1;
break;
}
if (!flag)
return 1;
if (n == 1)
return 2; // 用 1 替换负数,0,和大于 n 的数
// 在转换以后,nums 只会包含1-n
for (int i = 0; i < n; i++)
if ((nums[i] <= 0) || (nums[i] > n))
nums[i] = 1; // 使用索引和数字符号作为检查器
// 例如,如果 nums[1] 是负数表示在数组中出现了数字 `1`
// 如果 nums[2] 是正数 表示数字 2 没有出现
for (int i = 0; i < n; i++) {
int a = abs(nums[i]);
// 如果发现了一个数字 a - 改变第 a 个元素的符号
// 注意重复元素只需操作一次
if (a == n)
nums[0] = - abs(nums[0]);
else
nums[a] = - abs(nums[a]);
} // 现在第一个正数的下标就是第一个缺失的数
for (int i = 1; i < n; i++) {
if (nums[i] > 0)
return i;
}
if (nums[0] > 0)
return n;
return n + 1;
}
};

最新文章

  1. EChart使用
  2. Maven新建webapp项目index.jsp报错
  3. 【MySQL】事务没有提交导致 锁等待Lock wait timeout exceeded异常
  4. MySQL如何发型不乱的应对半年数十TB数据增量
  5. 优化mysql主从下的slave延迟问题
  6. JavaOOP项目 CMS内容管理系统
  7. wordpress代理设置
  8. 使用XCopy发布网页
  9. Windows7 sp1 64位下安装配置eclipse+jdk+CDT+minGW
  10. 设计模式16---设计模式之组合模式(Composite)(行为型)
  11. Socket实现-Socket I/O
  12. 禁止mui事件tab切换内容左右滑动
  13. Linux运维第二课----Linux发展史、环境准备
  14. iptables(4)规则编写
  15. GO数据类型
  16. git的优缺点
  17. K-means &amp;K-medoids 聚类
  18. ora-12705解决方法
  19. nginx保持会话的方式
  20. Graph database_neo4j 底层存储结构分析(1)

热门文章

  1. 【葵花宝典】lvs+keepalived部署kubernetes(k8s)高可用集群
  2. Spring Validation 验证
  3. 【Azure App Service For Container】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
  4. MySQL全面瓦解21(番外):一次深夜优化亿级数据分页的奇妙经历
  5. 它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程
  6. gitignore 不起作用的解决办法 不再跟踪 让.gitignore生效,跟踪希望被跟踪的文件
  7. Spring整合SpringMVC + Mybatis基础框架的配置文件
  8. office提示“应用程序无法正常启动(0xc0000142)。请单击确认关闭应用程序”
  9. Grafana+Prometheus通过node_exporter监控Linux服务器信息
  10. Django(中间件)