thảo luận Leetcode mỗi ngày

  • Người tạo chủ đề Người tạo chủ đề _Gia_Cat_Luong_
  • Ngày bắt đầu Ngày bắt đầu
Trạng thái
Không mở để trả lời thêm.
Hôm nay bài 1 không nghĩ ra được ý tưởng gì.
Bài 2 thì làm phức tạp quá submit chậm mất 12s.
Tốn cả đống thời gian cho bài 2 và bài 3 (vì lỗi typo).

Bài 4 thì tính topo rank từ đầu luôn, không sort. Sau đó thì chỉ cần gán kiểu m[rankr[j]][rankc[j]] = j.
 
Hôm nay bài 1 không nghĩ ra được ý tưởng gì.
Bài 2 thì làm phức tạp quá submit chậm mất 12s.
Tốn cả đống thời gian cho bài 2 và bài 3 (vì lỗi typo).
Bài 1 nó lừa đó, đọc kỹ cái đề bài: longest subsequence with limited sum
Nay t làm xong hết 3 bài đầu tầm 30p. Bài 4 setup cái topo sorting bằng C++ lâu quá, còn 1 tiếng mà k kịp, :ah:. Biết thế dùng python luôn là kịp rồi, :beat_shot:
 
Python:
def toposort(graph):
    res, found = [], [0] * len(graph)
    stack = list(range(len(graph)))
    while stack:
        node = stack.pop()
        if node < 0:
            res.append(~node)
        elif not found[node]:
            found[node] = 1
            stack.append(~node)
            stack += graph[node]

    # cycle check
    for node in res:
        if any(found[nei] for nei in graph[node]):
            return None
        found[node] = 0

    return res[::-1]

Code của thằng top1, ko đệ quy. Không phải Kahn vì nó select các node có in_degree = 0 vào trước.

Hình như là khử đệ quy, ai hiểu tại sao nó code như này ko.

Mà mấy cái vừa thi xong thì vào đâu để xem bọn nó giải thích nhỉ, trước có mục discuss mà giờ tìm hoài ko thấy
 
Python:
def toposort(graph):
    res, found = [], [0] * len(graph)
    stack = list(range(len(graph)))
    while stack:
        node = stack.pop()
        if node < 0:
            res.append(~node)
        elif not found[node]:
            found[node] = 1
            stack.append(~node)
            stack += graph[node]

    # cycle check
    for node in res:
        if any(found[nei] for nei in graph[node]):
            return None
        found[node] = 0

    return res[::-1]

Code của thằng top1, ko đệ quy. Không phải Kahn vì nó select các node có in_degree = 0 vào trước.

Hình như là khử đệ quy, ai hiểu tại sao nó code như này ko.

Mà mấy cái vừa thi xong thì vào đâu để xem bọn nó giải thích nhỉ, trước có mục discuss mà giờ tìm hoài ko thấy
Nó dùng dfs, kahn là bfs
 
Dạo này contest bài 1 toàn cú lừa thôi. Cay nhất bài 1 tuần trước lúc submit thì đc accept rồi. đến mấy hôm sau nó update thêm 1 cái test case nữa thành ra bị fail bài 1. Đang rank 1k tụt xuống 4k =((

Sent from Samsung SM-G986U1 using vozFApp
 
Đọc đề k biết sai không nhưng hiểu đáp án cố định.
1 hướng là viết thẳng các số theo chiều dọc, từng cột. Xong roll mỗi hàng tương ứng với index của nó.
Mà submit fail, đến cách thứ 3 vẫn k được đành bỏ :too_sad:
 
Cách làm hơi ma đạo tý, sửa mãi mới đúng :cry:

Python:
class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        parent_node ={}

        def f_find(k):
            if parent_node[k] == k:
                return k
            return f_find(parent_node[k])
    
        def f_union(a, b):
            x = f_find(a)
            y = f_find(b)
            parent_node[x] = y
    
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j] == "1":
                    parent_node[(i, j)] = (i, j)
 
        arr = [item for item in parent_node]
    
        for i, j in arr:
            if i > 0 and grid[i-1][j] == "1": # above = 1
                f_union((i, j), (i-1, j))
                if j > 0 and grid[i][j-1] == "1": # left side = 1
                    f_union((i, j-1), (i-1, j))
            else:
                if j > 0 and grid[i][j-1] == "1": # left side = 1, above = 0
                    f_union((i, j), (i, j-1))
            
        cnt = set()
        for i, j in arr:
            cnt.add(f_find((i, j)))
    
        return len(cnt)
 
Bài hôm nay giải theo kiểu day 09 advent of code 2021 có vẻ dc, để tối về thử
hkNtitg.png
 
thì loang như MS Paint fill color ấy, dfs bfs gì cũng được, cách cũ xì
WawmAwM.png


cách xịn hơn là weighted union find with path compression gì đấy, hình như mỗi operation union/find gần như là O(1)
BdgiW7R.png
code lại siu ngắn nữa phản logic quá nên toy ko nhớ nổi, như cái thuật toán Kadane gì cũng vô lý vờ lờ toy cũng ko lưu vào bộ nhớ
OANgL56.png


Space O(1) ở bên python là beat được gần 90% rồi :look_down:
https://leetcode.com/submissions/detail/785975143/
đáng lẽ đánh dấu đã duyệt là ký tự '2' cũng được O(1) nhưng thoy tạo cái mảng khác tô màu luôn cho nó đẹp
JEWoIdl.png
đã code ko hoàn hảo như union-find kia cần gì tối ưu làm gì
JiZo9zf.png
 
Sửa lần cuối:
Đã xong
hkNtitg.png
. Bọn leetcode chơi dơ, cái list input của elixir nó để code ascii của 0 và 1 là 48 và 49, làm debug cả buổi
cVL81H2.gif


Mã:
defmodule Solution do
  @move_steps [{0, 1}, {0, -1}, {1, 0}, {-1, 0}]

  def num_islands(grid) do
    {row, col, ocean} = to_map(grid, 0, 0, %{})


    for r <- 0..(row - 1), reduce: {MapSet.new(), 0} do
      {visited, islands} ->
        for c <- 0..(col - 1), reduce: {visited, islands} do
          {visited, islands} ->
            if MapSet.member?(visited, {r, c}) or Map.get(ocean, {r, c}) == ?0 do
              {visited, islands}
            else
              {scan_island(ocean, visited, row, col, {r, c}), islands + 1}
            end
        end
    end
    |> elem(1)
  end

  defp scan_island(ocean, visited, max_row, max_col, point) do
    if MapSet.member?(visited, point) or Map.get(ocean, point) == ?0 do
      visited
    else
      @move_steps
      |> Stream.map(&move(point, &1))
      |> Stream.filter(&in_bound(max_row, max_col, &1))
      |> Enum.reduce(
        MapSet.put(visited, point),
        fn p, v -> scan_island(ocean, v, max_row, max_col, p) end
      )
    end
  end

  defp move({r, c}, {vr, vc}), do: {r + vr, c + vc}
  defp in_bound(row, col, {r, c}), do: not (r < 0 or r >= row or c < 0 or c >= col)

  defp to_map([], row, col, map), do: {row, col, map}
  defp to_map([[x]], row, col, map), do: {row + 1, col + 1, Map.put(map, {row, col}, x)}
  defp to_map([[] | rest], row, _col, map), do: to_map(rest, row + 1, 0, map)

  defp to_map([[x | r_rest] | rest], row, col, map),
    do: to_map([r_rest | rest], row, col + 1, Map.put(map, {row, col}, x))
end
 
Sửa lần cuối:
Trạng thái
Không mở để trả lời thêm.

Thống kê chủ đề

Ngày tạo
_Gia_Cat_Luong_,
Người trả lời cuối
Vipluckystar,
Trả lời
17.755
Lượt xem
1.212.693
Quay lại
Lên đầu trang