c++ 通过引用传递的向量中的递归函数

wxclj1h5  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(85)

我正在学习c++上的数据结构,我经历了一件对我来说很难理解或获得概念的事情。
我提出问题只是为了给给予更好的背景。
https://leetcode.com/problems/frequency-of-the-most-frequent-element/
一个元素的频率是它在数组中出现的次数。你被赋予一个整数数组nums和一个整数k。在一个操作中,你可以选择一个nums的索引,并将该索引处的元素递增1。在执行最多k次操作后,返回元素的最大可能频率。

Example 1:

Input: nums = [1,2,4], k = 5
Output: 3
Explanation: Increment the first element three times and the second element two times to 
make nums = [4,4,4].
4 has a frequency of 3.

字符串
这是一个简单的例子。

class Solution {
public:
    int maxFrequency(vector<int>& nums, int k) {
        
    }
};


我想先通过递归来解决这个问题,但我这里的问题是,函数正在获取一个向量的引用作为参数,所以如果我改变函数内部的值,它将改变原始向量。
我无法思考如何使用不同的选择进行不同的递归,因为它不是按值传递。
帮帮忙!!

aij0ehis

aij0ehis1#

我们可以使用一个临时的vector,它与给定的vector nums具有相同的元素,然后使用递归来探索所有的可能性。我们可以尝试运行以下递归代码:

class Solution {
int helper(int i,vector<int>& nums,vector<int> temp, int k) {
    if(k==0){
        unordered_map<int,int>freqMap;
        for(int i=0;i<temp.size();i++){
            freqMap[temp[i]]++;
        }
        int maxFreq=0;
        for(auto it:freqMap){
        maxFreq=max(maxFreq,it.second);
    }
    return maxFreq;
    }
    if(i<0) return 0;
    temp[i]+=1;
    int take=helper(i,nums,temp,k-1); //choose current index element
    temp[i]-=1;
    int not_take=helper(i-1,nums,temp,k); //skip current index element
    return max(take,not_take);
}

public:
int maxFrequency(vector<int>& nums, int k) {
    vector<int> temp=nums //temporary vector having same numbers as nums
    return helper(nums.size()-1,nums,temp,k);
    }
};

字符串
虽然代码使用了蛮力方法并且没有优化,但它为进一步解决和优化问题提供了初始逻辑。

相关问题