我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/missing-number/
题目描述:
知识点:数学
思路一:开一个空间大一位的数组来记录每个数字出现与否
时间复杂度和空间复杂度均是O(n),其中n为数组的长度。
JAVA代码:
public class Solution {
public int missingNumber(int[] nums) {
int[] temp = new int[nums.length + 1];
Arrays.fill(temp, -1);
for (int i = 0; i < nums.length; i++) {
temp[nums[i]] = nums[i];
}
for (int i = 0; i < temp.length; i++) {
if (-1 == temp[i]) {
return i;
}
}
return -1;
}
}
LeetCode解题报告:
思路二:在原数组中交换,交换原则是第i的位置放数字i
时间复杂度是O(n),其中n为数组的长度。空间复杂度是O(1)。
JAVA代码:
public class Solution {
public int missingNumber(int[] nums) {
for (int i = 0; i < nums.length; i++) {
int temp = i;
while (temp != nums[temp] && nums[temp] != nums.length) {
swap(nums, temp, nums[temp]);
}
}
for (int i = 0; i < nums.length; i++) {
if (i != nums[i]) {
return i;
}
}
return nums.length;
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
LeetCode解题报告:
思路三:求[1, n]间的数字和,再求出数组中的元素和,两者之差即为缺少的数字
时间复杂度是O(n),其中n为数组的长度。空间复杂度是O(1)。
JAVA代码:
public class Solution {
public int missingNumber(int[] nums) {
int sum1 = (1 + nums.length) * nums.length / 2;
int sum2 = 0;
for (int num : nums) {
sum2 += num;
}
return sum1 - sum2;
}
}
LeetCode解题报告: