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ài này giải l < r là đúng rồi bác :D

https://leetcode.com/problems/time-based-key-value-store/description/
Bác thử giải bài này với template kia xem. Xưa giờ mình toàn xài c# để kiếm ăn thôi nên lúc nào cũng giải bằng C# :D
Hôm qua bài koko này xem NeetCode nó viết solution này thì pass test case mà mình convert qua C# lại chỉ pass 124/125
Python:
View on Github
class Solution:
    def minEatingSpeed(self, piles: List[int], h: int) -> int:
        l, r = 1, max(piles)
        res = max(piles)

        while l <= r:
            k = (l + r) // 2

            totalTime = 0
            for p in piles:
                totalTime += math.ceil(p / k)
            if totalTime <= h:
                res = min(res, k)
                r = k - 1
            else:
                l = k + 1
        return res
Bài key-value kia cũng dùng l < r được mà thím ơi. E vừa mới ăn xong giờ mới gửi lại đc:D
JavaScript:
type Pair = [number, string];
class TimeMap {
    map: Map<string, Pair[]>
    constructor() {
        this.map = new Map();
    }

    set(key: string, value: string, timestamp: number): void {
        if (!this.map.has(key)) {
            this.map.set(key, []);
        }
        const val = this.map.get(key);
        val.push([timestamp, value])
    }

    get(key: string, timestamp: number): string {
        if (!this.map.has(key)) return '';
        if (timestamp < this.map.get(key)[0][0]) return ''
        let l = 0, r = this.map.get(key).length;
        while (l < r) {
            let m = (l + r) >> 1;
            if (this.map.get(key)[m][0] > timestamp) {
                r = m;
            } else {
                l = m + 1;
            }
        }

        if (r === 0) {
            return "";
        }

        return this.map.get(key)[r - 1][1];
    }
}

/**
 * Your TimeMap object will be instantiated and called as such:
 * var obj = new TimeMap()
 * obj.set(key,value,timestamp)
 * var param_2 = obj.get(key,timestamp)
 */
Còn về cái chuyển từ python sang C# mà bị lỗi thì thím thử xem có liên quan gì đến data type hay ko
OG0lsXv.png
 
Không liên quan tới daily challenge.

Sau khi ngồi làm cái topic binary search bị cái low high hành cho ra bã mấy hôm nay thì mới mò lên đọc cách tìm boundary của 1 pro Leetcode mới biết cách tìm low high cho đúng với bài toán binary search, lên share cho anh em phát :ah:

Thường binary search sẽ có 2 trường hợp, left = 0, right = array.Length - 1, và bên trong while query thì sẽ xảy ra 2 trường hợp while(left < right) và while(left <= right). Và thường lúc làm sẽ bị confused là chọn boundary nào cho hợp lí với từng bài toán. Thì cách chọn là thế này

1) Chọn low < high khi ko muốn trả kết quả về sau khi thực hiện binary search. Lúc đấy bên trong sẽ là high = mid và low = mid + 1
2) Chọn low <= high khi kết quả search ở ngay trong lúc binary search. Lúc đấy high = mid -1 và low = mid -1
Ví dụ như 2 bài này
https://leetcode.com/problems/koko-eating-bananas/submissions/
Nếu chọn low <= high thì edge case sẽ tùm lum vì kết quả cuối cùng nó phải được tính sau khi binary search xong. Nên chọn low < high
C#:
public class Solution {
    public int MinEatingSpeed(int[] piles, int h)
    {
        int left = 1;
        int right = piles.Max();
        var res = right;
        while (left < right)
        {
            int mid= (left + right) / 2;
            int totalTime = 0;

            foreach (int p in piles)
            {
                totalTime += (int)Math.Ceiling((double)p / mid);
            }

            if (totalTime <= h)
            {
                right = mid;
            }
            else
            {
                left = mid + 1 ;
            }
        }

        return left;
    }
}

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/submissions/
C#:
public class Solution {
    public int SingleNonDuplicate(int[] nums) {
        var left = 0;
        var right = nums.Length - 1;
        while(left < right)
        {
            var mid = (left + right)/2;
            if (mid % 2 == 1) mid--;
        }

        return -1;
    }
}

Ví dụ về low <= high
https://leetcode.com/problems/search-in-rotated-sorted-array/editorial/

Mấy nay giải binary search cứ bị edge case tùm lum mà ko hiểu sao, may mò lên đọc discussion thì mới biết lí do tại sao sai, mừng quá cuối cùng cũng ăn được binary search chạy lên share cho anh em đang thắc mắc phát :ah:
Source
https://leetcode.com/problems/single-element-in-a-sorted-array/editorial/comments/670414
C++:
while(l<=r)
    {
        int m=(l+r)/2;
        if(ck(m))
        {
            l=m+1;
        }
        else
        {
            r=m-1;
        }
    }
    return l-1;
:sure:
 
Bài key-value kia cũng dùng l < r được mà thím ơi. E vừa mới ăn xong giờ mới gửi lại đc:D
JavaScript:
type Pair = [number, string];
class TimeMap {
    map: Map<string, Pair[]>
    constructor() {
        this.map = new Map();
    }

    set(key: string, value: string, timestamp: number): void {
        if (!this.map.has(key)) {
            this.map.set(key, []);
        }
        const val = this.map.get(key);
        val.push([timestamp, value])
    }

    get(key: string, timestamp: number): string {
        if (!this.map.has(key)) return '';
        if (timestamp < this.map.get(key)[0][0]) return ''
        let l = 0, r = this.map.get(key).length;
        while (l < r) {
            let m = (l + r) >> 1;
            if (this.map.get(key)[m][0] > timestamp) {
                r = m;
            } else {
                l = m + 1;
            }
        }

        if (r === 0) {
            return "";
        }

        return this.map.get(key)[r - 1][1];
    }
}

/**
 * Your TimeMap object will be instantiated and called as such:
 * var obj = new TimeMap()
 * obj.set(key,value,timestamp)
 * var param_2 = obj.get(key,timestamp)
 */
Còn về cái chuyển từ python sang C# mà bị lỗi thì thím thử xem có liên quan gì đến data type hay ko
OG0lsXv.png
Bài này sao lại chọn right = Length thế bác ơi. Mình bị khó chỗ đoạn này mình nhìn ko ra lí do nên làm low < right nó không đúng :too_sad:

Mình chuyển qua với lại data type đúng hết rồi vẫn ko được, lúc đầu mình nghĩ do Ceiling mà cũng ko đúng, vứt cho ChatGpt nó convert cũng ko ra mà phải chuyển lại về low < high :sweat:

via theNEXTvoz for iPhone
 
Bài này sao lại chọn right = Length thế bác ơi. Mình bị khó chỗ đoạn này mình nhìn ko ra lí do nên làm low < right nó không đúng :too_sad:

Mình chuyển qua với lại data type đúng hết rồi vẫn ko được, lúc đầu mình nghĩ do Ceiling mà cũng ko đúng, vứt cho ChatGpt nó convert cũng ko ra mà phải chuyển lại về low < high :sweat:

via theNEXTvoz for iPhone
Bởi vì trong đề nó có câu này đó thím (ở phần constraint)
All the timestamps timestamp of set are strictly increasing.
Value của mỗi 1 key trong hashmap đều là 1 sorted array rồi thím. Mình implement binary search trên chính cái array đó thôi!
 
Tôi ko nghĩ ra, nhưng theo tôi là nó cũng ko khó để nhận ra với trình độ của các vozer khác
lSZbzhV.png
Nó khó ở việc tính ra threadhold để mà dừng cơ bác. Cho dù chứng minh được hàm dp nó hội tụ về 1, mà không tính được k là bao nhiêu, vd nếu làm như này
thì cũng bị quy về O(N^2) thôi.

Ps: em đang nói việc đi phỏng vấn gặp phải bài này nhé, còn contest hay online judge thì không cần bàn
 
Sửa lần cuối:
Nó khó ở việc tính ra threadhold để mà dừng cơ bác. Cho dù chứng minh được hàm dp nó hội tụ về 1, mà không tính được k là bao nhiêu, vd nếu làm như này

thì cũng bị quy về O(N^2) thôi.

Ps: em đang nói việc đi phỏng vấn gặp phải bài này nhé, còn contest hay online judge thì không cần bàn
Take it easy, đi pv gặp nghĩa là cty nó ko muốn tuyển người thế thôi fence :sexy_girl: lăn tăn gì ko apply cty khác

via theNEXTvoz for iPhone
 
Nó khó ở việc tính ra threadhold để mà dừng cơ bác. Cho dù chứng minh được hàm dp nó hội tụ về 1, mà không tính được k là bao nhiêu, vd nếu làm như này

thì cũng bị quy về O(N^2) thôi.

Ps: em đang nói việc đi phỏng vấn gặp phải bài này nhé, còn contest hay online judge thì không cần bàn
em có đọc mấy solution tính ra N để return luôn, mà mỗi thằng tính ra 1 số N khác nhau kk. Đến lúc đọc editorial mới thấy nó làm kiểu kia:byebye:

via theNEXTvoz for iPhone
 
Bài hôm nay là 1 dạng cơ bản trong DP with string template: Longest Common Subsequence. Ae nào chưa làm đc thì tìm hiểu 2 bài này trước :beauty:
Longest Common Subsequence
Edit distance
JavaScript:
function minimumDeleteSum(s1: string, s2: string): number {
    const m = s1.length, n = s2.length;
    const dp = new Array(m + 1).fill(0).map(e => Array(n + 1).fill(0));

    for (let i = 1; i <= m; i++) {
        dp[i][0] = dp[i - 1][0] + s1.charCodeAt(i - 1);
    }
    for (let j = 1; j <= n; j++) {
        dp[0][j] = dp[0][j - 1] + s2.charCodeAt(j - 1);
    }

    for (let i = 1; i <= m; i++) {
        for (let j = 1; j <= n; j++) {
            if (s1[i - 1] === s2[j - 1]) dp[i][j] = dp[i - 1][j - 1];
            else {
                dp[i][j] = Math.min(s1.charCodeAt(i - 1) + dp[i - 1][j],
                    s2.charCodeAt(j - 1) + dp[i][j - 1])
            }
        }
    }
    return dp[m][n]

};
 
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.969
Quay lại
Lên đầu trang