import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int minNumberDisappeared (int[] nums) {
// write code here
// 有效区(0, l - 1)、垃圾区(r, ...)
int l = 0, r = nums.length;
while (l != r) {
// 依次从左往右调整数组,使得[0]位置放1、[1]位置放2、[2]位置放3、...
if (nums[l] == l + 1) l++;
// 1. nums[l] <= l: [l]位置小于预期值l+1
// 2. nums[l] > r: [l]位置超过了垃圾区
// 3. nums[nums[l] - 1] == nums[l]: 与预期位置相等,出现重复数字
else if (nums[l] <= l || nums[l] > r || nums[nums[l] - 1] == nums[l])
// [l]位置数放垃圾区,同时垃圾区向左扩
swap(nums, l, --r);
// nums[nums[l] - 1] != nums[l]: 与预期位置不等,交换位置
else swap(nums, l, nums[l] - 1);
}
return l + 1;
}
private void swap(int[] nums, int i, int j) {
if (i == j) return;
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}