题目描述:
大致思路:
根据题目限制的条件, 最简单的排序思路是行不通了。 并且不能使用新的数组空间, 所以这里的想法是利用数组的下标来做文章。大致就是将数组中大于0的元素按照数组下标来调换顺序。
举个栗子:
目标数组: [1, 0, 5, 4, 7]
转换后: [0, 1, 0, 0, 4, 5, , 7]
代码如下:
const len = nums.length;
for (let i = 0; i < len; ++i) {
//while 循环 将当前值替换为当前索引值, 并且判断 nums[i] !== nums[nums[i]]防止死循环
while (nums[i] > 0 && nums[i] !== i && nums[i] !== nums[nums[i]]) {
const val = nums[i];
const tmp = nums[i];
// 当val大于数组长度时用0填充, 跳出while循环
nums[i] = nums[val] ?? 0;
nums[val] = tmp;
}
}
遍历转换后的数组, 如果当前值与当前索引不同, 则该值为最小正整数, 否则返回转换后的数组长度, 即数组中最大元素 + 1
代码如下:
for (let i = 0; i < nums.length; ++i) {
if (nums[i] !== i && i > 0) {
return i;
}
}
return nums.length;