• + 1 comment

    I wish I had read this comment before. My java code worked with Scanner class but it quite ugly. (Test case 9 was most troublesome for me)

    public static int getMaxRemovedItems7(int [] a, int [] b, int x) {
    
        int total = 0;
        int max = 0;
    
        ArrayList<Integer> aPrefix = new ArrayList<>(a.length);
        ArrayList<Integer> bPrefix = new ArrayList<>(b.length);
    
        for(int i=0; i<a.length && total <= x; i++) {
            total += a[i];
            aPrefix.add(total);
        }
        aPrefix.trimToSize();
    
        total = 0;
        for(int i=0; i<b.length && total <= x; i++) {
            total += b[i];
            bPrefix.add(total);
        }
        bPrefix.trimToSize();
    
        int i=0;
        while((i+1)<aPrefix.size() && aPrefix.get(i+1) == 0)
            i++;
    
        int jStart = 0;
        while((jStart+1)<bPrefix.size() && bPrefix.get(jStart+1) == 0)
            jStart++;
    
        for(; i<aPrefix.size() && aPrefix.get(i)<=x; i++) {
            int j = nearest(bPrefix, jStart, bPrefix.size()-1, x-aPrefix.get(i));
            if((aPrefix.get(i)+bPrefix.get(j)) > x && (i+j+1) > max) {
                max = i+j+1;
            } else if ((aPrefix.get(i)+bPrefix.get(j)) <= x && (i+j+2) > max) {
                max = i+j+2;
            }
        }
    
        if(max >= aPrefix.size() + bPrefix.size()) {
            return max;
        }
    
        i=0;
        if((i+1)<bPrefix.size() && bPrefix.get(i+1) == 0)
            i++;
    
        jStart = 0;
        while((jStart+1)<aPrefix.size() && aPrefix.get(jStart+1) == 0)
            jStart++;
    
        for(; i<bPrefix.size() && bPrefix.get(i)<=x; i++) {
            int j = nearest(aPrefix, jStart, aPrefix.size()-1, x-bPrefix.get(i));
            if((bPrefix.get(i)+aPrefix.get(j)) > x && (i+j+1) > max) {
                max = i+j+1;
            } else if ((bPrefix.get(i)+aPrefix.get(j)) <= x && (i+j+2) > max) {
                max = i+j+2;
            }
        }
    
        return max;
    }
    
    private static int nearest(List<Integer> arr, int start, int end, int total) {
        if(start<end) {
            if(start == (end-1)) {
                return Math.abs(arr.get(start)-total) <= Math.abs(arr.get(end)-total) ? 
                        start : end ;
            } else {
                int mid = start + (end-start)/2;
                if(arr.get(mid) == total) {
                    while(mid+1 < arr.size() && arr.get(mid) == arr.get(mid+1))
                        mid++;
                    return mid;
                } else if (arr.get(mid) > total) {
                    while(mid-1 >= 0 && arr.get(mid) == arr.get(mid-1))
                        mid--;
                    return nearest(arr, start, mid, total);
                } else {
                    while(mid+1 < arr.size() && arr.get(mid) == arr.get(mid+1))
                        mid++;
                    return nearest(arr, mid, end, total);
                }
            }
        }
        return start;
    }