Skip to content

Commit 4a80f02

Browse files
committed
10
1 parent 9137973 commit 4a80f02

9 files changed

+249
-0
lines changed

easy/countPrimes.py

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from collections import defaultdict
2+
class Solution:
3+
def countPrimes(self, n: int) -> int:
4+
5+
seen = defaultdict(lambda: True)
6+
count = 0
7+
8+
for i in range(2, n):
9+
if seen[i]:
10+
count += 1
11+
init = i * i
12+
while init < n:
13+
seen[init] = False
14+
init += i
15+
16+
return count
17+

hard/frogJump.py

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from collections import deque
2+
class Solution:
3+
def canCross(self, stones: List[int]) -> bool:
4+
lastElem = stones[-1]
5+
stoneSet = set(stones)
6+
if stones[1] != 1:
7+
return False
8+
9+
if len(stones) == 2:
10+
return True
11+
12+
seen = set((0, 0))
13+
nextJumps = deque([(1, 1)])
14+
nextSet = deque()
15+
16+
while nextJumps:
17+
stone, jump = nextJumps.popleft()
18+
for i in [-1, 0, 1]:
19+
if jump + i > 0:
20+
nextStone = stone + jump + i
21+
if nextStone == lastElem:
22+
return True
23+
if (nextStone, jump + i) not in seen and nextStone in stoneSet:
24+
seen.add((nextStone, jump + i))
25+
nextSet.append((nextStone, jump + i))
26+
27+
if len(nextJumps) == 0:
28+
nextJumps = nextSet
29+
nextSet = deque()
30+
31+
return False
32+

medium/coinChange.py

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from collections import defaultdict
2+
class Solution:
3+
def coinChange(self, coins: List[int], amount: int) -> int:
4+
5+
seen = defaultdict(lambda: -1)
6+
seen[0] = 0
7+
8+
for coin in coins:
9+
seen[coin] = 1
10+
11+
def changeCoin(amount):
12+
13+
if amount < 0:
14+
return float("inf")
15+
16+
if seen[amount] > -1:
17+
return seen[amount]
18+
19+
minm = float("inf")
20+
21+
for coin in coins:
22+
minm = min(minm, changeCoin(amount - coin) + 1)
23+
24+
seen[amount] = minm
25+
26+
return seen[amount]
27+
28+
minm = changeCoin(amount)
29+
30+
return minm if minm != float("inf") else -1

medium/coinChange_BottomUp.py

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from collections import defaultdict
2+
class Solution:
3+
def coinChange(self, coins: List[int], amount: int) -> int:
4+
5+
6+
seen = defaultdict(lambda: float("inf"))
7+
seen[0] = 0
8+
for coin in coins:
9+
seen[coin] = 1
10+
11+
for i in range(amount + 1):
12+
amt = i
13+
for j in range(len(coins)):
14+
if coins[j] <= amt:
15+
seen[amt] = min(seen[amt], seen[amt - coins[j]] + 1)
16+
17+
return seen[amount] if seen[amount] != float("inf") else -1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import bisect
2+
class Solution:
3+
def searchRange(self, nums: List[int], target: int) -> List[int]:
4+
5+
x = bisect.bisect(nums, target - 0.1)
6+
y = bisect.bisect(nums, target + 0.1)
7+
8+
if x == y:
9+
return [-1, -1]
10+
11+
else:
12+
return [x, y - 1]

medium/stringToInteger.py

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from collections import deque
2+
class Solution:
3+
def myAtoi(self, str: str) -> int:
4+
negative = False
5+
queue = deque()
6+
sign = True
7+
8+
nums = {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}
9+
10+
for char in str:
11+
if char == "-" and sign:
12+
sign = False
13+
negative = True
14+
elif char == "+" and sign:
15+
sign = False
16+
elif char == " ":
17+
if not sign:
18+
break
19+
elif char in nums:
20+
if sign:
21+
sign = False
22+
queue.append(char)
23+
else:
24+
break
25+
26+
runningSum = 0
27+
while queue:
28+
num = queue.popleft()
29+
if num in nums:
30+
runningSum = runningSum * 10 + nums[num]
31+
if runningSum >= pow(2, 31):
32+
return - pow(2,31) if negative else pow(2,31) - 1
33+
34+
return -runningSum if negative else runningSum

medium/swapNodesInPairs.py

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Definition for singly-linked list.
2+
# class ListNode:
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.next = None
6+
7+
class Solution:
8+
def swapPairs(self, head: ListNode) -> ListNode:
9+
10+
node = head
11+
prev = None
12+
13+
while node:
14+
node2 = node.next
15+
if node2:
16+
if head == node:
17+
head = node2
18+
swap = node2.next
19+
node2.next = node
20+
node.next = swap
21+
if prev:
22+
prev.next = node2
23+
else:
24+
break
25+
prev = node
26+
node = node.next
27+
28+
29+
return head

medium/theMaze.py

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from collections import deque
2+
class Solution:
3+
def hasPath(self, maze: List[List[int]], start: List[int], destination: List[int]) -> bool:
4+
5+
l1 = deque([start])
6+
l2 = deque()
7+
directions = [[0,1], [1,0], [-1,0], [0,-1]]
8+
9+
visited = set()
10+
visited.add(tuple(start))
11+
12+
def findExtreme(position, direction):
13+
newPos = position
14+
while((0 <= newPos[0] < len(maze)) and (0 <= newPos[1] < len(maze[0]) and maze[newPos[0]][newPos[1]] != 1)):
15+
prevPos = newPos
16+
newPos = [newPos[0] + direction[0], newPos[1] + direction[1]]
17+
if tuple(prevPos) not in visited:
18+
return prevPos
19+
else:
20+
return None
21+
22+
23+
while l1:
24+
curPos = l1.popleft()
25+
for direction in directions:
26+
newPos = findExtreme(curPos, direction)
27+
if newPos:
28+
if newPos == destination:
29+
return True
30+
l2.append(newPos)
31+
visited.add(tuple(newPos))
32+
33+
if len(l1) == 0:
34+
l1 = l2
35+
l2 = deque()
36+
37+
return False

medium/theMazeII.py

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from collections import deque
2+
from collections import defaultdict
3+
class Solution:
4+
def shortestDistance(self, maze: List[List[int]], start: List[int], destination: List[int]) -> int:
5+
6+
l1 = deque([(start, 0)])
7+
l2 = deque()
8+
directions = [[0,1], [1,0], [-1,0], [0,-1]]
9+
minJumps = float("inf")
10+
11+
visited = defaultdict(lambda: float("inf"))
12+
visited[tuple(start)] = 0
13+
14+
def findExtreme(position, direction, numJumps):
15+
newPos = position
16+
while((0 <= newPos[0] < len(maze)) and (0 <= newPos[1] < len(maze[0]) and maze[newPos[0]][newPos[1]] != 1)):
17+
prevPos = newPos
18+
newPos = [newPos[0] + direction[0], newPos[1] + direction[1]]
19+
numJumps += 1
20+
if visited[tuple(prevPos)] > (numJumps - 1):
21+
return prevPos, numJumps - 1
22+
else:
23+
return None
24+
25+
26+
while l1:
27+
curPos, jumps = l1.popleft()
28+
for direction in directions:
29+
retVal = findExtreme(curPos, direction, jumps)
30+
if retVal:
31+
newPos = retVal[0]
32+
numJumps = retVal[1]
33+
l2.append((newPos, numJumps))
34+
visited[tuple(newPos)] = numJumps
35+
36+
if len(l1) == 0:
37+
l1 = l2
38+
l2 = deque()
39+
jumps += 1
40+
41+
return visited[tuple(destination)] if visited[tuple(destination)] != float("inf") else -1

0 commit comments

Comments
 (0)