美文网首页
查找无序数组中缺失的最小正整数

查找无序数组中缺失的最小正整数

作者: studyever | 来源:发表于2019-07-12 14:25 被阅读0次

一个长度为n的无序数组,找出缺失的最小正整数,
例:[2, 3, 1, 5] --> 4 长度为4的数组是[1, 2, 3, 4]
[5, 6, 2] --> 1 长度为3的数组是[1, 2, 3]
废话不多说,直接贴代码

public int firstMissingPositive(int[] mums) {
    int n = mums.length;
   // 把数组中小于等于0和大于n的数字,置为-1
   for (int i = 0; i < n; i++) {
        if (nums[i] <= 0 || mums[i] > n) {
             mums[i] = -1;
        }
   }
   // 正常的长度为n的数组,第i个位置上的数字应该是i + 1,把数字放在对应的  位置上,有重复的则置为-1
   for (int i = 0; i < n; i++) {
       int temp = mums[i];
       if (mums[i] != (i + 1) && mums[i] != -1) {
            // 如果该位置上的数字不是 i + 1,则交换
            if (nums[temp - 1] != temp) {
                 nums[i] = nums[temp - 1];
                 nums[temp - 1] = temp;
                 // 这时需要继续处理i
                i--;
             }
            else {
                nums[i] = -1;
            }
       }
   }
  // 这时,存在的数字都在正确的位置,遍历数字,第一个-1即是缺失的最小数
   for (int i = 0; i < n; i++) {
       if (nums[i] == -1) {
            return i + 1;
        }
   }
   // 找不到的话,说明不缺
  return -1;
}

该算法的时间复杂度是O(n)。

相关文章

网友评论

      本文标题:查找无序数组中缺失的最小正整数

      本文链接:https://www.haomeiwen.com/subject/cbjekctx.html