タイトル説明
[0、n]にn個の数値を含む配列numが与えられた場合、配列に表示されない[0、n]の範囲の数値を見つけます。
上級:
線形時間計算量を達成し、この問題を解決するために追加の定数空間アルゴリズムのみを使用できますか?
例1:
入力:nums = [3,0,1]
出力:2
説明:n = 3、3つの数値があるため、すべての数値は[0,3]の範囲にあります。2は、numsに表示されないため、欠落している番号です。
例2:
入力:nums = [0,1]
出力:2
説明:n = 2 2つの数値があるため、すべての数値は[0,2]の範囲にあります。2は、numsに表示されないため、欠落している番号です。
例3:
入力:nums = [9,6,4,2,3,5,7,0,1]
出力:8
説明:n = 9、9つの数値があるため、すべての数値は[0,9]の範囲にあります。内部。8は数字に表示されないため、欠落している番号です。
例4:
入力:nums = [0]
出力:1
説明:n = 1、数値が1つあるため、すべての数値は[0,1]の範囲にあります。1は、numsに表示されないため、欠落している番号です。
問題解決のアイデア
ソート
/**
* 排序
* @param nums
* @return
*/
public int missingNumber_1(int[] nums) {
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
int n = nums.length; // 2
for (int i = 0; i < n; i++) {
if (nums[i] == i){
continue;
}else {
return i;
}
}
return n;
}
ハッシュ表
public int missingNumber_2(int[] nums){
Set<Integer> numSet = new HashSet<Integer>();
for (int num : nums) {
numSet.add(num);
}
int expectedNumCount = nums.length + 1;
for (int number = 0;number < expectedNumCount;number++){
if (!numSet.contains(number)){
return number;
}
}
return -1;
}
ビット演算
/**
* 位运算
* @param nums
* @return
*/
public int missingNumber_3(int[] nums) {
int missing = nums.length;
for (int i = 0; i < nums.length; i++) {
missing ^= i ^ nums[i]; //异或运算
}
return missing;
}
数学
public int missingNumber(int[] nums) {
int expectedSum = nums.length*(nums.length + 1)/2;
int actualSum = 0;
for (int num : nums) actualSum += num;
return expectedSum - actualSum;
}