def twosum(nums, target):
def recur(arr, start):
if len(arr) == 2:
if nums[arr[0]]+nums[arr[1]] == target:
return True
return False
for i in range(start, len(nums)):
arr.append(i)
if recur(arr, i+1):
return arr
arr.pop()
return recur([], 0)
twosum(nums=[2,7,11,15], target = 9)

def solution(n, k):
answer = []
if len(arr) == k :
answer.append(arr[:])
return
def combination(arr, start):
for i in range(start, n+1):
arr.append(i)
combination(arr, i+1)
arr.pop()
return combination([], 1)
solution(n=4, k=2)

def permutation(arr):
if len(arr) == k:
answer.append(arr[:])
return
for i in range(1, n):
if i not in arr:
arr.append(i)
permutation(arr)
arr.pop()
answer = []
n = 4
k = 2
permutation(arr=[])
print(answer)

from collections import deque
def bfs(graph, start_v):
q = deque()
visited = [False]*len(graph)
q.append(start_v)
visited[start_v] = True
while q:
print(q)
cur_v = q.popleft()
print(cur_v)
for next_v in graph[cur_v]:
if not visited[next_v]:
q.append(next_v)
visited[next_v] = True
graph = {
0: [1, 3, 6],
1: [0, 3],
2: [3],
3: [0, 1, 2, 7],
4: [5],
5: [4, 6, 7],
6: [0, 5],
7: [3, 5],
}
bfs(graph, start_v=0)

def dfs(start_v):
visited[start_v] = True
print(start_v)
for cur_v in graph[start_v]:
if not visited[cur_v]:
dfs(cur_v)
graph = {
0: [1, 3, 6],
1: [0, 3],
2: [3],
3: [0, 1, 2, 7],
4: [5],
5: [4, 6, 7],
6: [0, 5],
7: [3, 5],
}
visited = [False for _ in range (len(graph))]
dfs(start_v=0)
class Solution(object):
def canVisitAllRooms(self, rooms):
"""
:type rooms: List[List[int]]
:rtype: bool
"""
visited = [False for _ in range(len(rooms))]
def dfs(start):
visited[start] = True
for cur_v in rooms[start]:
if not visited[cur_v]:
dfs(cur_v)
dfs(0)
return all(visited)
## bfs
from collections import deque
class Solution(object):
def canVisitAllRooms(self, rooms):
"""
:type rooms: List[List[int]]
:rtype: bool
"""
visited = [False for _ in range(len(rooms))]
def bfs(start):
queue = deque()
queue.append(start)
visited[start] = True
while queue :
s = queue.popleft()
for cur_v in rooms[s]:
if not visited[cur_v] :
visited[cur_v] = True
queue.append(cur_v)
bfs(0)
return all(visited)

https://leetcode.com/problems/number-of-islands/description/
# dfs
class Solution(object):
def numIslands(self, grid):
"""
:type grid: List[List[str]]
:rtype: int
"""
def dfs(r, c):
visited[r][c] = True
for i in range(4):
next_dr = r + dr[i]
next_dc = c + dc[i]
if 0<= next_dr <len(grid) and 0<=next_dc<len(grid[0]) and grid[next_dr][next_dc] == '1' :
if not visited[next_dr][next_dc]:
dfs(next_dr, next_dc)
cnt = 0
visited = [[False]*len(grid[0]) for _ in range(len(grid))]
dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]
for i in range(len(grid)):
for j in range(len(grid[0])):
if not visited[i][j] and grid[i][j] == '1':
dfs(i, j)
cnt +=1
return cnt
# bfs
from collections import deque
class Solution(object):
def numIslands(self, grid):
"""
:type grid: List[List[str]]
:rtype: int
"""
def bfs(r, c):
q= deque()
q.append([r, c])
visited[r][c] = True
while q:
r, c = q.popleft()
for i in range(4):
next_dr = r + dr[i]
next_dc = c + dc[i]
if 0 <= next_dr < len(grid) and 0 <= next_dc < len(grid[0]) and grid[next_dr][next_dc] == '1':
if not visited[next_dr][next_dc]:
q.append([next_dr, next_dc])
visited[next_dr][next_dc] = True
cnt = 0
visited = [[False]*len(grid[0]) for _ in range(len(grid))]
dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]
for i in range(len(grid)):
for j in range(len(grid[0])):
if not visited[i][j] and grid[i][j] == '1':
bfs(i, j)
cnt +=1
return cnt