Sunday, April 26, 2015

Maximum slice problem - MaxDoubleSliceSum

Here is another codility problem solution from the codility lessons (MaxDoubleSliceSum -Find the maximal sum of any double slice.) due to the copy rights I can't copy the content of the problem here so to view the problem description click here.




// you can also use imports, for example:
import java.util.*;

// you can use System.out.println for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {
	public int solution(int[] A) {
		int[] fromLiftDoubleSlices = new int[A.length];
		int[] fromRightDoubleSlices = new int[A.length];
		int max_ending = 0;
		for (int i = 1; i < A.length - 1; i++) {
			max_ending = Math.max(0, max_ending + A[i]);
			fromLiftDoubleSlices[i] = max_ending;
		}
		max_ending = 0;
		for (int i = A.length - 2; i > 0; i--) {
			max_ending = Math.max(0, max_ending + A[i]);
			fromRightDoubleSlices[i] = max_ending;
		}
		int maxSum = 0;
		for (int i = 1; i < A.length - 1; i++) {
			maxSum = Math.max(maxSum, fromLiftDoubleSlices[i - 1] + fromRightDoubleSlices[i + 1]);
		}



		return maxSum;
	}
}

Maximum slice problem - MaxSliceSum

Here is another codility problem solution from the codility lessons (MaxSliceSum - Find a maximum sum of a compact subsequence of array elements. ) due to the copy rights I can't copy the content of the problem here so to view the problem description click here.

Please be aware that the following code scores 92% only failed in on test case so if you could find where is the bug I will be glade to tell me.



class Solution {
	public int solution(int[] A) {
		// write your code in Java SE 8
		int sum = 0;
		int maxPosSeries = Integer.MIN_VALUE;
		int sumPos = 0;
		int maxVal = Integer.MIN_VALUE;
		boolean isPosFound = false;
		boolean containsPos = false;
		for (int i = 0; i < A.length; i++) {
			sum += A[i];
			maxVal = Math.max(maxVal, A[i]);
			if (A[i] >= 0) {
				isPosFound = true;
				containsPos = true;
				sumPos += A[i];
				maxPosSeries = Math.max(sumPos, maxPosSeries);

			} else if (A[i] < 0) {
				sumPos = 0;
				isPosFound = false;
			}


		}
		int min = Integer.MAX_VALUE;
		int ans = 0;
		int commulativeSUm = 0;

		for (int i = 0; i < A.length; i++) {
			commulativeSUm += A[i];
			int def = sum - (commulativeSUm);
			if (def < min) {
				min = def;
				ans = commulativeSUm;
			}

		}
		if (!containsPos) return maxVal;
		return Math.max(ans, maxPosSeries);

	}
}

Maximum slice problem - MaxProfit

Here is another codility problem solution from the codility lessons (MaxProfit -Given a log of stock prices compute the maximum possible earning. ) due to the copy rights I can't copy the content of the problem here so to view the problem description click here.




class Solution {
	public int solution(int[] A) {
		// write your code in Java SE 8

		int max = 0;
		int min = Integer.MAX_VALUE;
		int profit = Integer.MIN_VALUE;
		if (A.length < 2) return 0;
		for (int i = 0; i < A.length; i++) {

			min = Math.min(min, A[i]);
			int def = A[i] - min;
			profit = Math.max(profit, def);


		}

		return Math.abs(profit);
	}
}

Saturday, April 18, 2015

Leader - EquiLeader

Here is another codility problem solution from the codility lessons (EquiLeader -Find the index S such that the leaders of the sequences A[0], A[1], ..., A[S] and A[S + 1], A[S + 2], ..., A[N - 1] are the same. ) due to the copy rights I can't copy the content of the problem here so to view the problem description click here.




// you can also use imports, for example:
// import java.util.*;

// you can use System.out.println for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {
 public int solution(int[] A) {
  // write your code in Java SE 8


  Integer[] equi = findEquiLeader(A);
  if (equi == null) return 0;
  else {
   int equiLeader = equi[0];
   int count = equi[1];
   int startCount = 0;
   int equileaderCount = 0;
   for (int i = 0; i < A.length; i++) {
    if (A[i] == equiLeader) startCount++;

    if (startCount > (i + 1) / 2 && (count - startCount) > (A.length - (i + 1)) / 2) {
     equileaderCount++;
    }
   }
   return equileaderCount;
  }

 }
 private Integer[] findEquiLeader(int[] A) {
  int len = A.length;
  int size = 0;
  Integer value = null;
  for (int i = 0; i < A.length; i++) {
   if (size == 0) {
    value = A[i];
    size++;
   } else {
    if (value == A[i]) {
     size++;
    } else {
     size--;
    }
   }
  }
  if (size > 0) {
   int count = 0;
   for (int i: A) {
    if (i == value) count++;
   }
   if (count > A.length / 2) {


    return new Integer[] {
     value, count
    };

   }


  }

  return null;

 }


}



///Using Hashmap

class Solution {
    public int solution(int[] A) {
        // write your code in Java SE 8
        HashMap< Integer,Integer> hm = new HashMap();
        for( int i: A)
        {
            if(hm.containsKey(i))
                hm.put(i,hm.get(i)+1);
            else
                 hm.put(i,1);
        }
        int maxNum=0;
        int maxCount=0;
        for(int j: hm.keySet())
        {
            int currentCount=hm.get(j);
            if(maxCount< currentCount)
            {
                maxCount=currentCount;
                maxNum=j;
            }
        }
        //System.out.println(maxCount+" "+maxNum);
        int countOfMax=maxCount;
        int firstPart=0;
        int equiLeader=0;
        for(int i =0;i< A.length-1;i++)
        {
            if(A[i]==maxNum)
            {
                countOfMax--;
                firstPart++;
            }
          
            if((A.length-(i+1))/2< countOfMax&&(i+1)/2< firstPart)
            {
                equiLeader++;
            }
        }
        return equiLeader;
    }
}

Leader - Dominator

Here is another codility problem solution from the codility lessons (Dominator-Find an index of an array such that its value occurs at more than half of indices in the array.) due to the copy rights I can't copy the content of the problem here so to view the problem description click here.




// you can also use imports, for example:
// import java.util.*;

// you can use System.out.println for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {
	public int solution(int[] A) {
		Integer[] equi = findEquiLeader(A);
		if (equi == null) return -1;
		else {
			int equiLeader = equi[0];
			int value = equi[1];
			return value;
		}
	}
	private Integer[] findEquiLeader(int[] A) {
		int len = A.length;
		int size = 0;
		Integer value = null;
		for (int i = 0; i < A.length; i++) {
			if (size == 0) {
				value = A[i];
				size++;
			} else {
				if (value == A[i]) {
					size++;
				} else {
					size--;
				}
			}
		}
		if (size > 0) {
			int count = 0;
			int index = 0;
			for (int i = 0; i < A.length; i++) {
				if (A[i] == value) {
					count++;
					index = i;
				}
			}
			if (count > A.length / 2) {
				return new Integer[] {
					value, index
				};
			}


		}
		return null;

	}
}