【发布时间】:2019-12-13 03:36:33
【问题描述】:
我正在尝试为https://www.leetcode.com 上的编码挑战编写解决方案。 leetcode 解决方案的入口点是一个名为Solution 的类的方法。他们控制方法的名称,每个问题都不同。
我正在研究一种有点复杂的方法来解决问题,为了管理复杂性,我编写了很多辅助函数。大多数辅助函数都需要一些相同的变量,例如 vector<int> 我必须搜索一些东西。
我想避免将这些变量传递给我编写的每个辅助函数。我试图通过使它们成为Solution 的成员变量来做到这一点。我通常使用ints 之类的原始变量来做到这一点,这不会影响空间复杂度,但我只是尝试使用向量来做到这一点,其中副本确实会影响空间复杂度我尝试坚持使用恒定空间解决方案。
如何将向量存储为类的成员变量而不复制它,最好是不使用指针?我不想更改我的代码来处理指针。
这是一个寻找数组最小值和最大值的假装问题的最小示例。如果我给出问题的解决方案,他们会通过将测试用例传递给Solution().findMaximumAndMinimum(testCase); 来测试我的程序。
class Solution {
vector<int> numbers;
pair<int, int> findMaximumAndMinimum(vector<int>& A) {
numbers = A;
return {findMinimum(), findMaximum()};
}
int findMaximum() {
auto maximum = numbers.front();
for (auto number : numbers) {
if (maximum < number) {
maximum = number;
}
}
return maximum;
}
int findMinimum() {
auto minimum = numbers.front();
for (auto number : numbers) {
if (minimum > number) {
minimum = number;
}
}
return minimum;
}
};
我要更改的是 sn-p 的第 5 行:numbers = A。这将导致A 被复制到numbers。我不希望复制发生:我正在努力制作一个尽可能少占用时间和空间的解决方案,而复制我正在搜索的向量肯定会占用大量空间。
总结:我正在尝试制作一个看起来有点像上面的解决方案,但针对的是一个不同且更难的问题。上面的 sn-p 在显示我想要的内容时故意做的很简单。我想避免将A 明确传递给Solution 的其他方法。
背景:
- 我最初尝试将向量转换为引用成员
vector<int>& numbers,但构造函数遇到了问题。我相信在这种情况下我无法使用默认构造函数,因此它被报告为“已删除”,正如this answer 所说。 - Leetcode 将使用默认构造函数调用我的类。我无法控制。
- 也许我可以在
Solution中放置一个类并改用这个类,在那里我可以控制类的对象是如何构造的,因此引用成员变量不会造成麻烦,但我不想诉诸于此。我不希望我的程序在开始时缩进两次。
PS:欢迎提出如何不通过引用一个类的许多方法来绕过A的建议。请记住约束:我的解决方案的入口点是一个名为Solution 的类的方法,我无法控制该方法的名称。 不欢迎提出解决上述问题的不同方法的建议,因为以上是人为的 MWE。
【问题讨论】:
-
通过引用每个成员传递向量,或者更好的是,完全摆脱这些成员,只需在您的
findMaximumAndMinimum成员中使用单遍循环来查找 both 极值。 -
std::vector就像你写的那样是一个成员变量,你已经通过引用传递它,使用vector<int>&。我不明白你的问题。 -
@Frontear 该行将传递的参数复制给成员。没有自引用分配。然后
numbers用于计算每个成员函数中的极值。 -
@WhozCraig 正如我在帖子中所说,我实际上并没有试图解决这个最小和最大问题。这个关于极值的假装问题只是我对我正在寻找的最小示例的尝试。我还说我试图避免将数组传递给每个函数。我正在研究的问题有点复杂,我喜欢在编程时使用许多命名函数来描述我在做什么;必须一遍又一遍地传递一个明显的变量会使它变得混乱。
-
@Frontear 是的,向量是成员变量。那不是我的麻烦。它不是某种形式的对另一个向量的引用。据我了解,我的 sn-p 的第 5 行将导致
A被复制到numbers。我不想将A复制到数字,我希望numbers引用A。这是一个每一个小副本都很重要的情况,这是一场竞争。因为这是一场比赛,所以我有这样的限制,即我的程序的入口点是一个类的方法。
标签: c++