zoukankan      html  css  js  c++  java
  • MissingNumber缺失的数字,FirstMissingPositive第一个缺失的正数

    MissingNumber问题描述:给定一个数组,数组数字范围是0-n,找到缺失的数字。例如nums={0,1,3},return2。

    算法分析:第一种方法,对数组进行排序,然后找到和下标不一致的数字,下标即为缺失的数字。第二种方法,对于这样的数组,如果没有缺失数字,即使没有排序,下标-数字的差相加为0.假设缺失的数字在nums.length位置,那么sum+nums.length - x = 0;

     1 public int missingNumber(int[] nums) {
     2         Arrays.sort(nums);
     3         for(int i = 0; i < nums.length; i ++)
     4         {
     5             if(nums[i] != i)
     6             {
     7                 return i;
     8             }
     9         }
    10         return nums.length;
    11     }
    12     
    13     //如果没有缺失数字,那么序号i-nums[i]的和sum为0;如果有缺失数字那么,缺失数字在nums.length位置,
    14     //nums.length-x+sum=0;x=nums.length+sum;
    15     public int missingNumber2(int[] nums) {
    16         int sum = 0;
    17         for(int i = 0; i < nums.length; i++)
    18             sum = sum - nums[i] + i;
    19 
    20         return sum + nums.length;
    21     }

    FirstMissingPositive问题描述:给一个没有排序的数组,找到第一个缺失的正数,例如nums={1,2,0}return3,nums={3,4,-1,1}return2

    算法分析:既然是找正数,那么肯定是从1开始的,那么我们把1放在nums[0],以此类推,我们把数组中每个元素都放在它应该在的位置。那么找到下标和数字不相符的元素,下标+1即为缺失的正数。

     1 public static int firstMissingPositive(int[] nums) {
     2         int i = 0;
     3         //将nums中每一个元素都放在它所代表的数字的位置上,例如nums[1]=4,那么nums[1]就应该放在第四个位置上,也就是nums[1]=nums[nums[1]-1]
     4         //排除负数
     5         while(i < nums.length)
     6         {
     7             if(nums[i] <= 0 || nums[i] > nums.length || nums[i] == i + 1 || nums[i] == nums[nums[i]-1])
     8             {
     9                 i++;
    10             }
    11             else
    12             {
    13                 int temp = nums[i];
    14                 nums[i] = nums[temp - 1];
    15                 nums[temp - 1] = temp;
    16             }
    17         }
    18         int j = 0;
    19         for(j = 0; j < nums.length; j ++)
    20         {
    21             if(nums[j] != j + 1)
    22             {
    23                 return j+1;
    24             }
    25         }
    26         return j+1;
    27     }
  • 相关阅读:
    1.造一个句子先造出 主谓宾 或主系表,或therebe 这个句子就确定了
    电脑族应每天赤脚走15分钟
    10我操介词
    2.在英语句子中,什么时候用助动词do\does ,什么时候用be动词am\is\are?
    6.英语单词末尾的——s,什么时候发S,什么时候发Z
    转 Dll创建一个"日历"窗体(一)
    2012 MultiUniversity Training Contest 2
    最大流 基础
    HDOJ 4006 The kth great number(优先队列)
    树状数组
  • 原文地址:https://www.cnblogs.com/masterlibin/p/5611822.html
Copyright © 2011-2022 走看看