Skip to content

Commit fd2f52f

Browse files
committed
add sol 373 and 589, reorganise floders
1 parent dbfb1d1 commit fd2f52f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+198
-42
lines changed

c_code/373_kSmallestPairs.c

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/**
2+
* Return an array of arrays of size *returnSize.
3+
* The sizes of the arrays are returned as *returnColumnSizes array.
4+
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
5+
*/
6+
7+
/*
8+
不用优先队列/堆等复杂结构,就用双指针思路
9+
核心:
10+
1、新申请一个数组,记录nums1[i]与nums2[]数组结合的起始位置
11+
2、每次找1个最小值,就在nums1中for循环匹配一下最小的,从steps[i]的起点开始
12+
*/
13+
int** kSmallestPairs(int* nums1, int nums1Size, int* nums2, int nums2Size, int k, int* returnSize, int** returnColumnSizes)
14+
{
15+
long long tmp = (long long)nums1Size * nums2Size;
16+
k = (k > tmp) ? tmp : k;
17+
int *steps = (int*)malloc(nums1Size * sizeof(int));
18+
if (steps == NULL) {
19+
return NULL;
20+
}
21+
memset(steps, 0, nums1Size * sizeof(int));
22+
23+
// 申请返回内存
24+
int **returnArr = (int**)malloc(k * sizeof(int*) + 100); // 返回每行的列数
25+
if (returnArr == NULL) {
26+
return NULL;
27+
}
28+
*returnColumnSizes = (int*)malloc(k * sizeof(int) + 100); // 返回每行的列数
29+
if (*returnColumnSizes == NULL) {
30+
return NULL;
31+
}
32+
// printf("k = %d\n", k);
33+
34+
int n1MinIdx = 0;
35+
int i;
36+
for (i = 0; i < k; i++) {
37+
int min = INT_MAX; // min要放在每一轮查找前初始,以免成了上一轮的min
38+
for (int j = 0; j < nums1Size; j++) { // 找一次两两匹配的最小值
39+
if (steps[j] < nums2Size && nums1[j] + nums2[steps[j]] < min) {
40+
min = nums1[j] + nums2[steps[j]];
41+
n1MinIdx = j;
42+
}
43+
}
44+
// 最终得到最小值对应的nums1的idx,以及对应的nums2[]下标steps[idx]
45+
int *p = (int*)malloc(2 * sizeof(int));
46+
if (p == NULL) {
47+
return NULL;
48+
}
49+
// printf("n1MinIdx = %d\n", n1MinIdx);
50+
p[0] = nums1[n1MinIdx];
51+
p[1] = nums2[steps[n1MinIdx]];
52+
// printf("n1MinIdx = %d\n", n1MinIdx);
53+
steps[n1MinIdx] += 1; // n1MindIdx对应nums2下标值后移一位
54+
returnArr[i] = p;
55+
returnColumnSizes[0][i] = 2; // 每行的列数为2
56+
// printf("returnColumnSizes[0][%d] = %d\n", i, returnColumnSizes[0][i]);
57+
}
58+
*returnSize = k;
59+
return returnArr;
60+
}
61+
62+
/*
63+
感谢评论中:cnwsssss提供的思路
64+
65+
思路:
66+
和之前几个题目思想很像,用一个数组来记录num1中每个元素在nums2中走了多远就可以,每次循环都是nums1和nums2加起来最小的nums1往前走一步
67+
68+
JS代码:
69+
var kSmallestPairs = function(nums1, nums2, k) {
70+
if (k > nums1.length * nums2.length ) {
71+
k = nums1.length * nums2.length
72+
}
73+
if (nums1.length == 0 || nums2.length == 0) {
74+
return [];
75+
}
76+
let steps = new Array(nums1.length);
77+
for (let i = 0; i < steps.length; i++) {
78+
steps[i] = 0;
79+
}
80+
let results = [];
81+
for (let i = 0; i < k; i++) {
82+
let min = Number.MAX_VALUE;
83+
let minStepIndex = 0;
84+
for (let j = 0; j < nums1.length; j++) {
85+
if (steps[j] < nums2.length && nums2[steps[j]] + nums1[j] < min) {
86+
min = nums2[steps[j]] + nums1[j];
87+
minStepIndex = j;
88+
}
89+
}
90+
results.push([nums1[minStepIndex], nums2[steps[minStepIndex]]]);
91+
steps[minStepIndex]++;
92+
}
93+
94+
return results;
95+
};
96+
97+
*/

c_code/589_preorder.c

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
核心思路:
3+
1、充分理解题目的输入,题目已根据层序输入建好了多叉树
4+
2、从节点结构体定义中,看出每个节点都有个二级指针children存储着下一层子节点的指针数组,numChildren记录下层子节点个数
5+
3、本质与二叉树遍历相同,改造二叉树的遍历模板即可,将left/right子树遍历,换为for循环遍历children指针数组
6+
7+
参考:
8+
https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal/solution/rong-yi-li-jie-de-cyu-yan-di-gui-by-sleeeeep/
9+
10+
引申:
11+
思考下本题的迭代法实现?
12+
思考下如何从层序序列输入,构建出这个多叉树?
13+
*/
14+
15+
/**
16+
* Definition for a Node.
17+
* struct Node {
18+
* int val;
19+
* int numChildren;
20+
* struct Node** children;
21+
* };
22+
*/
23+
/**
24+
* Note: The returned array must be malloced, assume caller calls free().
25+
*/
26+
#define MAX_SIZE 10000
27+
28+
void PreTraversal(struct Node *root, int *nums, int *pcnt)
29+
{
30+
// 终止条件
31+
if (root == NULL) {
32+
return;
33+
}
34+
35+
// 前序操作
36+
nums[*pcnt] = root->val; // 输出到数组中
37+
(*pcnt)++;
38+
39+
// 遍历
40+
int i;
41+
for (i = 0; i < root->numChildren; i++) {
42+
PreTraversal(root->children[i], nums, pcnt);
43+
}
44+
45+
return;
46+
}
47+
48+
int *preorder(struct Node *root, int *returnSize)
49+
{
50+
*returnSize = 0;
51+
int *nums = (int*)malloc(MAX_SIZE * sizeof(int));
52+
if (nums == NULL) {
53+
return NULL;
54+
}
55+
int cnt = 0;
56+
PreTraversal(root, nums, &cnt);
57+
*returnSize = cnt;
58+
return nums;
59+
}

c_code/README.md

Lines changed: 42 additions & 42 deletions
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)