Home > Mobile >  Find the maximum length of contagious subarray with repeated element using recursive method with onl
Find the maximum length of contagious subarray with repeated element using recursive method with onl

Time:04-19

Problem: Find the maximum length of contagious subarray with repeated elements.
eg:
[1 2 2 2 3 3 5 1 8] - answer is 3 since 2 repeated 3 times is the max repeated times.
[1 2] - answer is 1
[1 2 2 3 3] - answer is 2

But the recursive function should only have list as the argument.
int findMaxContagiousRepeatedLength(List<Integer> list)

What I've tried:

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]));
    }
}

The above does work, but doesn't meet the requirement of argument restriction. Please help me figure out if it's possible to have a solution where recursive function only have list as the argument.

CodePudding user response:

Best solution

Use your Function

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));
    }
}

and make a second Function which calls your function with default parameters

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

Now you can call the second function which calls the first function with default parameters!

CodePudding user response:

First, this problem is best solved by just going through the list. But if you must use recursion with List<Integer> as the only parameter you may use the below:

( I renamed function appropriately because I doubt a subarray can be contagious :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())));
        
    }
  • Related