def coinChange(self, coins, amount): """ :type coins: List[int] :type amount: int :rtype: int """ if amount == 0: return 0 if not coins: return -1 dp = [0] + [-1] * amount for x in coins: for v in range(x, amount+1): if dp[v-x] >= 0: dp[v] = min(dp[v], dp[v-x] + 1) if dp[v] > 0 else dp[v-x] + 1 return dp[amount]
Monthly Archives: February 2016
Odd Even Linked List
class Solution(object): def oddEvenList(self, head): dummy = ListNode(0) dummy.next = head odd = dummy.next if not odd or not odd.next: return head even = odd.next dummy_even = ListNode(0) dummy_even.next = even while even and odd: odd.next = even.next odd = odd.next if odd: even.next = odd.next even = even.next cur = head while cur.next: cur = cur.next cur.next = dummy_even.next return dummy.next
Longest Increasing Path in a Matrix
class Solution(object): def longestIncreasingPath(self, M): R = len(M) if not R: return 0 C = len(M[0]) if not C: return 0 mem = [[0 for _ in range(C)] for _ in range(R)] def dfs(i, j): tmp = 0 for (x, y) in [(i, j+1), (i+1, j), (i, j-1), (i-1, j)]: if 0 <= x < R and 0 <= y < C: if mem[x][y] == 0 and M[x][y] > M[i][j]: dfs(x, y) if M[x][y] > M[i][j]: tmp = max(tmp, mem[x][y]) mem[i][j] = tmp + 1 for i in range(R): for j in range(C): if mem[i][j] == 0: dfs(i, j) result = max([max(row) for row in mem]) return result