• First Missing Positive leetcode java


    题目

    Given an unsorted integer array, find the first missing positive integer.

    For example,
    Given [1,2,0] return 3,
    and [3,4,-1,1] return 2.

    Your algorithm should run in O(n) time and uses constant space.

    题解

    题目给了一个unsorted integer array。当然,可以用先排好序的方法走(但是时间复杂度就不能是O(n))。

    所以这里提供一个不先排序的算法。

    注意:题目要求是find the first missing positive integer

    也就是说,即便你给的数组是4 5 6 7,看似都一一排好序,但是返回值一定是1,也就是如果给的数组是4 5 7 8 ,答案不是6,是1。

    因此,有了这个性质,我们就能i和A[i]是否相等来做判断了。“实现中还需要注意一个细节,就是如果当前的数字所对应的下标已经是对应数字了,那么我们也需要跳过,因为那个位置的数字已经满足要求了,否则会出现一直来回交换的死循环。”引自 Code Ganker

    代码如下:

     1     private void swap(int[] A, int i, int j){
     2         if(A[i]!=A[j]){
     3             A[i]^=A[j];
     4             A[j]^=A[i];
     5             A[i]^=A[j];
     6         }
     7     }
     8     public int firstMissingPositive(int[] A) {
     9         if(A.length==0||A==null)
    10             return 1;
    11             
    12         for (int i = 0; i < A.length; i++){
    13             if (i != A[i]){
    14                 if (A[i] <= 0 || A[i] > A.length-1 || A[i] == A[A[i]])
    15                     continue;
    16                 else{
    17                     swap(A, i, A[i]);
    18                     i--;
    19                 }
    20             }
    21         }
    22         int k = 1;  
    23         while (k < A.length && A[k] == k) 
    24             k++;  
    25             
    26         if(A[0]==k)
    27             return k+1;
    28         else
    29             return k;
    30     }

    一个更易于理解的代码来自于codeganker:

     1       public int firstMissingPositive(int[] A) {  
     2         if(A==null || A.length==0)  
     3             return 1;  
     4             
     5         for(int i=0;i<A.length;i++){  
     6             if(A[i]<=A.length && A[i]>0 && A[A[i]-1]!=A[i]){  
     7                 int temp = A[A[i]-1];  
     8                 A[A[i]-1] = A[i];  
     9                 A[i] = temp;  
    10                 i--;  
    11             }  
    12         }  
    13         
    14         for(int i=0;i<A.length;i++){  
    15             if(A[i]!=i+1)  
    16                 return i+1;  
    17         } 
    18         
    19         return A.length+1;  
    20     }

     

  • 相关阅读:
    关于git
    关于 素材,设计
    utiles
    sqlite
    蓝牙
    一个简单的Maven小案例
    【日志卡住不动】Registering current configuration as safe fallback point
    一分钟部署nacos
    生产日志文件太大NotePad++无法打开
    idea 安装 codota 插件
  • 原文地址:https://www.cnblogs.com/springfor/p/3889547.html
Copyright © 2020-2023  润新知