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
+ */
0 commit comments