• Home
  • About
    • JOOS photo

      JOOS

      Joos's blog

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

[ leet_code ] [weekly-contest-174 solution] The K Weakest Rows in a Matrix, Reduce Array Size to The Half, Maximum Product of Splitted Binary Tree, Jump Game V

15 Feb 2020

Reading time ~1 minute

1. The K Weakest Rows in a Matrix

import heapq
def kWeakestRows(mat, k: int):
    return [j[1] for j in heapq.nsmallest(k, ((sum(v), i) for i, v in enumerate(mat)))]

2. Reduce Array Size to The Half

from collections import Counter
import itertools
def minSetSize(arr):
    return [x[0]+1 for x in enumerate(itertools.accumulate(sorted(collections.Counter(arr).values(), reverse = True))) if (x[1] >= len(arr)//2)]

3. Maximum Product of Splitted Binary Tree

그래프 탐색하면서 자식 노드들이 가진 합과 자신의 값의 합을 저장한다.

class Solution:
    def maxProduct(self, root: TreeNode) -> int:
        def dfs(node) :
            ret = node.val
            if node.left :
                ret += dfs(node.left)
            if node.right :
                ret += dfs(node.right)
            post_ordered_sums.append(ret)
            return ret

        post_ordered_sums = []
        dfs(root)

        ret = 0
        for a in post_ordered_sums :
            ret = max(ret, a * (post_ordered_sums[-1] - a))

        return ret % (10 ** 9 + 7)

4. Jump Game V

from functools import lru_cache

def maxJumps(arr, d: int) -> int:
    n = len(arr)

    # 특정 edge에서 갈 수 있는 노드들의 집합을 찾는다.
    edges = [[] for i in range(n)]
    for i in range(n) :
        for j in range(i+1, i + d + 1) :
            if j >= n or arr[j] >= arr[i] :
                break
            edges[i].append(j)
        for j in range(i-1, i - d - 1, -1) :
            if j < 0 or arr[j] >= arr[i] :
                break
            edges[i].append(j)
    # edge는 해당 노드에서 갈 수 있는 node들의 리스트
    @lru_cache(None)
    def dfs(cur) :
        # (자동 memoization)cur의 값이 들어왔을 때의 return값을 lru_cache에 저장해 놓는다.
        ret = 1
        for nxt in edges[cur] :
            ret = max(ret, dfs(nxt) + 1)
            # 갈 수 있는 루트 중 가장 긴 루트를 return한다.
        return ret

    ret = 0
    for i in range(n):
        ret = max(ret, dfs(i))
    return ret


algorithmpython Share Tweet +1