c_cpp 给定未排序的整数数组,找到第一个缺少的正整数。例如,给定[1,2,0]返回3,[3,4,-1,1]返回2. Yo

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 给定未排序的整数数组,找到第一个缺少的正整数。例如,给定[1,2,0]返回3,[3,4,-1,1]返回2. Yo相关的知识,希望对你有一定的参考价值。

/*
题目说清楚了,很简单,但是实现起来还是有些细节比较烦人。首先,不能按照A[i] = i来存,因为题目要求寻找正数,如果A[0]用来存储0的话,会影响数据处理。比如当A = {1}的时候,如果A[0] = 0的话,根本没地方存1的值了。所以正确的存储方式应该是A[i]= i+1.
但是由此带来的是,Line 7, 9, 11, 12, 16, 17都需要更改,以反映出这种映射。
还有一点容易遗忘的就是Line18,如果当前数组找不到目标值的话,那么目标值就应该是n+1.这个容易漏了。
*/
/*
思路:

无序数组的题目如果要O(n)解法往往要用到hash table,但这题要求constant space。所以可以用数组本身作为一个"hash table":A[0] = 1, A[1] = 2, .... A[n-1] = n。目标是尽可能将数字i放到数组第i-1个位置。

扫描数组中每个数:
1. 如果A[i]<1或者A[i]>n。说明A[i]一定不是first missing positive。跳过
2. 如果A[i] = i+1,说明A[i]已经在正确的位置,跳过
3. 如果A[i]!=i+1,且0<A[i]<=n,应当将A[i]放到A[A[i]-1]的位置,所以可以交换两数。
这里注意,当A[i] = A[A[i]-1]时会陷入死循环。这种情况下直接跳过。
*/

int find_first_missing_positive(int A[], int N) {
    for(int i=0; i<N; i++) {
        while(A[i] > 0 && A[i] <= N) {
            if(A[i] == i+1) break;
            if(A[i] == A[A[i]-1]) break;
            swap(A[i], A[A[i]-1]);
        }
    }
    for(int i=0; i<N; i++) {
        if(A[i] != i+1)
            return i+1;
    }
    return N+1;
}

以上是关于c_cpp 给定未排序的整数数组,找到第一个缺少的正整数。例如,给定[1,2,0]返回3,[3,4,-1,1]返回2. Yo的主要内容,如果未能解决你的问题,请参考以下文章

java 给定未排序的非负整数数组,找到一个连续的子数组,它会增加给定的数字。

中位数: 给定一个未排序的整数数组,找到其中位数。

2021-11-16:最长递增子序列的个数。给定一个未排序的整数数组,找到最长递增子序列的个数。注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。力扣673。

未排序数组中累加和为给定值的最长子数组长度

未排序数组中累加和小于或等于给定值的最长子数组长度

c_cpp 在排序数组中,找到最接近给定数字的数字