要找到无序整数数组中最小值和最大值之间缺失的数字,并保证最小的时间复杂度,可以使用以下方法:
1. 使用集合 (Set)
这是最简洁且时间复杂度较低的方法,时间复杂度为 O(n),空间复杂度也是 O(n)。
function findMissingNumbers(arr) {if (!arr || arr.length < 2) {return []; // 处理空数组或只有一个元素的数组}let min = Math.min(...arr);let max = Math.max(...arr);const numSet = new Set(arr);const missing = [];for (let i = min + 1; i < max; i++) {if (!numSet.has(i)) {missing.push(i);}}return missing;
}// 示例
const arr = [1, 3, 5, 2, 7, 9, 4];
const missingNumbers = findMissingNumbers(arr);
console.log(missingNumbers); // 输出: [6, 8]const arr2 = [1, 2, 3];
const missingNumbers2 = findMissingNumbers(arr2);
console.log(missingNumbers2); // 输出: []const arr3 = [3, 1];
const missingNumbers3 = findMissingNumbers(arr3);
console.log(missingNumbers3); // 输出: [2]const arr4 = [];
const missingNumbers4 = findMissingNumbers(arr4);
console.log(missingNumbers4); // 输出: []const arr5 = [5];
const missingNumbers5 = findMissingNumbers(arr5);
console.log(missingNumbers5); // 输出: []
2. 使用排序
排序后,查找缺失数字会更容易,但时间复杂度取决于排序算法,通常为 O(n log n)。 如果数组已经排好序,则此方法的时间复杂度为 O(n)。
function findMissingNumbersSorted(arr) {if (!arr || arr.length < 2) {return [];}arr.sort((a, b) => a - b); // 排序数组const missing = [];for (let i = 1; i < arr.length; i++) {if (arr[i] - arr[i - 1] > 1) {for (let j = arr[i - 1] + 1; j < arr[i]; j++) {missing.push(j);}}}return missing;
}// 示例 (与上面相同)
const arr = [1, 3, 5, 2, 7, 9, 4];
const missingNumbers = findMissingNumbersSorted(arr);
console.log(missingNumbers); // 输出: [6, 8]// ... 其他示例
方法比较:
- 集合方法: 更简洁,时间复杂度更低 (O(n)),但需要额外的空间来存储集合。 在大多数情况下,这是首选方法。
- 排序方法: 如果数组已经排好序,则效率很高 (O(n))。 否则,排序步骤会增加时间复杂度 (O(n log n))。
选择哪种方法?
- 对于前端开发,并且数组长度不太大的情况下,
Set
方法通常是最佳选择,因为它代码简洁且性能良好。 - 如果数组已经排好序,或者对空间复杂度有严格限制,则可以考虑排序方法。
希望这些解释和代码示例能够帮助你理解如何在 JavaScript 中有效地找到缺失的数字。