Shopping Patterns Solution Amazon OA 2021

Shopping Patterns Minimum Degree of a Connected Trio in a Graph

You are given an undirected graph. You are given an integer n which is the number of nodes in the graph and an array edges, where each edges[i] = [ui, vi] indicates that there is an undirected edge between ui and vi.

See Also : Amazon Online Assessment Questions 2021 Preparation

connected trio is a set of three nodes where there is an edge between every pair of them.

The degree of a connected trio is the number of edges where one endpoint is in the trio, and the other is not.

Return the minimum degree of a connected trio in the graph, or -1 if the graph has no connected trios.

Example 1:

Shopping Patterns Solution Amazon OA 2021
Input: n = 6, edges = [[1,2],[1,3],[3,2],[4,1],[5,2],[3,6]]
Output: 3
Explanation: There is exactly one trio, which is [1,2,3]. The edges that form its degree are bolded in the figure above.

Example 2:

Shopping Patterns Solution Amazon OA 2021
Input: n = 7, edges = [[1,3],[4,1],[4,3],[2,5],[5,6],[6,7],[7,5],[2,6]]
Output: 0
Explanation: There are exactly three trios:
1) [1,4,3] with degree 0.
2) [2,5,6] with degree 2.
3) [5,6,7] with degree 2.

Constraints:

  • 2 <= n <= 400
  • edges[i].length == 2
  • 1 <= edges.length <= n * (n-1) / 2
  • 1 <= ui, vi <= n
  • u!= vi
  • There are no repeated edges.

Solution

Program C++

class Solution {
public:
    
    bool visited[401][401];
    int minTrioDegree(int n, vector<vector<int>>& edges) {
        vector<unordered_set<int>>adj(n+1);
        
        memset(visited,false,sizeof(visited));
        
        int degree[n+1];
        for(int i=0;i<n+1;i++)
            degree[i]=0;
        
        for(int i=0;i<edges.size();i++){
            int start = edges[i][0];
            int end = edges[i][1];
            visited[start][end]=true;
            visited[end][start]=true;
            
            degree[start]++;
            degree[end]++;
        }
        
        int result = INT_MAX;
        
        for(int i=1;i<=n-2;i++){
            for(int j=i+1;j<=n-1;j++){
                for(int k=j+1;k<=n;k++){
                    if(connected(i,j,k)){
                        int count = 0;
                        count+=degree[i]-2;
                        count+=degree[j]-2;
                        count+=degree[k]-2;
                        result=min(result,count);
                    }
                }
            }
        }
        
        return result==INT_MAX ? -1: result;
    }
    
    bool connected(int i,int j,int k){
        if(!visited[i][j] || !visited[i][k])
            return false;
        
        if(!visited[j][i] || !visited[j][k])
            return false;
        
        if(!visited[k][i] || !visited[k][j])
            return false;
        
        return true;
    }
};

Program Python

class Solution:
    def minTrioDegree(self, n: int, edges: List[List[int]]) -> int:
        g = defaultdict(set)
        for a, b in edges:
            g[a].add(b)
            g[b].add(a)
            
        d = {n:len(g[n]) for n in g}
            
        res = inf
        for n in g:
            for m in g[n]:
                for o in g[n] & g[m]:
                    res = min(res, d[n]+d[m]+d[o]-6)
                    g[o].discard(n)
                g[m].discard(n)
                        
        return res if res < inf else -1

Program Java

he HashMap degrees keeps track of the degree for each vertex.
boolean[][] isEdge keeps track of whether (i, j) is an edge.

Then we just iterate through all edges (i, j), and for each edge, iterate through all nodes k, if (i, k) and (j, k) are also edges, then this is a trio. We just use the degrees we stored in the hashmap to calculate the total degrees.

The complexity is O(E * V), where E is the number of edges, and V is the number of vertices (which is N). In worst case scenario, there would be ~N^2 edges, so the time complexity is O(N^3).

class Solution {
    public int minTrioDegree(int n, int[][] edges) {
        int min = Integer.MAX_VALUE;
        Map<Integer, Integer> degrees = new HashMap<>(); // vertex, degree
        boolean[][] isEdge = new boolean[n + 1][n + 1];
        
        for (int[] edge : edges) {
            degrees.put(edge[0], degrees.getOrDefault(edge[0], 0) + 1);
            degrees.put(edge[1], degrees.getOrDefault(edge[1], 0) + 1);
            isEdge[edge[0]][edge[1]] = true;
            isEdge[edge[1]][edge[0]] = true;
        }
        
        for (int[] edge : edges) {
            for (int i = 1; i <= n; i++) {
                if (isEdge[i][edge[0]] && isEdge[i][edge[1]]) {
					// subtract 6 because we do not count inner edges of a trio
                    int degree = degrees.get(i) + degrees.get(edge[0]) + degrees.get(edge[1]) - 6;
                    min = Math.min(min, degree);
                }
            }
        }
        
        if (min == Integer.MAX_VALUE)
            return -1;
        return min;
    }
}

Related:

Weekly Contest 247

Biweekly Contest 55

June Long Challenge 2021 Solutions

Leave a Comment

error: Content is protected !!
Please Click on 1 or 2 Ads to help us run this site.