• Leetcode--First Missing Positive


    https://oj.leetcode.com/problems/first-missing-positive/

    感觉这题还蛮难的,O(n)的时间,常数大小的额外空间,这个要求还是比较苛刻的

    首先,数组应该是可以修改的,否则恐怕没法做了,因为总要有一个地方来记忆一些信息,既然不给O(n)的额外的空间,只能在本地记忆了

    想法是:

    从左到右扫描数组,把数字放到恰当的位置上(把K放到数组的A[K-1]中,放之前,要把A[K-1]记下来)

    比如A[] = [3,4,-1,1],准备一个额外空间idx,

    扫描到3时,先把A[2]的值记入idx(为3这个数腾出空间),然后把3放到A[2]

    然后就处理存储在idx中的这个值,发现idx<=0,那么不用管

    此时数组变成[3,4,3,1]

    然后扫描第二个位置,即A[1]=4

    将A[3]的值记入idx,然后把4放入A[3]

    当前状态:idx=1,A[]=[3,4,3,4]

    然后处理存储在idx中的这个值,idx=1,满足idx>0 && idx <= sizeOfArray(对于1到sizeOfArray之间的数字,都是要处理的,因为结果就是这中间的某个数)

    把A[0]的值记入idx,把当前的idx记入A[idx-1],即把1记入A[0]

    当前状态:idx=3,A[]=[1,4,3,4]

    然后又是要处理存储在idx中的这个值,此时idx=3,发现A[2]==3,不需要继续处理了(因为继续下去就是无限循环)

    然后扫描第三个位置,同样发现A[2]==3,不需要处理

    然后扫描第四个位置,发现A[3]==4,不需要处理

    注意到我们在处理的过程中,没有丢失1到sizeOfArray之间的任何一个数字,所以可以保证结果的正确性

    然后从左到右第二次扫描这个数组,这个时候,有如下条件成立:对出现在原数组中的1到sizeOfArray之间的任何一个数字K,它肯定被放到了A[K-1]

    所以扫描的时候,如果遇到A[i]!=i+1,那么说明i+1在原数组中不存在,结果就是i+1

    如果A[i]==i+1对i从0到sizeOfArray-1都成立,结果就是sizeOfArray+1

    //result must be in [1..n]
    class Solution {
    public:
        int firstMissingPositive(int A[], int n) {
            for(int i = 0; i < n; i++){
                if(A[i] == i+1) continue;
                //a[i]!=i+1
                int idx = A[i];
                while(idx > 0 && idx <= n){
                    if(A[idx-1] == idx) break;
                    int tmp = A[idx-1];
                    A[idx-1] = idx;
                    idx = tmp;
                }
            }
            for(int i = 0; i < n; i++){
                if(A[i] != i+1){
                    return i+1;
                }
            }
            return n+1;
        }
    };
  • 相关阅读:
    2019/10/21 动手动脑
    2019/10/21 课堂测试---向数据库添加新用户
    2019/10/14 如何在静态方法中访问类的实例成员
    2019/10/14 构造函数、默认值、初始化块的优先级。
    2019/10/14 动手动脑---
    2019/9/30 极限测试(1)
    读《程序员的修炼之道------从小工到专家》有感 1
    课堂测试,统计小说<飘>前N个最常出现的单词
    Java课堂 动手动脑
    2019/9/23 课堂测试一 回文
  • 原文地址:https://www.cnblogs.com/fstang/p/3754549.html
Copyright © 2020-2023  润新知