Skip to content

Commit 6bdcdfb

Browse files
committed
perf: update coding-interview.md
更新题解
1 parent 59fa2c3 commit 6bdcdfb

File tree

1 file changed

+14
-21
lines changed

1 file changed

+14
-21
lines changed

docs/coding-interview.md

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,13 @@
1818
```
1919

2020
### 解法
21-
#### 解法一
22-
排序后,顺序扫描,判断是否有重复,时间复杂度为 `O(n²)`
23-
24-
#### 解法二
25-
利用哈希表,遍历数组,如果哈希表中没有该元素,则存入哈希表中,否则返回重复的元素。时间复杂度为 `O(n)`,空间复杂度为 `O(n)`
21+
从题目我们可以知道,数组长度为 n,所有数字都在 `0~n-1` 范围内。如果元素不重复,那么数组应该就是 `[0, 1, 2, ...n-1]`(假设给数组排完了序)。也就是说,递增排序后,数组中的元素值与其对应的下标应该是相同的,即下标为 0 的元素值也是 0,以此类推。
2622

27-
#### 解法三
28-
长度为 `n`,元素的数值范围也为 `n`,如果没有重复元素,那么数组每个下标对应的值与下标相等。
23+
首先,我们可以遍历数组,若存在元素不在 `0~n-1` 的范围内,直接返回 -1。
2924

30-
从头到尾遍历数组,当扫描到下标 `i` 的数字 `nums[i]`
31-
- 如果等于 `i`,继续向下扫描;
32-
- 如果不等于 `i`,拿它与第 `nums[i]` 个数进行比较,如果相等,说明有重复值,返回 `nums[i]`。如果不相等,就把第 `i` 个数 和第 `nums[i]` 个数交换。重复这个比较交换的过程。
25+
接着,再次遍历数组,若下标 `i` 与对应元素 `nums[i]` 不同,即 `nums[i] != i`,我们应该把 `nums[i]` 这个元素交换到正确的位置 `nums[i]`上。交换前,先判断 `nums[i]``nums[nums[i]]` 这两个元素是否相同,相同说明存在重复元素,直接返回,否则进行 swap 交换。交换过后,我们需要再次判断 i 位置上的元素,因此,我们使用 while 循环。
3326

34-
此算法时间复杂度为 `O(n)`,因为每个元素最多只要两次交换,就能确定位置(比如把 2 跟 5 交换,此时 2 在正确的位置,而 5 需要再交换一次就能跑到正确的位置)。空间复杂度为 `O(1)`
27+
可对照下方代码实现,加深理解
3528

3629
```java
3730
class Solution {
@@ -43,28 +36,28 @@ class Solution {
4336
* @return 其中一个重复的元素
4437
*/
4538
public int duplicateInArray(int[] nums) {
46-
if (nums == null || nums.length < 2) {
47-
return -1;
48-
}
49-
5039
int n = nums.length;
51-
for (int e : nums) {
52-
if (e < 0 || e > n - 1) {
40+
41+
// 若存在数组元素不在[0, n-1] 的范围内,直接返回-1
42+
for (int num : nums) {
43+
if (num < 0 || num >= n) {
5344
return -1;
5445
}
5546
}
47+
5648
for (int i = 0; i < n; ++i) {
5749
while (nums[i] != i) {
58-
int val = nums[nums[i]];
59-
if (nums[i] == val) {
60-
return val;
50+
if (nums[i] == nums[nums[i]]) {
51+
// 说明位置i与位置nums[i]上的元素相同,直接返回该重复元素
52+
return nums[i];
6153
}
6254
swap(nums, i, nums[i]);
6355
}
6456
}
6557
return -1;
58+
6659
}
67-
60+
6861
private void swap(int[] nums, int i, int j) {
6962
int t = nums[i];
7063
nums[i] = nums[j];

0 commit comments

Comments
 (0)