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     }

 

posted @ 2016-06-23 18:23  32ddd  阅读(860)  评论(0编辑  收藏  举报