一个长度为n的无序数组,找出缺失的最小正整数,
例:[2, 3, 1, 5] --> 4 长度为4的数组是[1, 2, 3, 4]
[5, 6, 2] --> 1 长度为3的数组是[1, 2, 3]
废话不多说,直接贴代码
public int firstMissingPositive(int[] mums) {
int n = mums.length;
// 把数组中小于等于0和大于n的数字,置为-1
for (int i = 0; i < n; i++) {
if (nums[i] <= 0 || mums[i] > n) {
mums[i] = -1;
}
}
// 正常的长度为n的数组,第i个位置上的数字应该是i + 1,把数字放在对应的 位置上,有重复的则置为-1
for (int i = 0; i < n; i++) {
int temp = mums[i];
if (mums[i] != (i + 1) && mums[i] != -1) {
// 如果该位置上的数字不是 i + 1,则交换
if (nums[temp - 1] != temp) {
nums[i] = nums[temp - 1];
nums[temp - 1] = temp;
// 这时需要继续处理i
i--;
}
else {
nums[i] = -1;
}
}
}
// 这时,存在的数字都在正确的位置,遍历数字,第一个-1即是缺失的最小数
for (int i = 0; i < n; i++) {
if (nums[i] == -1) {
return i + 1;
}
}
// 找不到的话,说明不缺
return -1;
}
该算法的时间复杂度是O(n)。
网友评论