【问题标题】:Pass by reference and passing without reference in function在函数中通过引用传递和不引用传递
【发布时间】:2022-01-11 10:18:23
【问题描述】:

我正在解决这个问题: https://leetcode.com/problems/permutations-ii/

这是我的工作解决方案:

class Solution {
public:
vector<vector<int>> output;
void swap(vector<int>& nums, int index, int i){
    int temp=nums[index];
    nums[index]=nums[i];
    nums[i]=temp;
    return;
}
void helper(vector<int> nums, int index){ //here it is normally passed
    if(index==nums.size()){
        output.push_back(nums);
        return;
    }
    for(int i=index; i<nums.size(); i++){
        if(i!=index && nums[i]==nums[index]){continue;}
        swap(nums, i, index);
        helper(nums, index+1);
        // swap(nums, i, index);         //commented and used only with passed by reference
    }
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
    int size = nums.size();
    sort(begin(nums) ,end(nums));
    helper(nums, 0);
    return output;
}
};

WORKING example

然后这是我通过引用传递并在回溯时交换的解决方案:

class Solution {
public:
vector<vector<int>> output;
void swap(vector<int>& nums, int index, int i){
    int temp=nums[index];
    nums[index]=nums[i];
    nums[i]=temp;
    return;
}
void helper(vector<int> &nums, int index){ //here nums is passed by reference
    if(index==nums.size()){
        output.push_back(nums);
        return;
    }
    for(int i=index; i<nums.size(); i++){
        if(i!=index && nums[i]==nums[index]){continue;}
        swap(nums, i, index);
        helper(nums, index+1);
        swap(nums, i, index);             //backtrack
    }
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
    int size = nums.size();
    sort(begin(nums) ,end(nums));
    helper(nums, 0);
    return output;
}
};

NOT WORKING Example

但此解决方案似乎无法正常工作。 谁能解释一下为什么两者之间有区别?

【问题讨论】:

  • 请不要指望我们解释“工作正常”是什么意思。提供您用来确定“无法正常工作”的实际测试数据,并显示输出是什么,然后显示您期望的输出。
  • 抱歉,不知道这个功能。现在已经添加了相应的图像。
  • How do I ask a good question? 阅读:请勿发布代码、数据、错误消息等的图片。

标签: c++ reference backtracking


【解决方案1】:

显然,当调用辅助函数时,nums 向量不能改变,即在 for 循环中,所有迭代的 nums 必须相同。当您通过引用传递 nums 时,辅助函数会对其进行修改,并且对于 for 循环的每次迭代都会有所不同。第二次交换可能是为了恢复原始数字,但它不会发生,因为您交换了两个索引,对向量进行了一些更改,然后将确切的索引交换回来。它不会产生原始向量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 2012-10-10
    • 2019-02-12
    相关资源
    最近更新 更多