Skip to main content

Command Palette

Search for a command to run...

Solving Leetcode Interviews in Seconds with AI: Possible Bipartition

Updated
3 min read

Introduction

In this blog post, we will explore how to solve the LeetCode problem "886" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.

Problem Statement

We want to split a group of n people (labeled from 1 to n) into two groups of any size. Each person may dislike some other people, and they should not go into the same group. Given the integer n and the array dislikes where dislikes[i] = [ai, bi] indicates that the person labeled ai does not like the person labeled bi, return true if it is possible to split everyone into two groups in this way. Example 1: Input: n = 4, dislikes = [[1,2],[1,3],[2,4]] Output: true Explanation: The first group has [1,4], and the second group has [2,3]. Example 2: Input: n = 3, dislikes = [[1,2],[1,3],[2,3]] Output: false Explanation: We need at least 3 groups to divide them. We cannot put them in two groups. Constraints: 1 <= n <= 2000 0 <= dislikes.length <= 104 dislikes[i].length == 2 1 <= ai < bi <= n All the pairs of dislikes are unique.

Explanation

Here's a breakdown of the approach, followed by the Python code:

  • Bipartite Graph Coloring: Model the problem as a graph where people are nodes and dislikes are edges. The goal is to color the graph with two colors (representing the two groups) such that no adjacent nodes have the same color. This is equivalent to checking if the graph is bipartite.
  • Depth-First Search (DFS): Use DFS to traverse the graph. During the traversal, assign a color to each node. If we encounter a conflict (adjacent nodes with the same color), the graph is not bipartite.
  • Handle Disconnected Components: The graph might have disconnected components. Therefore, iterate through all nodes and start a DFS from each uncolored node to ensure all components are colored.

  • Time Complexity: O(n + dislikes.length), Space Complexity: O(n + dislikes.length)

Code

    def possibleBipartition(n: int, dislikes: list[list[int]]) -> bool:
    """
    Determines if it is possible to split n people into two groups such that
    no two people who dislike each other are in the same group.

    Args:
        n: The number of people.
        dislikes: A list of dislikes, where dislikes[i] = [ai, bi] indicates that
            person ai does not like person bi.

    Returns:
        True if it is possible to split everyone into two groups, False otherwise.
    """

    graph = [[] for _ in range(n + 1)]
    for u, v in dislikes:
        graph[u].append(v)
        graph[v].append(u)

    colors = [0] * (n + 1)  # 0: uncolored, 1: color 1, -1: color 2

    def dfs(node, color):
        colors[node] = color
        for neighbor in graph[node]:
            if colors[neighbor] == 0:
                if not dfs(neighbor, -color):
                    return False
            elif colors[neighbor] == color:
                return False
        return True

    for i in range(1, n + 1):
        if colors[i] == 0:
            if not dfs(i, 1):
                return False

    return True

More from this blog

C

Chatmagic blog

2894 posts