Java Program:
package com.sourabh.test; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Queue; public class MinimumArrayContains { class Interval { private int start; private int end; public Interval() { super(); } public Interval(int start, int end) { super(); this.start = start; this.end = end; } public int getStart() { return start; } public void setStart(int start) { this.start = start; } public int getEnd() { return end; } public void setEnd(int end) { this.end = end; } } Map<Integer, Boolean> map = new HashMap<>(); Queue<Integer> queue = new LinkedList<>(); public void resetMap(int... A) { for(int i=0;i<A.length;i++) { map.put(A[i], false); } } public Interval resetQueue() { int start = queue.peek(); int end = 0; while(!queue.isEmpty()) { end = queue.remove(); } return new Interval(start, end); } public List<Interval> getIntervals(int[] A1, int[] A2) { int found = 0; int end = 0; List<Interval> intervalsContainingAllElementsOfA2 = new ArrayList<>(); resetMap(A2); for(int i=0; i<A1.length; i++) { if(map.containsKey(A1[i])) { if(map.get(A1[i]) == false) { found++; map.put(A1[i], true); } if(queue.peek()!= null && A1[i] == A1[queue.peek()]) { queue.remove(); } queue.add(i); end = i; } if(found == A2.length) { int start = queue.peek(); intervalsContainingAllElementsOfA2.add(new Interval(start, end)); int prevIndex = queue.remove(); map.put(A1[prevIndex], false); found--; int currIndex = queue.remove(); map.put(A1[currIndex], false); found--; while(currIndex - prevIndex ==1) { prevIndex = currIndex; currIndex = queue.remove(); found--; map.put(A1[currIndex], false); } i = currIndex; queue.add(currIndex); map.put(A1[currIndex], true); found++; } } return intervalsContainingAllElementsOfA2; } public Interval getMinimumInterval(int[] A1, int[] A2) { List<Interval> intervalsList = getIntervals(A1, A2); Interval minInterval = intervalsList.get(0); for(Interval interval : intervalsList) { if(interval.getEnd() - interval.getStart() < minInterval.getEnd() - minInterval.getStart()) { minInterval = interval; } } return minInterval; } }
Unit Tests:
package com.sourabh.test; import java.util.LinkedList; import java.util.List; import java.util.Queue; import org.junit.Test; import org.junit.Assert; import com.sourabh.test.MinimumArrayContains.Interval; public class QueueTest { Queue<Integer> queue = new LinkedList<>(); MinimumArrayContains instance = new MinimumArrayContains(); @Test public void testQueueFunctions() { queue.add(1); queue.add(2); queue.add(3); queue.add(4); Assert.assertTrue(queue.peek() == 1); Assert.assertTrue(queue.remove() == 1); Assert.assertTrue(queue.peek() == 2); Assert.assertTrue(queue.remove() == 2); } @Test public void testGetMinInterval1() { int[] A1 = {1,2,3,1,2,1,4,6,5,4,2,3,4,1}; int[] A2 = {1,2,4,5}; Interval interval = instance.getMinimumInterval(A1, A2); Assert.assertEquals(4, interval.getStart()); Assert.assertEquals(8, interval.getEnd()); } @Test public void testGetMinInterval2() { int[] A1 = {6, 7, 1, 3, 2, 4, 5, 2, 3, 1, 2, 5}; int[] A2 = {1, 3, 5}; Interval interval = instance.getMinimumInterval(A1, A2); Assert.assertEquals(3, interval.getEnd() - interval.getStart()); } }
thank u for sharing this post Meraki Firewall
ReplyDeleteMeraki Cloud