合并两个二维数组 - 求和法
题目链接
合并两个二维数组 - 求和法
解题思路
本题较为基础,可以直接分别遍历两数组,再用哈希表记录两数组中各编号的累加和,但该方法比较消耗空间,时间上的性能也不理想。
考虑到数组 nums1 和 nums2 都包含互不相同的 id,并按 id 以递增顺序排列,因此想到利用归并排序的思想,设立双指针 p1 和 p2,若两指针所指数组元素的 id 相同,则将 { nums1[p1][0], nums1[p1][1] + nums2[p2][1] } 进行归并,否则将较小 id 的元素(假设 p1 所指元素 id 更小) { nums1[p1][0], nums1[p1][1] } 进行归并。
解题代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { public: vector<vector<int>> mergeArrays(vector<vector<int>>& nums1, vector<vector<int>>& nums2) { vector<vector<int>> res; int p1 = 0, p2 = 0; while (p1 < nums1.size() && p2 < nums2.size()) { if (nums1[p1][0] == nums2[p2][0]) { res.push_back({ nums1[p1][0], nums1[p1][1] + nums2[p2][1] }); ++p1; ++p2; } else if (nums1[p1][0] < nums2[p2][0]) { res.push_back({ nums1[p1][0], nums1[p1][1] }); ++p1; } else { res.push_back({ nums2[p2][0], nums2[p2][1] }); ++p2; } } while (p1 < nums1.size()) { res.push_back({ nums1[p1][0], nums1[p1][1] }); ++p1; } while (p2 < nums2.size()) { res.push_back({ nums2[p2][0], nums2[p2][1] }); ++p2; } return res; } };
|
将整数减少到零需要的最少操作数
题目链接
将整数减少到零需要的最少操作数
解题思路
本题我最开始想往位运算的思路上出发,但无法得到一个有效的解法。
最后在题目示例中发现一个规律:要想使得操作次数最小,每次需要减去或加上离当前正整数 n 最近的 2 的幂数,而该幂数可能是第一个大于 n 的幂数,或是第一个小于 n 的幂数,若 n 本身就是 2 的幂数,则操作次数为 1。
由此可想到利用递归分治的思想,若第一个大于 n 的幂数为 n1,第一个小于 n 的幂数为 n2,使 n 等于 0 需要执行的最少操作数为: 使得 n1 - n 等于 0 和 使得 n - n2 等于 0 需要执行得最少操作次数中得较小值加上 1,即 minOperations(n) = min(minOperations(n1 - n), minOperations(n - n2)) + 1.
解题代码
1 2 3 4 5 6 7 8 9 10 11 12
| class Solution { public: int minOperations(int n) { int n1 = 1; while (n1 < n) { n1 *= 2; } if (n1 == n) return 1; int n2 = n1 / 2; return min(minOperations(n1 - n), minOperations(n - n2)) + 1; } };
|