文章
63
粉丝
0
获赞
0
访问
13.1k
(1)核心思想是利用数组本身作为哈希表,实现原地哈希。我们的目标是找到[1, n]中第一个未出现的正整数。因此,我们可以尝试将数字 x 放到数组下标为 x-1 的位置。具体步骤如下:
第一次遍历数组,对于每个位置 i 上的数 nums[i],如果它在 [1, n] 的范围内,并且它没有在正确的位置上(即 nums[i] != nums[nums[i] - 1]),我们就将它与 nums[nums[i] - 1] 位置上的数进行交换,直到当前位置 i 上的数不满足交换条件为止。
经过第一次遍历和交换,理想情况下,数组中 1 会在下标0的位置,2 会在下标1的位置,以此类推。
第二次遍历数组,从头检查。找到第一个满足 nums[i] != i + 1 的位置,那么 i + 1 就是我们寻找的最小未出现正整数。
如果第二次遍历结束后所有位置都满足 nums[i] == i + 1,说明 1 到 n 都已存在,那么最小未出现正整数就是 n + 1。
(2)
#include <stdio.h>
// 交换两个整数的辅助函数
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int firstMissingPositive(int* nums, int n) {
// 步骤1: 原地哈希,将数字放到对应的位置上
for (int i = 0; i < n; i++) {
// --- 关键逻辑:循环交换 ---
// 当前数 nums[i] 必须是正数、小于等于n,
// 并且它不在自己应该在的位置上 (nums[i] != i + 1)
// 且它要交换过去的目标位置上的数还不是它自己 (避免死循环, e.g., {1, 1})
while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {
...
登录后发布评论
暂无评论,来抢沙发