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.
Bác ơi, bác đăng đồ premium T.T chụp cho ae xem vs bác
Chụp cũng có code đc đâu fen, mua premium đi học cho ngon, đang sales
osCpCsi.gif


via theNEXTvoz for iPhone
 
Đề bài hnay như cc :ah: thì ra cần phải học cái eulerian path.
Biết là xài graph rồi mà bắt học thêm cái này nữa thì bó tay :canny: mãi ko nghĩ ra cách tìm được cái điểm bắt đầu cái tour. Nhưng mà cũng học thêm được tí kiến thức mới.
 
Sửa lần cuối:
Đề bài hnay như cc :ah: thì ra cần phải học cái eulerian path.
Biết là xài graph rồi mà bắt học thêm cái này nữa thì bó tay :canny: mãi ko nghĩ ra cách tìm được cái điểm bắt đầu cái tour. Nhưng mà cũng học thêm được tí kiến thức mới.
công nhận chả có gì đặc sắc ngoài việc phải biết cái eulerian kia, anh em đọc sol luôn cho lành chứ ngồi ngâm phí time.
 
E nộp bài :ah:
Python:
class Solution:

    def validArrangement(self, pairs: List[List[int]]) -> List[List[int]]:
        adj = defaultdict(list)
        in_deg = Counter()
        out_deg = Counter()

        reversed_path = []

        def dfs(u):
            while len(adj[u]):
                v = adj[u].pop()
                dfs(v)
                reversed_path.append([u, v])

        for u, v in pairs:
            adj[u].append(v)
            out_deg[u] += 1
            in_deg[v] += 1
        
        s = next(iter(out_deg))
        for u in out_deg:
            if in_deg[u] < out_deg[u]:
                s = u

        dfs(s)

        return reversed_path[::-1]
 
JavaScript:
var validArrangement = function (pairs) {
    const edge = {}, deg = {}, chain = [];
    for (const [s, e] of pairs) {
        (edge[s] ??= []).push(e);
        deg[s] = (deg[s] ?? 0) + 1;
        deg[e] = (deg[e] ?? 0) - 1;
        if (!deg[s]) {
            delete deg[s];
        }
        if (!deg[e]) {
            delete deg[e];
        }
    }
    const go = i => {
        while (edge[i]?.length > 0) {
            const j = edge[i].pop();
            go(j);
        }
        chain.push(i);
    };
    let { '1': s, '-1': e } = _.invert(deg);
    go(s >= 0 ? Number(s) : pairs[0][0]);
    const ans = [];
    for (let i = chain.length - 2; i >= 0; i--) {
        ans.push([chain[i + 1], chain[i]]);
    }
    return ans;
};
 
LC 2097 Java
Java:
class Solution {
    public int[][] validArrangement(int[][] pairs) {
        int n = pairs.length, rs[][] = new int[n][2];
        if (n <= 1) return pairs;
        var hml = new HashMap<Integer, List<Integer>>();
        var hm = new HashMap<Integer, Integer>();
        for (var p : pairs) {
            hml.computeIfAbsent(p[0], k -> new ArrayList<>()).add(p[1]);
            hm.merge(p[0], 1, Integer::sum);
            hm.merge(p[1], -1, Integer::sum);
        }
        var beg = pairs[0][0];
        for (var e : hm.entrySet()) {
            if (e.getValue() == 1) {
                beg = e.getKey();
                break;
            }
        }
        var st = new ArrayDeque<Integer>();
        st.push(beg);
        var l = new ArrayList<Integer>();
        while (!st.isEmpty()) {
            int k = st.peek();
            if (hml.containsKey(k) && !hml.get(k).isEmpty()) { st.push(hml.get(k).remove(hml.get(k).size() - 1)); }
            else { l.add(st.pop()); }
        }
        for (int i = 0; i < n; i++) rs[i] = new int[] { l.get(n - i), l.get(n - 1 - i) };
        return rs;
    }
}
 
Sửa lần cuối:
Vì khi bác reach tới 1 điểm neighbor thì newCost sẽ là cost + 1 hoặc là grid[neighborX][neighborY] + waitime, vì process theo PQ nên lúc nào access điểm neighbor đó cũng là optimal nên chỉ cần track visited là đc bác, k thì cứ xài Dijkstra bt là đc.

via theNEXTvoz for iPhone
sau khi e ngẫm lại thì những bài nào cần relax mới cần thêm cái dist đó, còn không chỉ cần track visited, vì lần đầu nó được thêm vào queue/visited thì nó auto là optimal r, theo e thấy thì điều kiện để relax ko xảy ra với các bài đồ thị dạng grid này nhưng lại k chứng minh được :v nên chắc e xài pattern auto dist luôn.
 
sau khi e ngẫm lại thì những bài nào cần relax mới cần thêm cái dist đó, còn không chỉ cần track visited, vì lần đầu nó được thêm vào queue/visited thì nó auto là optimal r, theo e thấy thì điều kiện để relax ko xảy ra với các bài đồ thị dạng grid này nhưng lại k chứng minh được :v nên chắc e xài pattern auto dist luôn.
Đồ thị nào nó chả chạy được, nói chung là:
  • heap + relax O((V+E)logV)
  • heap + visited O((V+E)logV)
  • queue + relax O(V^2 + E)
, một cách bẩn hơn là dùng chính graph làm visited, oánh dấu nó -1, ko cần dùng thêm cái biến visited hay dist
uxby0Nl.gif

Python:
class Solution:
    def minimumTime(self, grid: List[List[int]]) -> int:
        if grid[0][1] > 1 and grid[1][0] > 1:
            return -1

        m, n, heap  = len(grid), len(grid[0]), [(0, 0, 0)]
     
        while heap:
            dis, x, y = heappop(heap)
            if (x, y) == (m - 1, n - 1): return dis
            for xx, yy in [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]:
                if m > xx > -1 < yy < n and grid[xx][yy] != -1:
                    heappush(heap, (dis + max(0, (grid[xx][yy] - dis) & ~1) + 1, xx, yy))
                    grid[xx][yy] = -1
 
Python:
class Solution:
    def validArrangement(self, pairs: List[List[int]]) -> List[List[int]]:
        adj = defaultdict(list)
        outDeg, inDeg = defaultdict(int), defaultdict(int)

        for u, v in pairs:
            adj[u].append(v)
            outDeg[u] += 1
            inDeg[v] += 1
        
        stack = []
        for u in adj:
            if inDeg[u] == outDeg[u] - 1:
                stack.append(u)
                break
        if not stack:
            stack.append(pairs[0][0])

        vertexes = []
        while stack:
            u = stack[-1]
            if outDeg[u] == 0:
                vertexes.append(u)
                stack.pop()
            else:
                stack.append(adj[u][outDeg[u] - 1])
                outDeg[u] -= 1
                    
        return [[u, v] for (u, v) in zip(vertexes[:0:-1], vertexes[-2::-1])]
 
Đề bài hnay như cc :ah: thì ra cần phải học cái eulerian path.
Biết là xài graph rồi mà bắt học thêm cái này nữa thì bó tay :canny: mãi ko nghĩ ra cách tìm được cái điểm bắt đầu cái tour. Nhưng mà cũng học thêm được tí kiến thức mới.
điểm bắt đầu tour thì số bậc vào sẽ nhở hơn số bậc ra. nếu trường hợp ko tìm được thì nghĩa là tồn tại chu trình -> chọn điểm nào cũng được. đụng tời graph thường phải lôi lại sách, blog coi. chứ quên gần hết r :shame:
 
điểm bắt đầu tour thì số bậc vào sẽ nhở hơn số bậc ra. nếu trường hợp ko tìm được thì nghĩa là tồn tại chu trình -> chọn điểm nào cũng được. đụng tời graph thường phải lôi lại sách, blog coi. chứ quên gần hết r :shame:
cái phần này e nhìn ra nhanh lắm nhưng vẫn ko giải dc, dna ít xiu
CY6m3Lt.png
cấn chỗ nếu gặp phải cái tail sớm ko biết quay chọn cái khác ntn
chudNpp.png
 
:eek: Toang vl vừa ngồi làm một bài leetcode easy mà mình làm vòng vèo vcl.Đi làm 05 năm rồi chả đụng tới tí thuật nào quên cmn hết rồi sợ vãi. Có nên mua premium ko các fency.
 
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.215.557
Quay lại
Lên đầu trang