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 else12 {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 }