java编码最大计数器

java编码最大计数器,java,arrays,algorithm,Java,Arrays,Algorithm,我一直在努力解决以下任务: 为您提供了N个计数器,最初设置为0,您可以对它们执行两种可能的操作: increase(X) − counter X is increased by 1, max_counter − all counters are set to the maximum value of any counter. 给出了一个由M个整数组成的非空零索引数组。此数组表示连续的操作: if A[K] = X, such that 1 ≤ X ≤ N, then o

我一直在努力解决以下任务:

为您提供了N个计数器,最初设置为0,您可以对它们执行两种可能的操作:

    increase(X) − counter X is increased by 1,
    max_counter − all counters are set to the maximum value of any counter.
给出了一个由M个整数组成的非空零索引数组。此数组表示连续的操作:

    if A[K] = X, such that 1 ≤ X ≤ N, then operation K is increase(X),
    if A[K] = N + 1 then operation K is max_counter.
例如,给定整数N=5和数组A,使得:

A[0] = 3
A[1] = 4
A[2] = 4
A[3] = 6
A[4] = 1
A[5] = 4
A[6] = 4
每次连续操作后的计数器值为:

(0, 0, 1, 0, 0)
(0, 0, 1, 1, 0)
(0, 0, 1, 2, 0)
(2, 2, 2, 2, 2)
(3, 2, 2, 2, 2)
(3, 2, 2, 3, 2)
(3, 2, 2, 4, 2)
目标是在所有操作之后计算每个计数器的值

struct Results {
  int * C;
  int L;
}; 
编写一个函数:

struct Results solution(int N, int A[], int M); 
给定一个整数N和一个由M个整数组成的非空零索引数组a,返回一个表示计数器值的整数序列

序列应返回为:

    a structure Results (in C), or
    a vector of integers (in C++), or
    a record Results (in Pascal), or
    an array of integers (in any other programming language).
例如,假设:

A[0] = 3
A[1] = 4
A[2] = 4
A[3] = 6
A[4] = 1
A[5] = 4
A[6] = 4
函数应该返回[3,2,2,4,2],如上所述

int maxx=0;
int lastvalue=0;
void set(vector<int>& A, int N,int X)
    {
        for ( int i=0;i<N;i++)
            if(A[i]<lastvalue)
                A[i]=lastvalue;
    }

vector<int> solution(int N, vector<int> &A) {
    // write your code in C++11

    vector<int> B(N,0);
    for(unsigned int i=0;i<A.size();i++)
        {
            if(A[i]==N+1)
               lastvalue=maxx;

            else
            {   if(B[A[i]-1]<lastvalue)
                    B[A[i]-1]=lastvalue+1;
                else
                    B[A[i]-1]++;
                if(B[A[i]-1]>maxx)
                    maxx=B[A[i]-1];
            }

        }
        set(B,N,maxx);
    return B;
}
假设:

    N and M are integers within the range [1..100,000];
    each element of array A is an integer within the range [1..N + 1].
复杂性:

    expected worst-case time complexity is O(N+M);
    expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).
可以修改输入数组的元素

这是我的解决方案:

import java.util.Arrays;

class Solution {
    public int[] solution(int N, int[] A) {

        final int condition = N + 1;
        int currentMax = 0;
        int countersArray[] = new int[N];

        for (int iii = 0; iii < A.length; iii++) {
            int currentValue = A[iii];
            if (currentValue == condition) {
                Arrays.fill(countersArray, currentMax);
            } else {
                int position = currentValue - 1;
                int localValue = countersArray[position] + 1;
                countersArray[position] = localValue;

                if (localValue > currentMax) {
                    currentMax = localValue;
                }
            }

        }

        return countersArray;
    }
}
导入java.util.array;
类解决方案{
公共int[]解决方案(int N,int[]A){
最终int条件=N+1;
int currentMax=0;
int countersArray[]=新的int[N];
对于(int iii=0;iiicurrentMax){
currentMax=localValue;
}
}
}
返回计数器阵列;
}
}
以下是评估代码:


你能给我一个提示这个解决方案有什么问题吗?

问题是,当你得到大量的
max\u counter
操作时,你会得到大量对
数组的调用。填充
,这会使你的解决方案变慢

您应该保留一个
currentMax
和一个
currentMin

  • 当你得到一个
    max\u计数器时,你只需设置
    currentMin=currentMax
  • 如果您得到另一个值,我们将其称为
    i
    • 如果位置
      i-1
      处的值小于或等于
      currentMin
      ,则将其设置为
      currentMin+1
    • 否则你会增加它。

最后,只需再次检查计数器数组,并将小于
currentMin
的所有内容设置为
currentMin

此代码出现问题:

for (int iii = 0; iii < A.length; iii++) {
     ...
     if (currentValue == condition) {
         Arrays.fill(countersArray, currentMax);
     }
     ...
}

另一个我已经开发并可能值得考虑的解决方案:

这是这个问题的100%解决方案

// you can also use imports, for example:
// import java.math.*;
class Solution {
    public int[] solution(int N, int[] A) {
        int counter[] = new int[N];
        int n = A.length;
        int max=-1,current_min=0;

        for(int i=0;i<n;i++){
            if(A[i]>=1 && A[i]<= N){
                if(counter[A[i] - 1] < current_min) counter[A[i] - 1] = current_min;
                counter[A[i] - 1] = counter[A[i] - 1] + 1;
                if(counter[A[i] - 1] > max) max = counter[A[i] - 1];
            }
            else if(A[i] == N+1){
                current_min = max;
            }
        }
        for(int i=0;i<N;i++){
            if(counter[i] < current_min) counter[i] =  current_min;
        }
        return counter;
    }
}
//您也可以使用导入,例如:
//导入java.math.*;
类解决方案{
公共int[]解决方案(int N,int[]A){
整数计数器[]=新整数[N];
int n=A.长度;
int max=-1,当前_min=0;
对于(int i=0;i=1&&A[i]max)max=计数器[A[i]-1];
}
else如果(A[i]==N+1){
电流_最小值=最大值;
}
}
对于(int i=0;i
向量解(int N,向量&A)
{
std::向量计数器(N,0);
int max=0;
int地板=0;
for(std::vector::迭代器i=A.begin();i!=A.end();i++)
{
整数指数=*i-1;
如果(*i=1)
{
if(计数器[索引]<楼层)
柜台[索引]=楼层;
计数器[索引]+=1;
max=std::max(计数器[索引],max);
}
其他的
{
地板=标准::最大值(最大值,地板);
}
}
for(std::vector::迭代器i=counter.begin();i!=counter.end();i++)
{
如果(*i<楼层)
*i=地板;
}
返回计数器;
}

Hera是我的AC Java解决方案。其理念与@Inwvr相同:

public int[] solution(int N, int[] A) {
        int[] count = new int[N];
        int max = 0;
        int lastUpdate = 0;
        for(int i = 0; i < A.length; i++){
            if(A[i] <= N){
                if(count[A[i]-1] < lastUpdate){
                    count[A[i]-1] = lastUpdate+1;   
                }
                else{
                    count[A[i]-1]++;
                }    
                max = Math.max(max, count[A[i]-1]);
            }
            else{
                lastUpdate = max;   
            }
        }  
        for(int i = 0; i < N; i++){
            if(count[i] < lastUpdate)
                count[i] = lastUpdate;
        }    
        return count;
    }
public int[]解决方案(int N,int[]A){
int[]计数=新的int[N];
int max=0;
int lastUpdate=0;
for(int i=0;i如果(A[i]我正在添加另一个带有一些测试用例的Java100解决方案,那么它们会很有帮助

// https://codility.com/demo/results/demoD8J6M5-K3T/ 77
// https://codility.com/demo/results/demoSEJHZS-ZPR/ 100
public class MaxCounters {

  // Some testcases
  // (1,[1,2,3]) = [1]
  // (1,[1]) = [1]
  // (1,[5]) = [0]
  // (1,[1,1,1,2,3]) = 3
  // (2,[1,1,1,2,3,1]) = [4,3]
  // (5, [3, 4, 4, 5, 1, 4, 4]) = (1, 0, 1, 4, 1)
  public int[] solution(int N, int[] A) {
      int length = A.length, maxOfCounter = 0, lastUpdate = 0;
      int applyMax = N + 1;
      int result[] = new int[N];

      for (int i = 0; i < length; ++i ) {
          if(A[i] == applyMax){
              lastUpdate = maxOfCounter;
          } else if (A[i] <= N)  {
              int position = A[i]-1;
              result[position] = result[position] > lastUpdate
                                        ? result[position] + 1 : lastUpdate + 1;
              // updating the max for future use
              if(maxOfCounter <=  result[position]) {
                  maxOfCounter = result[position];
              }
          }
     }
     // updating all the values that are less than the lastUpdate to the max value
     for (int i = 0; i < N; ++i) {
         if(result[i] < lastUpdate) {
             result[i] = lastUpdate;
         }
     }
     return result;
   }
}
//https://codility.com/demo/results/demoD8J6M5-K3T/ 77
// https://codility.com/demo/results/demoSEJHZS-ZPR/ 100
公共类最大计数器{
//一些测试用例
// (1,[1,2,3]) = [1]
// (1,[1]) = [1]
// (1,[5]) = [0]
// (1,[1,1,1,2,3]) = 3
// (2,[1,1,1,2,3,1]) = [4,3]
// (5, [3, 4, 4, 5, 1, 4, 4]) = (1, 0, 1, 4, 1)
公共int[]解决方案(int N,int[]A){
int length=A.length,maxOfCounter=0,lastUpdate=0;
int applyMax=N+1;
整数结果[]=新整数[N];
对于(int i=0;i如果(maxOfCounter在上面的帮助下,我在PHP中得到了100

function solution($N, $A) {
    $B = array(0);
    $max = 0;

    foreach($A as $key => $a) {
        $a -= 1;
        if($a == $N) {
            $max = max($B);
        } else {
            if(!isset($B[$a])) {
                $B[$a] = 0;
            }

            if($B[$a] < $max) {
                $B[$a] = $max + 1;
            } else {
                $B[$a] ++;
            }

        }

    }

    for($i=0; $i<$N; $i++) {
        if(!isset($B[$i]) || $B[$i] < $max) {
            $B[$i] = $max;
        }

    }

    return $B;


}
函数解决方案($N,$A){
$B=数组(0);
$max=0;
foreach($A作为$key=>$A){
$a-=1;
如果($a==$N){
$max=max$B;
}否则{
如果(!isset($B[$a])){
$B[$a]=0;
}
如果($B[$a]<$max){
$B[$a]=$max+1;
}否则{
$B[$a]++;
}
}
}

对于($i=0;$i)这是我的C++解决方案,它在CODILIT中得到100。这个概念与上面解释的一样。
int maxx=0;
int lastvalue=0;
void set(vector<int>& A, int N,int X)
    {
        for ( int i=0;i<N;i++)
            if(A[i]<lastvalue)
                A[i]=lastvalue;
    }

vector<int> solution(int N, vector<int> &A) {
    // write your code in C++11

    vector<int> B(N,0);
    for(unsigned int i=0;i<A.size();i++)
        {
            if(A[i]==N+1)
               lastvalue=maxx;

            else
            {   if(B[A[i]-1]<lastvalue)
                    B[A[i]-1]=lastvalue+1;
                else
                    B[A[i]-1]++;
                if(B[A[i]-1]>maxx)
                    maxx=B[A[i]-1];
            }

        }
        set(B,N,maxx);
    return B;
}
intmaxx=0;
int lastvalue=0;
空集(向量&A,整数N,整数X)
{

对于(int i=0;i这是问题的另一C++解决方案。< /P> 理由总是一样的

  • 避免将指令2上的所有计数器设置为max counter,因为这会使复杂性达到O(N*M)
  • 等待,直到我们在单个计数器上获得另一个操作代码
  • 此时,算法会记住
    int maxx=0;
    int lastvalue=0;
    void set(vector<int>& A, int N,int X)
        {
            for ( int i=0;i<N;i++)
                if(A[i]<lastvalue)
                    A[i]=lastvalue;
        }
    
    vector<int> solution(int N, vector<int> &A) {
        // write your code in C++11
    
        vector<int> B(N,0);
        for(unsigned int i=0;i<A.size();i++)
            {
                if(A[i]==N+1)
                   lastvalue=maxx;
    
                else
                {   if(B[A[i]-1]<lastvalue)
                        B[A[i]-1]=lastvalue+1;
                    else
                        B[A[i]-1]++;
                    if(B[A[i]-1]>maxx)
                        maxx=B[A[i]-1];
                }
    
            }
            set(B,N,maxx);
        return B;
    }
    
    vector<int> MaxCounters(int N, vector<int> &A) 
    {
        vector<int> n(N, 0);
        int globalMax = 0;
        int localMax = 0;
    
        for( vector<int>::const_iterator it = A.begin(); it != A.end(); ++it)
        {
            if ( *it >= 1 && *it <= N)
            {
                // this is an increase op.
                int value = *it - 1;
                n[value] = std::max(n[value], localMax ) + 1;
                globalMax = std::max(n[value], globalMax);
            }
            else
            {
                // set max counter op.
                localMax = globalMax;
            }
        }
    
        for( vector<int>::iterator it = n.begin(); it != n.end(); ++it)
            *it = std::max( *it, localMax );
    
        return n;
    }
    
    public int[] solution(int N, int[] A) {
    
        int[] counters = new int[N];
        int maxAIs = 0;
        int minAShouldBe = 0;
    
        for(int x : A) {
            if(x >= 1 && x <= N) {
                if(counters[x-1] < minAShouldBe) {
                    counters[x-1] = minAShouldBe;
                }
    
                counters[x-1]++;
    
                if(counters[x-1] > maxAIs) {
                    maxAIs = counters[x-1];
                }
            } else if(x == N+1) {
                minAShouldBe = maxAIs;
            }
        }
    
        for(int i = 0; i < N; i++) {
            if(counters[i] < minAShouldBe) {
                counters[i] = minAShouldBe;
            }
        }
    
        return counters;
    }
    
    vector<int> solution(int N, vector<int> &A)
    {
        std::vector<int> counters(N);
        auto max = 0;
        auto current = 0;
    
        for (auto& counter : A)
        {
            if (counter >= 1 && counter <= N)
            {
                if (counters[counter-1] < max)
                    counters[counter - 1] = max;
    
                counters[counter - 1] += 1;
    
                if (counters[counter - 1] > current)
                    current = counters[counter - 1];
            }
            else if (counter > N)
                max = current;
    
        }
    
        for (auto&& counter : counters)
            if (counter < max)
                counter = max;
    
        return counters;
    }
    
    boolean maxCalled;
    
    public int[] solution(int N, int[] A) {
    
    int max =0;
    int [] counters = new int [N];
        int temp=0;
        int currentVal = 0;
        for(int i=0;i<A.length;i++){
        currentVal = A[i];
        if(currentVal <=N){
            temp = increas(counters,currentVal);
            if(temp > max){
            max = temp;
            }
        }else{
            if(!maxCalled)
            maxCounter(counters,max);
        }
    
        }
    
        return counters;
    
    }
    
    
    int increas (int [] A, int x){  
     maxCalled = false;
     return ++A[x-1];  
     //return t;
    }
    
    void maxCounter (int [] A, int x){
     maxCalled = true;
      for (int i = 0; i < A.length; i++) {
     A[i] = x;
      }
    
    }
    
    int base = 0;
    int cMax = 0;
    
    for (int a : A) {
        if (a > counters.length) {
            base = cMax;
        } else {
            if (counters[a - 1] < base) {
                counters[a - 1] = base;
            }
    
            counters[a - 1]++;
    
            cMax = Math.max(cMax, counters[a - 1]);
        }
    }
    
    for (int i = 0; i < counters.length; i++) {
        if (counters[i] < base) {
            counters[i] = base;
        }
    }
    
    return counters;
    
    public boolean isToSum(int value, int N) {
        return value >= 1 && value <= N;
    }
    
    public int[] solution(int N, int[] A) {
        int[] res = new int[N];
        int max =0;
        int minValue = 0;
    
        for (int i=0; i < A.length; i++){
            int value = A[i];
            int pos = value -1;
            if ( isToSum(value, N)) {
                if( res[pos] < minValue) {
                    res[pos] = minValue;
                }
                res[pos] += 1;
                if (max < res[pos]) {
                    max = res[pos];
                }
            } else {
                minValue = max;
            }
        }
    
        for (int i=0; i < res.length; i++){
            if ( res[i] < minValue ){
                res[i] = minValue;
            }
        }
        return res;
    }
    
    public class Solution {  
    
            public int[] solution(int N, int[] A) {
    
                int[] counters = new int[N];
                int[] countersLastMaxIndexes = new int[N];
                int maxValue = 0;
                int fixedMaxValue = 0;
                int maxIndex = 0;
                for (int i = 0; i < A.length; i++) {
                    if (A[i] <= N) {
                        if (countersLastMaxIndexes[A[i] - 1] != maxIndex) {
                            counters[A[i] - 1] = fixedMaxValue;
                            countersLastMaxIndexes[A[i] - 1] = maxIndex;
    
                        }
                        counters[A[i] - 1]++;
                        if (counters[A[i] - 1] > maxValue) {
                            maxValue = counters[A[i] - 1];
                        }
                    } else {
                        maxIndex = i;
                        fixedMaxValue = maxValue;
                    }
    
                }
                for (int i = 0; i < countersLastMaxIndexes.length; i++) {
                    if (countersLastMaxIndexes[i] != maxIndex) {
                        counters[i] = fixedMaxValue;
                        countersLastMaxIndexes[i] = maxIndex;
                    }
                }
    
                return counters;
            }
    }
    
    public int[] solution(int N, int[] A) {
        int[] solution = new int[N];
        int maxCounter = 0;
        int maxCountersSum = 0;
        for(int a: A) {
            if(a >= 1 && a <= N) {
                if(solution[a - 1] < maxCountersSum)
                    solution[a - 1] = maxCountersSum;
                solution[a - 1]++;
                if(solution[a - 1] > maxCounter)
                    maxCounter = solution[a - 1];
            }
            if(a == N + 1) {
                maxCountersSum = maxCounter;
            }
        }
        for(int i = 0; i < N; i++) {
            if(solution[i] < maxCountersSum)
                solution[i] = maxCountersSum;
        }
    
        return solution;
    }
    
    def solution(N, A):
        # write your code in Python 3.6
        RESP = [0] * N
        MAX_OPERATION = N + 1
        current_max = 0
        current_min = 0
        for operation in A:
            if operation != MAX_OPERATION:
                if RESP[operation-1] <= current_min:
                    RESP[operation-1] = current_min + 1
                else:
                    RESP[operation-1] += 1
    
                if RESP[operation-1] > current_max:
                    current_max = RESP[operation-1]
            else:
                if current_min == current_max:
                    current_min += 1
                else:
                    current_min = current_max
    
        for i, val in enumerate(RESP):
            if val < current_min:
                RESP[i] = current_min
        return RESP
    
    def sample_method(A,N=5):
        initial_array = [0,0,0,0,0]
    for i in A:
    
        if(i>=1):
          if(i<=N):
            initial_array[i-1]+=1
          else:
            for a in range(len(initial_array)):
              initial_array[a]+=1
        print i
        print initial_array
    
    def solution(N, A):
        count = [0]*(N+1)
        for i in range(0,len(A)):
            if A[i] >=1 and A[i] <= N:
                count[A[i]] += 1
            elif A[i] == (N+1): 
                count = [max(count)] * len(count)
        count.pop(0)
        return count
    
    function counters(numCounters: number, operations: number[]) {
    const counters = Array(numCounters)
    
    let max = 0
    let currentMin = 0
    
    for (const operation of operations) {
        if (operation === numCounters + 1) {
            currentMin = max
        } else {
            if (!counters[operation - 1] || counters[operation - 1] < currentMin) {
                counters[operation - 1] = currentMin
            }
    
            counters[operation - 1] = counters[operation - 1] + 1
    
            if (counters[operation - 1] > max) {
                max += 1
            }
        }
    }
    
    for (let i = 0; i < numCounters; i++) {
        if (!counters[i] || counters[i] < currentMin) {
            counters[i] = currentMin
        }
    }
    
    return counters
    
    function solution(N, A) {
        let max = 0;
        let counters = Array(N).fill(max);
        let maxCounter = 0;
    
        for (let op of A) {
            if (op <= N && op >= 1) {
                maxCounter = 0;
                if (++counters[op - 1] > max) {
                    max = counters[op - 1];
                }
            } else if(op === N + 1 && maxCounter === 0) {
                maxCounter = 1;
                for (let i = 0; i < counters.length; i++) {
                    counters[i] = max;   
                }
            }
        }
    
        return counters;
    }
    
        class Solution {
        public int[] solution(int N, int[] A) {
            // write your code in Java SE 8
            int[] result = new int[N];
            int base = 0;
            int max = 0;
            int needToChange=A.length;;
            for (int k = 0; k < A.length; k++) {
                int X = A[k];
                if (X >= 1 && X <= N) {
    
                    if (result[X - 1] < base) {
                        result[X - 1] = base;
                    }
                    result[X - 1]++;
                    if (max < result[X - 1]) {
                        max = result[X - 1];
                    }
                }
                if (X == N + 1) {
                    base = max;
                    needToChange= X-1;
    
                }
            }
            for (int i = 0; i < needToChange; i++) {
                if (result[i] < base) {
                    result[i] = base;
                }
            }
            return result;
    
        }
    
    }
    
    import java.util.*;
    
    class Solution {
      final private Map<Integer, Integer> counters = new HashMap<>();
      private int maxCounterValue = 0;
      private int maxCounterValueRealized = 0;
    
      public int[] solution(int N, int[] A) {
        if (N < 1) return new int[0];
    
        for (int a : A) {
          if (a <= N) {
            Integer current = counters.putIfAbsent(a, maxCounterValueRealized + 1);
            if (current == null) {
              updateMaxCounterValue(maxCounterValueRealized + 1);
            } else {
              ++current;
              counters.replace(a, current);
              updateMaxCounterValue(current);
            }
          } else {
            maxCounterValueRealized = maxCounterValue;
            counters.clear();
          }
        }
    
        return getCountersArray(N);
      }
    
      private void updateMaxCounterValue(int currentCounterValue) {
        if (currentCounterValue > maxCounterValue)
          maxCounterValue = currentCounterValue;
      }
    
      private int[] getCountersArray(int N) {
        int[] countersArray = new int[N];
    
        for (int j = 0; j < N; j++) {
          Integer current = counters.get(j + 1);
          if (current == null) {
            countersArray[j] = maxCounterValueRealized;
          } else {
            countersArray[j] = current;
          }
        }
    
        return countersArray;
      }
    }
    
     public static int[] solution(int N, int[] A) {
    
        int[] counters = new int[N];
        //The Max value between all counters at a given time
        int max = 0;
    
        //The base Max that all counter should have after the "max counter" operation happens
        int baseMax = 0;
    
        for (int i = 0; i < A.length; i++) {
    
            //max counter Operation ==> updating the baseMax
            if (A[i] > N) {
                // Set The Base Max that all counters should have
                baseMax = max;
    
            }
    
            //Verify if the value is bigger than the last baseMax because at any time a "max counter" operation can happen and the counter should have the max value
            if (A[i] <= N && counters[A[i] - 1] < baseMax) {
                counters[A[i] - 1] = baseMax;
            }
    
            //increase(X) Operation => increase the counter value
            if (A[i] <= N) {
                counters[A[i] - 1] = counters[A[i] - 1] + 1;
    
                //Update the max
                max = Math.max(counters[A[i] - 1], max);
            }
        }
    
        //Set The remaining values to the baseMax as not all counters are guaranteed to be affected by an increase(X) operation in "counters[A[i] - 1] = baseMax;"
        for (int j = 0; j < N; j++) {
            if (counters[j] < baseMax)
                counters[j] = baseMax;
        }
    
        return counters;
    }
    
    def solution(N, A):
    """
    Solution at 100% - https://app.codility.com/demo/results/trainingUQ95SB-4GA/
    Idea is first take the counter array of given size N
    take item from main A one by one + 1 and put in counter array , use item as index
    keep track of last max operation
    at the end replace counter items with max of local or counter item it self
    :param N:
    :param A:
    :return:
    """
    global_max = 0
    local_max = 0
    # counter array
    counter = [0] * N
    
    for i, item in enumerate(A):
        # take item from original array one by one - 1 - minus due to using item as index
        item_as_counter_index = item - 1
        # print(item_as_counter_index)
        # print(counter)
        # print(local_max)
        # current element less or equal value in array and greater than 1
        #         if A[K] = X, such that 1 ≤ X ≤ N, then operation K is increase(X),
        if N >= item >= 1:
            # max of local_max counter at item_as_counter_index
            # increase counter array value and put in counter array
            counter[item_as_counter_index] = max(local_max, counter[item_as_counter_index]) + 1
            # track the status of global_max counter so far
            # this is operation K
            global_max = max(global_max, counter[item_as_counter_index])
        #         if A[K] = N + 1 then operation K is max counter.
        elif item == N + 1:
            # now operation k is as local max
            # here we need to replace all items in array with this global max
            # we can do using for loop for array length but that will cost bigo n2 complexity
            # example -  for i, item in A: counter[i] = global_max
            local_max = global_max
        # print("global_max each step")
        # print(global_max)
    
    # print("local max so far....")
    # print(local_max)
    # print("counter - ")
    # print(counter)
    # now counter array - replace all elements which are less than the local max found so far
    # all counters are set to the maximum value of any counter
    for i, item in enumerate(counter):
        counter[i] = max(item, local_max)
    
    return counter
    
    class Solution {
    public int[] solution(int N, int[] A) {
        // write your code in Java SE 8
    
        int max = 0;
        int[] counter = new int[N];
        int upgrade = 0;
    
        for ( int i = 0; i < A.length; i++ )
        {
            if ( A[i] <= N )
            {
                if ( upgrade > 0 && upgrade > counter[A[i] - 1 ] )
                {
                    counter[A[i] - 1] = upgrade; 
                }
    
                counter[A[i] - 1 ]++;
    
                if ( counter[A[i] - 1 ] > max )
                    {
                        max = counter[A[i] - 1 ];
                    }
            }
            else
            {
                upgrade = max;
            }
    
        }
    
        for ( int i = 0; i < N; i++ )
        {
            if ( counter[i] < upgrade)
            {
                counter[i] = upgrade;
            }
        }
    
        return counter;
    
    }
    
    public int[] solution(int N, int[] A) {

    int[] counters = new int[N]; int currentMax = 0; int sumOfMaxCounters = 0; boolean justDoneMaxCounter = false; for (int i = 0; i < A.length ; i++) { if (A[i] <= N) { justDoneMaxCounter = false; counters[A[i]-1]++; currentMax = currentMax < counters[A[i]-1] ? counters[A[i]-1] : currentMax; }else if (!justDoneMaxCounter){ sumOfMaxCounters += currentMax; currentMax = 0; counters = new int[N]; justDoneMaxCounter = true; } } for (int j = 0; j < counters.length; j++) { counters[j] = counters[j] + sumOfMaxCounters; } return counters; }
  • def solution(N, A):
        c = [0] * N
    
        max_element = 0
        base = 0
        for item in A:
    
            if item >= 1 and N >= item:
                c[item-1] = max(c[item-1], base) + 1
                max_element = max(c[item - 1], max_element)
            elif item == N + 1:
                base = max_element
    
        for i in range(N):
            c[i] = max (c[i], base)
        return c
        pass
    
    class Solution {
        public int[] solution(int N, int[] A) {
            // write your code in Java SE 8
            
            int max = 0, applyMax = 0;;
            int[] result = new int[N];
            
            for (int i = 0; i < A.length; ++i) {
                int a = A[i];
                
                if (a == N + 1) {
                    applyMax = max;
                }
                
                if (1 <= a && a <= N) {
                    result[A[i] - 1] = Math.max(applyMax, result[A[i] - 1]);
                    max = Math.max(max, ++result[A[i] - 1]);
                }
            }
            
            for (int i = 0; i < N; ++i) {
                if (result[i] < applyMax) {
                    result[i] = applyMax;
                }
            }
            
            return result;
        }
    }