Skip to content

Commit 654e2a9

Browse files
authored
Merge branch 'youngyangyang04:master' into master
2 parents a30d238 + 6b85bbd commit 654e2a9

14 files changed

+113
-49
lines changed

problems/0001.两数之和.md

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -207,18 +207,16 @@ function twoSum(array $nums, int $target): array
207207
Swift:
208208
```swift
209209
func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
210-
var res = [Int]()
211-
var dict = [Int : Int]()
212-
for i in 0 ..< nums.count {
213-
let other = target - nums[i]
214-
if dict.keys.contains(other) {
215-
res.append(i)
216-
res.append(dict[other]!)
217-
return res
210+
// 值: 下标
211+
var map = [Int: Int]()
212+
for (i, e) in nums.enumerated() {
213+
if let v = map[target - e] {
214+
return [v, i]
215+
} else {
216+
map[e] = i
218217
}
219-
dict[nums[i]] = i
220218
}
221-
return res
219+
return []
222220
}
223221
```
224222

problems/0031.下一个排列.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public:
8686
}
8787
}
8888
}
89-
// 到这里了说明整个数组都是倒叙了,反转一下便可
89+
// 到这里了说明整个数组都是倒序了,反转一下便可
9090
reverse(nums.begin(), nums.end());
9191
}
9292
};

problems/0047.全排列II.md

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,5 +323,76 @@ func permuteUnique(_ nums: [Int]) -> [[Int]] {
323323
}
324324
```
325325

326+
### C
327+
```c
328+
//临时数组
329+
int *path;
330+
//返回数组
331+
int **ans;
332+
int *used;
333+
int pathTop, ansTop;
334+
335+
//拷贝path到ans中
336+
void copyPath() {
337+
int *tempPath = (int*)malloc(sizeof(int) * pathTop);
338+
int i;
339+
for(i = 0; i < pathTop; ++i) {
340+
tempPath[i] = path[i];
341+
}
342+
ans[ansTop++] = tempPath;
343+
}
344+
345+
void backTracking(int* used, int *nums, int numsSize) {
346+
//若path中元素个数等于numsSize,将path拷贝入ans数组中
347+
if(pathTop == numsSize)
348+
copyPath();
349+
int i;
350+
for(i = 0; i < numsSize; i++) {
351+
//若当前元素已被使用
352+
//或前一位元素与当前元素值相同但并未被使用
353+
//则跳过此分支
354+
if(used[i] || (i != 0 && nums[i] == nums[i-1] && used[i-1] == 0))
355+
continue;
356+
357+
//将当前元素的使用情况设为True
358+
used[i] = 1;
359+
path[pathTop++] = nums[i];
360+
backTracking(used, nums, numsSize);
361+
used[i] = 0;
362+
--pathTop;
363+
}
364+
}
365+
366+
int cmp(void* elem1, void* elem2) {
367+
return *((int*)elem1) - *((int*)elem2);
368+
}
369+
370+
int** permuteUnique(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
371+
//排序数组
372+
qsort(nums, numsSize, sizeof(int), cmp);
373+
//初始化辅助变量
374+
pathTop = ansTop = 0;
375+
path = (int*)malloc(sizeof(int) * numsSize);
376+
ans = (int**)malloc(sizeof(int*) * 1000);
377+
//初始化used辅助数组
378+
used = (int*)malloc(sizeof(int) * numsSize);
379+
int i;
380+
for(i = 0; i < numsSize; i++) {
381+
used[i] = 0;
382+
}
383+
384+
backTracking(used, nums, numsSize);
385+
386+
//设置返回的数组的长度
387+
*returnSize = ansTop;
388+
*returnColumnSizes = (int*)malloc(sizeof(int) * ansTop);
389+
int z;
390+
for(z = 0; z < ansTop; z++) {
391+
(*returnColumnSizes)[z] = numsSize;
392+
}
393+
return ans;
394+
}
395+
```
396+
326397
-----------------------
327398
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

problems/0151.翻转字符串里的单词.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040

4141
不能使用辅助空间之后,那么只能在原字符串上下功夫了。
4242

43-
想一下,我们将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒叙了,那么再把单词反转一下,单词不就正过来了。
43+
想一下,我们将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒序了,那么再把单词反转一下,单词不就正过来了。
4444

4545
所以解题思路如下:
4646

problems/0344.反转字符串.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ s[j] = tmp;
101101
s[i] ^= s[j];
102102
s[j] ^= s[i];
103103
s[i] ^= s[j];
104-
105104
```
106105

107106
这道题目还是比较简单的,但是我正好可以通过这道题目说一说在刷题的时候,使用库函数的原则。

problems/0347.前K个高频元素.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public:
107107
}
108108
}
109109

110-
// 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒叙来输出到数组
110+
// 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组
111111
vector<int> result(k);
112112
for (int i = k - 1; i >= 0; i--) {
113113
result[i] = pri_que.top().first;
@@ -180,7 +180,7 @@ class Solution:
180180
if len(pri_que) > k: #如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k
181181
heapq.heappop(pri_que)
182182

183-
#找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒叙来输出到数组
183+
#找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组
184184
result = [0] * k
185185
for i in range(k-1, -1, -1):
186186
result[i] = heapq.heappop(pri_que)[1]

problems/0416.分割等和子集.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ vector<int> dp(10001, 0);
112112
113113
4. 确定遍历顺序
114114
115-
在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中就已经说明:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒叙遍历
115+
在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中就已经说明:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历
116116
117117
代码如下:
118118

problems/0454.四数相加II.md

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ D = [ 0, 2]
4444

4545
1. 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
4646
2. 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
47-
3. 定义int变量count,用来统计a+b+c+d = 0 出现的次数。
47+
3. 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
4848
4. 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
4949
5. 最后返回统计值 count 就可以了
5050

@@ -139,7 +139,7 @@ class Solution(object):
139139
return count
140140

141141

142-
```
142+
```
143143

144144
Go:
145145
```go
@@ -229,28 +229,24 @@ class Solution {
229229
Swift:
230230
```swift
231231
func fourSumCount(_ nums1: [Int], _ nums2: [Int], _ nums3: [Int], _ nums4: [Int]) -> Int {
232-
// key:a+b的数值,value:a+b数值出现的次数
233-
var map = [Int: Int]()
234-
// 遍历nums1和nums2数组,统计两个数组元素之和,和出现的次数,放到map中
235-
for i in 0 ..< nums1.count {
236-
for j in 0 ..< nums2.count {
237-
let sum1 = nums1[i] + nums2[j]
238-
map[sum1] = (map[sum1] ?? 0) + 1
232+
// ab和: ab和出现次数
233+
var countDic = [Int: Int]()
234+
for a in nums1 {
235+
for b in nums2 {
236+
let key = a + b
237+
countDic[key] = countDic[key, default: 0] + 1
239238
}
240239
}
241-
// 统计a+b+c+d = 0 出现的次数
242-
var res = 0
243-
// 在遍历大num3和num4数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。
244-
for i in 0 ..< nums3.count {
245-
for j in 0 ..< nums4.count {
246-
let sum2 = nums3[i] + nums4[j]
247-
let other = 0 - sum2
248-
if map.keys.contains(other) {
249-
res += map[other]!
250-
}
240+
241+
// 通过-(c + d)作为key,去累加ab和出现的次数
242+
var result = 0
243+
for c in nums3 {
244+
for d in nums4 {
245+
let key = -(c + d)
246+
result += countDic[key, default: 0]
251247
}
252248
}
253-
return res
249+
return result
254250
}
255251
```
256252

problems/0685.冗余连接II.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ for (int i = 0; i < n; i++) {
6868

6969
```cpp
7070
vector<int> vec; // 记录入度为2的边(如果有的话就两条边)
71-
// 找入度为2的节点所对应的边,注意要倒叙,因为优先返回最后出现在二维数组中的答案
71+
// 找入度为2的节点所对应的边,注意要倒序,因为优先返回最后出现在二维数组中的答案
7272
for (int i = n - 1; i >= 0; i--) {
7373
if (inDegree[edges[i][1]] == 2) {
7474
vec.push_back(i);
@@ -577,7 +577,7 @@ var findRedundantDirectedConnection = function(edges) {
577577
inDegree[edges[i][1]]++; // 统计入度
578578
}
579579
let vec = [];// 记录入度为2的边(如果有的话就两条边)
580-
// 找入度为2的节点所对应的边,注意要倒叙,因为优先返回最后出现在二维数组中的答案
580+
// 找入度为2的节点所对应的边,注意要倒序,因为优先返回最后出现在二维数组中的答案
581581
for (let i = n - 1; i >= 0; i--) {
582582
if (inDegree[edges[i][1]] == 2) {
583583
vec.push(i);

problems/0746.使用最小花费爬楼梯.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ dp[1] = cost[1];
8282

8383
**但是稍稍有点难度的动态规划,其遍历顺序并不容易确定下来**
8484

85-
例如:01背包,都知道两个for循环,一个for遍历物品嵌套一个for遍历背包容量,那么为什么不是一个for遍历背包容量嵌套一个for遍历物品呢? 以及在使用一维dp数组的时候遍历背包容量为什么要倒叙呢
85+
例如:01背包,都知道两个for循环,一个for遍历物品嵌套一个for遍历背包容量,那么为什么不是一个for遍历背包容量嵌套一个for遍历物品呢? 以及在使用一维dp数组的时候遍历背包容量为什么要倒序呢
8686

8787
**这些都是遍历顺序息息相关。当然背包问题后续「代码随想录」都会重点讲解的!**
8888

0 commit comments

Comments
 (0)