Skip to content

Commit adae7d8

Browse files
ChunelFengjunfeng.fj
and
junfeng.fj
authored
增加了[lcof-18.删除链表的节点]和[lcof-40.最小的k个数]的cpp解法 (doocs#345)
* 增加了[lcof-18.删除链表的节点]和[lcof-40.最小的k个数]的cpp解法,基本双优 * 优化[lcof-40.最小的k个数]格式 Co-authored-by: junfeng.fj <junfeng.fj@alibaba-inc.com>
1 parent 240714e commit adae7d8

File tree

4 files changed

+164
-0
lines changed

4 files changed

+164
-0
lines changed

lcof/面试题18. 删除链表的节点/README.md

+39
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,45 @@ func deleteNode(head *ListNode, val int) *ListNode {
130130
}
131131
```
132132

133+
### **C++**
134+
135+
```cpp
136+
/**
137+
* Definition for singly-linked list.
138+
* struct ListNode {
139+
* int val;
140+
* ListNode *next;
141+
* ListNode(int x) : val(x), next(NULL) {}
142+
* };
143+
*/
144+
class Solution {
145+
public:
146+
ListNode* deleteNode(ListNode* head, int val) {
147+
ListNode* cur = head;
148+
if (!head) {
149+
return nullptr;
150+
}
151+
152+
if (head->val == val) {
153+
// 第一个就匹配的情况
154+
return head->next;
155+
}
156+
157+
while (cur && cur->next) {
158+
if (cur->next->val == val) {
159+
// 如果找到了,直接指向下一个
160+
cur->next = cur->next->next;
161+
break;
162+
} else {
163+
cur = cur->next;
164+
}
165+
}
166+
167+
return head;
168+
}
169+
};
170+
```
171+
133172
### **...**
134173

135174
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* struct ListNode {
4+
* int val;
5+
* ListNode *next;
6+
* ListNode(int x) : val(x), next(NULL) {}
7+
* };
8+
*/
9+
class Solution {
10+
public:
11+
ListNode* deleteNode(ListNode* head, int val) {
12+
ListNode* cur = head;
13+
if (!head) {
14+
return nullptr;
15+
}
16+
17+
if (head->val == val) {
18+
// 第一个就匹配的情况
19+
return head->next;
20+
}
21+
22+
while (cur && cur->next) {
23+
if (cur->next->val == val) {
24+
// 如果找到了,直接指向下一个
25+
cur->next = cur->next->next;
26+
break;
27+
} else {
28+
cur = cur->next;
29+
}
30+
}
31+
32+
return head;
33+
}
34+
};

lcof/面试题40. 最小的k个数/README.md

+48
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,54 @@ var getLeastNumbers = function (arr, k) {
111111
};
112112
```
113113

114+
### **C++**
115+
116+
```cpp
117+
class Solution {
118+
public:
119+
int partition(vector<int>& arr, int begin, int end) {
120+
int l = begin;
121+
int r = end;
122+
int povit = arr[begin];
123+
124+
while (l < r) {
125+
// 从右边开始,找到第一个小于povit的数字(用于交换)
126+
while (l < r && arr[r] >= povit) { r--; }
127+
while (l < r && arr[l] <= povit) { l++; }
128+
if (l < r) { swap(arr[l], arr[r]); }
129+
}
130+
131+
swap(arr[begin], arr[l]);
132+
return l;
133+
}
134+
135+
void partSort(vector<int>& arr, int begin, int end, int target) {
136+
if (begin >= end) {
137+
return;
138+
}
139+
140+
// 思路类似快排,这样做比堆排序时间复杂度低
141+
// C++中,stl提供partial_sort()方法,就是这种实现方式
142+
int mid = partition(arr, begin, end);
143+
if (mid == target) {
144+
return;
145+
} else if (target < mid) {
146+
partSort(arr, begin, mid - 1, target);
147+
} else {
148+
partSort(arr, mid + 1, end, target);
149+
}
150+
151+
return;
152+
}
153+
154+
vector<int> getLeastNumbers(vector<int>& arr, int k) {
155+
partSort(arr, 0, arr.size() - 1, k - 1);
156+
vector<int> ret(arr.begin(), arr.begin() + k);
157+
return ret;
158+
}
159+
};
160+
```
161+
114162
### **...**
115163

116164
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
class Solution {
2+
public:
3+
int partition(vector<int>& arr, int begin, int end) {
4+
int l = begin;
5+
int r = end;
6+
int povit = arr[begin];
7+
8+
while (l < r) {
9+
// 从右边开始,找到第一个小于povit的数字(用于交换)
10+
while (l < r && arr[r] >= povit) { r--; }
11+
while (l < r && arr[l] <= povit) { l++; }
12+
if (l < r) { swap(arr[l], arr[r]); }
13+
}
14+
15+
swap(arr[begin], arr[l]);
16+
return l;
17+
}
18+
19+
void partSort(vector<int>& arr, int begin, int end, int target) {
20+
if (begin >= end) {
21+
return;
22+
}
23+
24+
// 思路类似快排,这样做比堆排序时间复杂度低
25+
// C++中,stl提供partial_sort()方法,就是这种实现方式
26+
int mid = partition(arr, begin, end);
27+
if (mid == target) {
28+
return;
29+
} else if (target < mid) {
30+
partSort(arr, begin, mid - 1, target);
31+
} else {
32+
partSort(arr, mid + 1, end, target);
33+
}
34+
35+
return;
36+
}
37+
38+
vector<int> getLeastNumbers(vector<int>& arr, int k) {
39+
partSort(arr, 0, arr.size() - 1, k - 1);
40+
vector<int> ret(arr.begin(), arr.begin() + k);
41+
return ret;
42+
}
43+
};

0 commit comments

Comments
 (0)