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.
JavaScript:
/**
 * @param {number} a
 * @param {number} b
 * @param {number} c
 * @return {string}
 */
var longestDiverseString = function (a, b, c) {
    const pq = new MaxPriorityQueue();
    pq.enqueue('a', a);
    pq.enqueue('b', b);
    pq.enqueue('c', c);
    let ans = '';
    while (true) {
        let { element: U, priority: u } = pq.dequeue(),
            { element: V, priority: v } = pq.dequeue();
        if (u > 0 && ans.slice(-2) !== U.repeat(2)) {
            ans += U;
            u--;
        } else if (v > 0 && ans.slice(-2) !== V.repeat(2)) {
            ans += V;
            v--;
        } else {
            break;
        }
        pq.enqueue(U, u);
        pq.enqueue(V, v);
    }
    return ans;
};
 
Nếu không thể sử dụng thằng dư dả nhất, thì ráng tiết kiệm.

Python:
import heapq


class Solution:
    def longestDiverseString(self, a: int, b: int, c: int) -> str:
        pq = []
        heapq.heappush(pq, (-a, "a"))
        heapq.heappush(pq, (-b, "b"))
        heapq.heappush(pq, (-c, "c"))
        res = [""]
        while pq:
            cnt, char = heapq.heappop(pq)
            if res and res[-1] == char:
                print("I", res, cnt, char, pq)
                if not pq:
                    break
                cnt2, char2 = heapq.heappop(pq)
                m = min(-cnt2, 2)
                # If only two left, take one
                if m == 2 and pq:
                    m -= 1
                cnt2 += m
                while m:
                    res.append(char2)
                    m -= 1
                if cnt2 < 0:
                    heapq.heappush(pq, (cnt2, char2))
                if cnt < 0:
                    heapq.heappush(pq, (cnt, char))
            else:
                print("E", res, cnt, char, pq)
                m = min(-cnt, 2)
                cnt += m
                while m:
                    res.append(char)
                    m -= 1
                if cnt < 0:
                    heapq.heappush(pq, (cnt, char))
        return "".join(res)


if __name__ == "__main__":
    s = Solution()
    print(s.longestDiverseString(1, 1, 7))
 
@freedom.9 sao gạch em vậy sếp =(( mà sếp come up với cái pq kiểu gì vậy, nhìn đâm zô luôn backtrack bể mẹ nó đầu :sweat:
Gạch vì tội làm backtrack, phải quan sát xem có pattern gì mới làm được backtrack chứ chưa chứng minh được là nó đúng hoặc gần đúng thì sao mà nhảy vào implement liền :ah:
Kinh nghiệm thôi fence, ví dụ như có 5A và 2B và 1 C chả hạn thì cách xếp thoả phải là xếp AABAABCA, rõ ràng ở mỗi index thì phải greedily pick cái thằng có frequency cao nhất rồi vì để có 1 valid string thì sẽ phải tìm cách dùng được nhiều thằng có frequency cao nhất trước thì kết quả nó sẽ optimal ở mỗi step. Làm nhiều dạng bài là sẽ quen thôi chứ ko thì ngồi ngó là dễ hiểu.
Ví dụ như bài này cũng tương tự
 
Gạch vì tội làm backtrack, phải quan sát xem có pattern gì mới làm được backtrack chứ chưa chứng minh được là nó đúng hoặc gần đúng thì sao mà nhảy vào implement liền :ah:
Kinh nghiệm thôi fence, ví dụ như có 5A và 2B và 1 C chả hạn thì cách xếp thoả phải là xếp AABAABCA, rõ ràng ở mỗi index thì phải greedily pick cái thằng có frequency cao nhất rồi vì để có 1 valid string thì sẽ phải tìm cách dùng được nhiều thằng có frequency cao nhất trước thì kết quả nó sẽ optimal ở mỗi step. Làm nhiều dạng bài là sẽ quen thôi chứ ko thì ngồi ngó là dễ hiểu.
Ví dụ như bài này cũng tương tự
Bài này em đọc đề hơi ẩu, kéo xuống thấy cons < 100 nữa nên đâm luôn backtrack xong dính MLE, lúc code cũng ngờ ngợ là sai sai rồi nhưng vẫn nghĩ là cons thấp nên chắc vẫn pass đc :sweat:
 
Bài này em đọc đề hơi ẩu, kéo xuống thấy cons < 100 nữa nên đâm luôn backtrack xong dính MLE, lúc code cũng ngờ ngợ là sai sai rồi nhưng vẫn nghĩ là cons thấp nên chắc vẫn pass đc :sweat:
Thường sẽ nháp ra rồi đặt câu hỏi, ví dụ có 4A 1B thì phải đặt A trước vì nếu đặt B trước sẽ ko đủ kí tự để cắt cái A ra thành 1 valid string, có cái này rồi code greedily luôn 10ph là xong 1 bài :ah:
Mà greedy thường là phần khó nhất trong leetcode cmnr nên fence làm ko ra thì cũng bt thôi :sweat:
Còn backtrack thì fence chỉ nên nghĩ tới khi đề nó cho cái constrain nào n<15 thôi
via theNEXTvoz for iPhone
 
Thường sẽ nháp ra rồi đặt câu hỏi, ví dụ có 4A 1B thì phải đặt A trước vì nếu đặt B trước sẽ ko đủ kí tự để cắt cái A ra thành 1 valid string, có cái này rồi code greedily luôn 10ph là xong 1 bài :ah:
Mà greedy thường là phần khó nhất trong leetcode cmnr nên fence làm ko ra thì cũng bt thôi :sweat:
Còn backtrack thì fence chỉ nên nghĩ tới khi đề nó cho cái constrain nào n<15 thôi
via theNEXTvoz for iPhone
Đoạn này thì đúng kiểu non xanh ngây thơ + ẩu, còn biết pq rồi thì lại impl được ngay, haizz, thôi tự gạch cho nhớ :beat_brick:
 
Python:
class Solution:
    def longestDiverseString(self, a: int, b: int, c: int) -> str:
        result = ""

        maxOccur = max(a, b, c)
        if maxOccur == a:
            if a >= 2:
                result += 'a'
                a -= 1
            result += 'a'
            a -= 1
        elif maxOccur == b:
            if b >= 2:
                result += 'b'
                b -= 1
            result += 'b'
            b -= 1
        else:
            if c >= 2:
                result += 'c'
                c -= 1
            result += 'c'
            c -= 1
        
        while True:
            prev_len = len(result)
            if len(result) == 1:
                maxOccur = max(a, b, c)
                if maxOccur == 0:
                    break
                if maxOccur == a:
                    result += 'a'
                    a -= 1
                elif maxOccur == b:
                    result += 'b'
                    b -= 1
                else:
                    result += 'c'
                    c -= 1
                continue

            if result[-2:] == 'aa':
                maxOccur = max(b, c)
                if maxOccur == 0:
                    break
                if b > c:
                    result += 'b'
                    b -= 1
                else:
                    result += 'c'
                    c -= 1
            elif result[-2:] == 'bb':
                maxOccur = max(a, c)
                if maxOccur == 0:
                    break
                if a > c:
                    result += 'a'
                    a -= 1
                else:
                    result += 'c'
                    c -= 1
            elif result[-2:] == 'cc':
                maxOccur = max(a, b)
                if maxOccur == 0:
                    break
                if a > b:
                    result += 'a'
                    a -= 1
                else:
                    result += 'b'
                    b -= 1
            else:
                maxOccur = max(a, b, c)
                if maxOccur == 0:
                    break
                if maxOccur == a:
                    result += 'a'
                    a -= 1
                elif maxOccur == b:
                    result += 'b'
                    b -= 1
                else:
                    result += 'c'
                    c -= 1
            
            if len(result) == prev_len:
                break
        return result
if else code dơ :shame:
 
Python:
class Solution:
    def longestDiverseString(self, a: int, b: int, c: int) -> str:
        result = ""

        maxOccur = max(a, b, c)
        if maxOccur == a:
            if a >= 2:
                result += 'a'
                a -= 1
            result += 'a'
            a -= 1
        elif maxOccur == b:
            if b >= 2:
                result += 'b'
                b -= 1
            result += 'b'
            b -= 1
        else:
            if c >= 2:
                result += 'c'
                c -= 1
            result += 'c'
            c -= 1
        
        while True:
            prev_len = len(result)
            if len(result) == 1:
                maxOccur = max(a, b, c)
                if maxOccur == 0:
                    break
                if maxOccur == a:
                    result += 'a'
                    a -= 1
                elif maxOccur == b:
                    result += 'b'
                    b -= 1
                else:
                    result += 'c'
                    c -= 1
                continue

            if result[-2:] == 'aa':
                maxOccur = max(b, c)
                if maxOccur == 0:
                    break
                if b > c:
                    result += 'b'
                    b -= 1
                else:
                    result += 'c'
                    c -= 1
            elif result[-2:] == 'bb':
                maxOccur = max(a, c)
                if maxOccur == 0:
                    break
                if a > c:
                    result += 'a'
                    a -= 1
                else:
                    result += 'c'
                    c -= 1
            elif result[-2:] == 'cc':
                maxOccur = max(a, b)
                if maxOccur == 0:
                    break
                if a > b:
                    result += 'a'
                    a -= 1
                else:
                    result += 'b'
                    b -= 1
            else:
                maxOccur = max(a, b, c)
                if maxOccur == 0:
                    break
                if maxOccur == a:
                    result += 'a'
                    a -= 1
                elif maxOccur == b:
                    result += 'b'
                    b -= 1
                else:
                    result += 'c'
                    c -= 1
            
            if len(result) == prev_len:
                break
        return result
if else code dơ :shame:
Bắt được thêm 1 outsource Nhật Bổn này @seastar

via theNEXTvoz for iPhone
 
Java:
class Solution {
    public String longestDiverseString(int a, int b, int c) {
        Map<Character, Integer> map = new HashMap<>();
        if (a > 0) {
            map.put('a', a);
        }
        if (b > 0) {
            map.put('b', b);
        }
        if (c > 0) {
            map.put('c', c);
        }
        PriorityQueue<Map.Entry<Character, Integer>> pq = new PriorityQueue<>((e1, e2) -> e2.getValue() - e1.getValue());
        for (Map.Entry<Character, Integer> entry : map.entrySet()) pq.offer(entry);
        StringBuilder sb = new StringBuilder();
        while (!pq.isEmpty()) {
            Map.Entry<Character, Integer> entry = pq.poll();
            char character = entry.getKey();
            int count = entry.getValue();
            int len = sb.length();
            if (len >= 2 && sb.charAt(len - 1) == character && sb.charAt(len - 2) == character) {
                if (pq.isEmpty()) break;
                Map.Entry<Character, Integer> tmp = pq.poll();
                sb.append(tmp.getKey());
                if (tmp.getValue() > 1) pq.offer(Map.entry(tmp.getKey(), tmp.getValue() - 1));
            } else {
                count--;
                sb.append(character);
            }
            if (count > 0) {
                pq.offer(Map.entry(character, count));
            }          
        }
        return sb.toString();      
    }
}
 
Python:
class Solution:
    def longestDiverseString(self, a: int, b: int, c: int) -> str:
        q = []
        if a != 0:
            heapq.heappush(q, (-a, 'a'))
        if b != 0:
            heapq.heappush(q, (-b, 'b'))
        if c != 0:
            heapq.heappush(q, (-c, 'c'))
        ans = ""
        while q:
            ct, c = heapq.heappop(q)
            if len(ans) >= 2 and ans[len(ans) - 2:] == c + c:
                if q:
                    ct2, c2 = heapq.heappop(q) 
                    ans += c2
                    if ct2 + 1 != 0:
                        heapq.heappush(q,(ct2 + 1, c2))
                    heapq.heappush(q,(ct, c))
                else:
                    return ans
            else:
                
                ans += c
                if ct + 1 != 0:
                    heapq.heappush(q,(ct + 1, c))

        return ans
 
Java:
class Solution {
    class Pair {
        char character;
        int count;
        Pair(char character, int count) {
            this.character = character;
            this.count = count;
        }
    }
    public String longestDiverseString(int a, int b, int c) {
        PriorityQueue<Pair> pq = new PriorityQueue<>((o1,o2)->o2.count - o1.count);
        if(a > 0) pq.offer(new Pair('a', a));
        if(b > 0) pq.offer(new Pair('b', b));
        if(c > 0) pq.offer(new Pair('c', c));
        StringBuilder ans = new StringBuilder();
        while (!pq.isEmpty()) {
            Pair p = pq.poll();
            int count = p.count;
            char character = p.character;
            if (
                ans.length() > 1 &&
                ans.charAt(ans.length() - 1) == p.character &&
                ans.charAt(ans.length() - 2) == p.character
            ) {
                if (pq.isEmpty()) break;

                Pair temp = pq.poll();
                ans.append(temp.character);
                if (temp.count - 1 > 0) {
                    pq.add(new Pair(temp.character,temp.count - 1));
                }
            } else {
                count--;
                ans.append(character);
            }
            if (count > 0) {
                pq.add(new Pair(character,count));
            }
        }
        return ans.toString();
    }
}
 
Java:
class Solution {
    public String longestDiverseString(int a, int b, int c) {
        StringBuilder sb = new StringBuilder();
        //map
        char[] map = new char[4];
        map[1]='a';
        map[2]='b';
        map[3]='c';
        PriorityQueue<int[]> pq = new PriorityQueue<>((x,y)->{
            return y[0]-x[0];
        });
        if(a>0) pq.add(new int[]{a,1});
        if(b>0) pq.add(new int[]{b,2});
        if(c>0) pq.add(new int[]{c,3});
        int[] max = new int[2];
        int[] sec = new int[2];

        while(!pq.isEmpty()){
            if(pq.size()==1){
                max = pq.poll();//max[0] = freq, max[1]= index map
                if(max[0]>1){
                    sb.append(map[max[1]]); max[0]--;
                }
                sb.append(map[max[1]]); max[0]--;
            }
            else{
                max = pq.poll();
                sec = pq.poll();
              
                if(max[0]>sec[0]){
                    sb.append(map[max[1]]); max[0]--;
                }
                sb.append(map[max[1]]); max[0]--;
                sb.append(map[sec[1]]); sec[0]--;
                if(sec[0]>0) pq.add(sec);
                if(max[0]>0) pq.add(max);
              
            }
        }
        return sb.toString();
    }
}
 
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.213.602
Quay lại
Lên đầu trang