Skip to content

Commit 87c8aae

Browse files
committed
新增多个算法实现,包括找出数组中重复的数字的三种方法及 KMP 算法的相关说明
1 parent 6fe054d commit 87c8aae

9 files changed

Lines changed: 171 additions & 0 deletions

File tree

  • acwing/剑指 offer/13. 找出数组中重复的数字
  • book/代码随想录/字符串
  • leetcode/Study Plan
    • 13. 找出数组中重复的数字
    • 28. 找出字符串中第一个匹配项的下标
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* @Author: tkzzzzzz6
3+
* @Date: 2026-04-13 10:26:46
4+
* @LastEditors: tkzzzzzz6
5+
* @LastEditTime: 2026-04-13 10:31:43
6+
*/
7+
class Solution {
8+
public:
9+
int duplicateInArray(vector<int>& nums) {
10+
unordered_set<int>visited;
11+
int n = nums.size();
12+
int result = -1;
13+
for(auto num:nums){
14+
if(num >= n || num < 0)return -1;
15+
if(visited.count(num) != 0)result = num;
16+
visited.insert(num);
17+
}
18+
return result;
19+
}
20+
};
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<!--
2+
* @Author: tkzzzzzz6
3+
* @Date: 2026-04-13 10:46:09
4+
* @LastEditors: tkzzzzzz6
5+
* @LastEditTime: 2026-04-13 11:01:49
6+
-->
7+
方法 1:哈希表
8+
9+
```cpp
10+
/*
11+
* @Author: tkzzzzzz6
12+
* @Date: 2026-04-13 10:26:46
13+
* @LastEditors: tkzzzzzz6
14+
* @LastEditTime: 2026-04-13 10:31:43
15+
*/
16+
class Solution {
17+
public:
18+
int duplicateInArray(vector<int>& nums) {
19+
unordered_set<int>visited;
20+
int n = nums.size();
21+
int result = -1;
22+
for(auto num:nums){
23+
if(num >= n || num < 0)return -1;
24+
if(visited.count(num) != 0)result = num;
25+
visited.insert(num);
26+
}
27+
return result;
28+
}
29+
};
30+
```
31+
方法 2:排序
32+
33+
```cpp
34+
35+
```
36+
37+
方法 3:元素交换
38+
先真题遍历,判断是否有数超过范围,如果没有,把每个数放到对应的位置上,如果对应位置上有数了,说明这个数重复了,如果没有,继续交换,直到所有数都放到对应位置上了,最后再遍历一次,找到第一个位置上没有数的就是重复的数了
39+
40+
```cpp
41+
/*
42+
* @Author: tkzzzzzz6
43+
* @Date: 2026-04-13 10:45:59
44+
* @LastEditors: tkzzzzzz6
45+
* @LastEditTime: 2026-04-13 10:48:48
46+
*/
47+
class Solution {
48+
public:
49+
int duplicateInArray(vector<int>& nums) {
50+
int n = nums.size();
51+
for(auto x:nums){
52+
if(x >= n || x < 0)return -1;
53+
}
54+
for(int i = 0;i<n;++i){
55+
while(nums[i] != nums[nums[i]])swap(nums[i],nums[nums[i]]);
56+
if(nums[i] != i)return nums[i];
57+
58+
}
59+
return -1;
60+
}
61+
};
62+
63+
```
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* @Author: tkzzzzzz6
3+
* @Date: 2026-04-13 10:45:59
4+
* @LastEditors: tkzzzzzz6
5+
* @LastEditTime: 2026-04-13 10:48:48
6+
*/
7+
class Solution {
8+
public:
9+
int duplicateInArray(vector<int>& nums) {
10+
int n = nums.size();
11+
for(auto x:nums){
12+
if(x >= n || x < 0)return -1;
13+
}
14+
for(int i = 0;i<n;++i){
15+
while(nums[i] != nums[nums[i]])swap(nums[i],nums[nums[i]]);
16+
if(nums[i] != i)return nums[i];
17+
18+
}
19+
return -1;
20+
}
21+
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* @Author: tkzzzzzz6
3+
* @Date: 2026-04-13 10:45:59
4+
* @LastEditors: tkzzzzzz6
5+
* @LastEditTime: 2026-04-13 11:02:24
6+
*/
7+
class Solution {
8+
public:
9+
int duplicateInArray(vector<int>& nums) {
10+
int n = nums.size();
11+
if(n == 0)return -1;
12+
sort(nums.begin(),nums.end());
13+
if(nums[0] < 0 || nums[n-1] >= n)return -1;
14+
for(int i = 1;i<n;++i){
15+
if(nums[i-1] == nums[i])return nums[i];
16+
}
17+
return -1;
18+
}
19+
};

book/代码随想录/字符串/KMP 算法/1.cpp

Whitespace-only changes.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
要解决的问题:解决字符串匹配问题
2+
3+
真前缀:除了字符串本身以外的前缀
4+
真后缀:除了字符串本身以外的后缀
5+
6+
思想:遍历到不同字符的时候,通过 信息数组找到可以跳过的位置,其中 信息数组有三种形式,分别是 lsp 数组,前缀函数数组和 next 数组
7+
8+
1. lsp数组:lsp[i] 表示字符串 s 的前缀 s[0..i] 的最长相等的真前缀和真后缀的长度
9+
2. 前缀函数数组:prefix[i] 表示字符串 s 的前缀 s[0..i] 的最长相等的真前缀和真后缀的长度加 1,如果没有相等的真前缀和真后缀,则 prefix[i] = 0
10+
3. next 数组:next[i] 表示字符串 s 的前缀 s[0..i] 的最长相等的真前缀和真后缀的长度加 1,如果没有相等的真前缀和真后缀,则 next[i] = -1
11+
12+
时间复杂度:O(m+n),其中 m 是文本串的长度,n 是 lsp 数组(或其他信息数组)的长度
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!--
2+
* @Author: tkzzzzzz6
3+
* @Date: 2026-04-13 23:48:08
4+
* @LastEditors: tkzzzzzz6
5+
* @LastEditTime: 2026-04-13 23:48:10
6+
-->
7+
8+
方法 1:暴力解法
9+
10+
方法 2:移动匹配
11+
12+
方法 3:KMP 算法
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
* @Author: tkzzzzzz6
3+
* @Date: 2026-04-13 10:20:31
4+
* @LastEditors: tkzzzzzz6
5+
* @LastEditTime: 2026-04-13 10:26:00
6+
*/
7+
class Solution {
8+
public:
9+
int duplicateInArray(vector<int>& nums) {
10+
11+
}
12+
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
* @Author: tkzzzzzz6
3+
* @Date: 2026-04-14 01:07:56
4+
* @LastEditors: tkzzzzzz6
5+
* @LastEditTime: 2026-04-14 01:08:01
6+
*/
7+
class Solution {
8+
public:
9+
int strStr(string haystack, string needle) {
10+
int n = haystack.size(),m = needle
11+
}
12+
};

0 commit comments

Comments
 (0)