当前位置: 首页 > wzjs >正文

各大网站每日热点汇总关键词排名网站

各大网站每日热点汇总,关键词排名网站,网站页面设计规范,网站建设优化东莞缺失的第一个正数 问题描述示例输入与输出 解题思路代码实现代码解析1. **原地交换逻辑**2. **查找缺失的正整数**3. **特殊情况** 示例分析示例1示例2示例3 注意事项错误的交换顺序正确的交换顺序核心区别 总结 问题描述 给定一个未排序的整数数组nums,请你找出其…

缺失的第一个正数

        • 问题描述
        • 示例
        • 输入与输出
      • 解题思路
      • 代码实现
      • 代码解析
        • 1. **原地交换逻辑**
        • 2. **查找缺失的正整数**
        • 3. **特殊情况**
      • 示例分析
        • 示例1
        • 示例2
        • 示例3
      • 注意事项
        • 错误的交换顺序
        • 正确的交换顺序
        • 核心区别
      • 总结

问题描述

给定一个未排序的整数数组nums,请你找出其中没有出现的最小正整数。要求实现时间复杂度为O(n),并且只使用常数级别的额外空间。

示例
  1. 输入: nums = [1, 2, 0]
    输出: 3
    解释: 范围 [1, 2] 中的数字都在数组中,缺失的最小正整数为3。

  2. 输入: nums = [3, 4, -1, 1]
    输出: 2
    解释: 数组中包含1,但缺失2。

  3. 输入: nums = [7, 8, 9, 11, 12]
    输出: 1
    解释: 最小的正整数1没有出现。

输入与输出
  • 输入:一个整数数组nums,长度在[1, 10^5]范围内,数组中的每个元素范围为[-2^31, 2^31 - 1]
  • 输出:一个整数,表示数组中缺失的最小正整数。

解题思路

为了在O(n)时间复杂度和常数空间复杂度下解决问题,我们可以利用数组的索引作为辅助信息。具体步骤如下:

  1. 原地交换:
    将数组中的每个正整数放到其对应的索引位置。例如,数字1应该放到索引0的位置,数字2应该放到索引1的位置,依此类推。

  2. 遍历数组:
    遍历数组,找到第一个不满足nums[i] == i + 1的索引,返回i + 1作为缺失的正整数。

  3. 特殊情况:
    如果所有数字都正确,返回numsSize + 1


代码实现

以下是C语言的实现代码,包含详细注释:

int firstMissingPositive(int* nums, int numsSize) {// 第一轮循环:将每个正整数放到其对应的索引位置for (int i = 0; i < numsSize; i++) {// 使用 while 循环确保每次交换后重新检查当前 nums[i]while (nums[i] > 0 && nums[i] <= numsSize && nums[nums[i] - 1] != nums[i]) {// 交换 nums[i] 和 nums[nums[i] - 1]int tmp = nums[nums[i] - 1];nums[nums[i] - 1] = nums[i];nums[i] = tmp;}}// 第二轮循环:查找第一个不满足 nums[i] == i + 1 的索引for (int i = 0; i < numsSize; i++) {if (nums[i] != i + 1) {return i + 1; // 返回缺失的正整数}}// 如果所有数字都正确,返回 numsSize + 1return numsSize + 1;
}

代码解析

1. 原地交换逻辑
while (nums[i] > 0 && nums[i] <= numsSize && nums[nums[i] - 1] != nums[i]) {int tmp = nums[nums[i] - 1];nums[nums[i] - 1] = nums[i];nums[i] = tmp;
}
  • 条件解析:
    • nums[i] > 0 && nums[i] <= numsSize:确保当前数字是有效的正整数,并且在数组范围内。
    • nums[nums[i] - 1] != nums[i]:避免重复交换,确保交换操作有意义。
  • 交换逻辑:
    • 使用临时变量tmp保存nums[nums[i] - 1]的值。
    • nums[i]放到其正确的位置nums[nums[i] - 1]
    • tmp赋值给nums[i],完成交换。
2. 查找缺失的正整数
for (int i = 0; i < numsSize; i++) {if (nums[i] != i + 1) {return i + 1; // 返回缺失的正整数}
}
  • 遍历数组,检查每个数字是否在其正确的位置。
  • 如果发现nums[i] != i + 1,则返回i + 1作为缺失的正整数。
3. 特殊情况
return numsSize + 1;
  • 如果所有数字都正确,说明缺失的正整数是numsSize + 1

示例分析

示例1

输入: nums = [1, 2, 0]
过程:

  1. 第一轮循环后,数组变为[1, 2, 0](无需交换)。
  2. 第二轮循环中,nums[2] = 0 != 3,返回3

输出: 3

示例2

输入: nums = [3, 4, -1, 1]
过程:

  1. 第一轮循环后,数组变为[1, -1, 3, 4]
  2. 第二轮循环中,nums[1] = -1 != 2,返回2

输出: 2

示例3

输入: nums = [7, 8, 9, 11, 12]
过程:

  1. 第一轮循环后,数组仍为[7, 8, 9, 11, 12](无需交换)。
  2. 第二轮循环中,nums[0] = 7 != 1,返回1

输出: 1


注意事项

错误的交换顺序
int tmp = nums[i];
nums[i] = nums[nums[i] - 1];
nums[nums[i] - 1] = tmp;

问题:
在第二步中,nums[i] 被修改了,导致第三步的索引 nums[i] - 1 变成了错误的值。因为 nums[i] 已经被改过,所以后续的交换会出错。

正确的交换顺序
int tmp = nums[nums[i] - 1];
nums[nums[i] - 1] = nums[i];
nums[i] = tmp;

正确原因:
在第一步中,先保存了目标位置的值 nums[nums[i] - 1]
在第二步中,直接把 nums[i] 放到目标位置。
在第三步中,把之前保存的值赋给 nums[i]
关键: 这样不会提前修改 nums[i],所以索引始终是正确的。

核心区别
  • 错误的交换:先改了 nums[i],导致后续索引错乱。
  • 正确的交换:先保存目标位置的值,再交换,不会错乱。

简单来说,就是不要提前修改 nums[i],否则索引会乱掉

  1. 边界条件:

    • 确保交换时的索引nums[i] - 1始终在有效范围内([0, numsSize - 1])。
  2. 时间复杂度:

    • 每个数字最多被交换两次(一次放到正确位置,一次被交换出来),因此总时间复杂度为O(n)。

总结

通过原地交换的方式,我们可以高效地将数组中的正整数放到其对应的位置,并通过一次遍历找到缺失的最小正整数。这种方法满足了O(n)时间复杂度和常数空间复杂度的要求,适用于解决此类问题。


http://www.dtcms.com/wzjs/216841.html

相关文章:

  • 网站开发 百度编辑器会计培训班要多少钱
  • 山东德州网站建设seo站长工具是什么
  • 北京西站南广场东如何做好网络宣传工作
  • 做电商网站php开发的流程优化搜索引擎的方法
  • 做响应式网站的流程二级域名分发平台
  • html5 企业 网站国内可访问的海外网站和应用
  • 如何设计小程序广州seo运营
  • 视频网站开发报告浙江企业seo推广
  • 医院网站建设公司百度提交入口网站网址
  • 门户网站建设建议产品软文是什么意思
  • 安徽公司网站建设网络违法犯罪举报网站
  • 网站建设后续需要维护谷歌推广外包
  • 开一个网站建设公司网站优化是什么
  • 在线小程序外贸网站建设优化
  • 东莞市社会福利措施google搜索优化方法
  • 深圳网站建设相关推荐谷歌chrome浏览器官方下载
  • 平凉有做企业网站的吗温州seo结算
  • 沧州大型企业网站建设国内重大新闻
  • 工信部网站备案查询验证码错误企业营销战略
  • 做web网站原型抖音宣传推广方案
  • 深圳网站建设 网站设计零基础seo入门教学
  • 北京网站设计课程网站怎样做推广
  • 计算机网站建设毕业设计题目南昌seo排名公司
  • 品网站建设免费行情软件网站下载
  • 网站右侧悬浮代码seo上排名
  • 上海网站建设内容更新怎么做网站主页
  • 凡科做的网站营销型网站方案
  • 广州市网站制作好省推广100种方法
  • 武汉哪一家做网站专业西地那非片的正确服用方法
  • wordpress主题创建太原seo建站