LeetCode-Feedback / LeetCode-Feedback

669 stars 328 forks source link

Missing Test Case - 1203. Sort Items by Groups Respecting Dependencies #15758

Closed AniModi closed 1 year ago

AniModi commented 1 year ago

Bug Report for Missing Test Cases

CodeRuddh

Category of the bug

Description of the bug

The provided Java code is expected to produce a runtime error for scenarios where the number of elements n is significantly larger than the number of groups m, and most or all of the numbers are ungrouped (group[i] = -1). However, the code is currently being accepted without any errors. This issue needs to be addressed as the code is not handling this scenario correctly.

Example for such testcases

8
2
[-1,-1,-1,-1,0,1,0,-1]
[[],[6],[5],[6],[3,6],[],[],[]]

Code you used for Submit/Run operation

class Solution {
    public int[] sortItems(int n, int m, int[] group, List<List<Integer>> beforeItems) {
        // make a graph
        // two type of directed edges - intergroup and intragroup
        // for ungrouped elements, allot them to new groups
        HashMap<Integer, ArrayList<Integer>> groupSet = new HashMap<>();
        ArrayList<Integer>[] interAdj = new ArrayList[2 * m + 1];
        ArrayList<Integer>[] intraAdj = new ArrayList[n];
        for(int i = 0; i < n; i ++) {
            intraAdj[i] = new ArrayList<>();
        }
        int newGroup = m;
        for(int i = 0; i < n; i ++) {
            if(group[i] == -1) {
                group[i] = newGroup ++;
            }
            groupSet.computeIfAbsent(group[i], fn -> new ArrayList<>()).add(i);
        }
        for(int i = 0; i < n; i ++) {
            if(interAdj[group[i]] == null)
                interAdj[group[i]] = new ArrayList<>();
        }
        for(int i = 0; i < beforeItems.size(); i ++) {
            int u_g = group[i];
            for(int j : beforeItems.get(i)) {
                int v_g = group[j];
                if(v_g == u_g) {
                    intraAdj[j].add(i); // edge j -> i
                }
                else {
                    interAdj[v_g].add(u_g); // edge v_g ---> u_g
                }
            }
        }
        boolean[] intraVis = new boolean[n];
        boolean[] intraVisUtil = new boolean[n];
        boolean flag = true;
        for(int i = 0; i < n; i ++) {
            if(intraVis[i] == false && intraAdj[i] != null) {
                flag &= isDAG(intraAdj, i, intraVis, intraVisUtil);
            }
            if(!flag) {
                return new int[0];
            }
        }

        boolean[] interVis = new boolean[2 * m + 1];
        boolean[] interVisUtil = new boolean[2 * m + 1];
        for(int i = 0; i <= 2 * m; i ++) {
            if(interVis[i] == false && interAdj[i] != null) {
                flag &= isDAG(interAdj, i, interVis, interVisUtil);
            }
            if(!flag) {
                return new int[0];
            }
        }
        Arrays.fill(interVis, false);
        Stack<Integer> groupOrder = new Stack<>();
        for(int i = 0; i <= 2 * m; i ++) {
            if(interVis[i] == false && interAdj[i] != null) {
                topoSort(interAdj, i, groupOrder, interVis);
            }
        }
        Arrays.fill(intraVis, false);
        Stack<Integer> numOrder = new Stack<>();
        for(int i = 0; i < n; i ++) {
            if(intraVis[i] == false && intraAdj[i] != null) {
                topoSort(intraAdj, i, numOrder, intraVis);
            }
        }
        int[] order = new int[n];
        for(int i = 0; i < n; i ++) {
            int e = numOrder.pop();
            order[e] = i;
        }
        int[] ans = new int[n];
        int j = 0;
        while(groupOrder.size() > 0) {
            int g = groupOrder.pop();
            Collections.sort(groupSet.get(g), (a, b) -> {
                return order[a] - order[b];
            });
            for(int i : groupSet.get(g)) {
                ans[j ++] = i;
            }
        }
        return ans;
    }
    boolean isDAG(ArrayList<Integer>[] adj, int i, boolean[] vis, boolean[] visUtil) {
        if(visUtil[i] == true) {
            return false;
        }
        if(vis[i] == true) {
            return true;
        }
        vis[i] = true;
        visUtil[i] = true;
        boolean ans = true;
        for(int j : adj[i]) {
            ans &= isDAG(adj, j, vis, visUtil);
        }
        visUtil[i] = false;
        return ans;
    }

    void topoSort(ArrayList<Integer>[] adj, int i, Stack<Integer> ans, boolean[] vis) {
        if(vis[i]) {
            return;
        }
        vis[i] = true;
        for(int j : adj[i]) {
            topoSort(adj, j, ans, vis);
        }
        ans.add(i);
    }
}

Language used for code

Java

Expected behavior

The expected behavior is that the provided code should produce a runtime error for scenarios where almost all elements are in different groups (group[i] = -1). Currently, this scenario is not being handled correctly by the provided code, and it should ideally result in a runtime error or produce an incorrect result.

LC-Pam commented 1 year ago

Hi there,

Thank you for reaching out to us.


We've relayed this issue to our team to investigate.


We will reach back to you after we have the results.

Thank you for your support.

LC-Pam commented 1 year ago

Thank you for your time.

We've used your feedback to update the problem.

Your LeetCode account has received 100 LeetCoins as a reward for this feedback.

If you have any other questions or feedback, please don't hesitate to let us know!

We appreciate your support!