当前位置: 首页 > 知识库问答 >
问题:

以列表为参数,用递归方法求具有重复元素的传染子数组的最大长度

蔺翰音
2023-03-14

问题:找到具有重复元素的传染性子数组的最大长度。
例如:
[1 2 2 2 3 3 5 1 8]-答案是3,因为2重复3次是最大重复次数。
[1 2]-答案是1
[1 2 2 3 3]-答案是2

但是递归函数应该只有list作为参数
int findMaxConfectiousRepeatedLength(列表

我的尝试:

class Answer
{
    public static int findMaxContagiousRepeatedLength(List<Integer> nums, int currentCount, int latestNumber)
    {
        if (nums.isEmpty())
            return 0;

        if (nums.get(0) == latestNumber) {
            return Math.max(currentCount+1, findMaxContagiousRepeatedLength(nums.subList(1, nums.size()), currentCount+1, nums.get(0)));
        } else {
            return findMaxContagiousRepeatedLength(nums.subList(1, nums.size()), 1, nums.get(0));
        }
    }

    public static void main(String[] args)
    {
        Integer[] nums = { 1,2,1,1,1,1,1,2,3,2,3,1,2,2};

        System.out.println("Max length: " +
                findMaxContagiousRepeatedLength(Arrays.asList(nums), 0, nums.length == 0 ? -1 : nums[0]));
    }
}

上述方法确实有效,但不符合参数限制的要求。请帮我弄清楚是否有可能有一个递归函数只有列表作为参数的解决方案。


共有2个答案

湛宏旷
2023-03-14

首先,这个问题最好通过浏览列表来解决。但是如果你必须使用递归的列表

(我适当地重命名函数,因为我怀疑子数组会传染: p)

   public static int findMaxContiguousRepeatedLength(List<Integer> nums) {
        if (nums.isEmpty()) {
           return 0;
        }
        Iterator<Integer> it = nums.iterator();
        Integer start = it.next();
        int len = 1, pos = 1;
        while (it.hasNext()) {
           Integer curr = it.next();
           if (curr == start) {
               pos++;
               len++;
           } else {
               break;
           }
        }
        return Math.max(len,  findMaxContiguousRepeatedLength(nums.subList(pos,nums.size())));
        
    }

沈嘉瑞
2023-03-14

最佳解决方案

使用您的函数

public static int findMaxContagiousRepeatedLength(List<Integer> nums, int currentCount, int latestNumber)
{
    if (nums.isEmpty())
        return 0;

    if (nums.get(0) == latestNumber) {
        return Math.max(currentCount+1, findMaxContagiousRepeatedLength(nums.subList(1, nums.size()), currentCount+1, nums.get(0)));
    } else {
        return findMaxContagiousRepeatedLength(nums.subList(1, nums.size()), 1, nums.get(0));
    }
}

并制作第二个函数,用默认参数调用函数

public static int findMaxContagiousRepeatedLength(List<Integer> nums)
{
    return findMaxContagiousRepeatedLength(Arrays.asList(nums), 0, nums.length == 0 ? -1 : nums[0]);
}

现在您可以调用第二个函数,它使用默认参数调用第一个函数!

 类似资料:
  • 给定一个只有和的数组,求取和数目相等的最大子数组的长度。例如,给定一个数组 编写递归函数。这个函数接受3个输入:一个数组-A,它的第一个元素的索引-start,最后一个元素的索引-end,并返回largestsubarray的大小。如果没有找到数量相等的子数组,则函数应返回0。 如何修复此代码?请帮忙。谢了。

  • 我有这个问题: 您将获得一个整数 A 和一个整数 k 的数组。您可以将 A 的元素递减到 k 次,目标是生成一个元素都相等的连续子数组。返回可以用这种方式生成的最长的连续子数组的长度。 例如,如果 A 是 [1,7,3,4,6,5] 并且 k 是 6,那么您可以生成 [1,7,3,4-1,6-1-1-1,5-1-1] = [1,7,3,3,3,3],因此您将返回 4。 最佳解决方案是什么?

  • O(n^2)算法简单。有没有人对此有更好的算法?

  • 具有最大和(http://www.geeksforgeeks.org/dynamic-programming-set-14-maximum-sum-increasing-subsequence/)的最长递增子序列是一个经典的算法问题,并且网络上存在许多解决方案。但是,我只是遇到了这个问题的变体,不知道如何解决它。 与原始问题相比,现在还为您提供了一个数字m,该数字表示您最多可以从连续子范围中跳过的

  • 我有一个数组,类似于[1,3,5]。对于这些元素中的每一个,我都需要找到当前元素最高的最长子数组。答案是所有子数组的长度之和。 最终答案=1+2+3=6[单个子数组的长度] 对于这个问题,我可以给出一个强力O(N^2)。有没有更好的办法来解决这个问题?

  • 给定一个整数N和一个长度为N的数组,该数组由0到N-1的整数组成,可能包含也可能不包含所有整数,也可能包含重复数。查找一个从索引i到索引j的子数组(i, j),使其包含数组中的所有整数,并且具有最小长度。输出是这样一个子数组的长度 示例:A=[2,1,1,3,2,1,1,3],因此最小子数组长度=3,因为A[2]到A[4]包含所有数字 我的想法: 维护一个计数器数组和两个索引开始和结束,其中包含数