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.
Nhìn vào đề bài thì sẽ thấy được, cứ mỗi 1 lần sẽ lấy số ở đầu hoặc số ở cuối, lặp đi lặp lại và sử dụng kết quả của thằng đứng trước -> Dấu hiệu của đệ quy.
Cái mình cần tính được là trong thời gian chạy đệ quy, sẽ có những hàm đệ quy đã được tính rồi nhưng vẫn phải tính lại -> tạo cache để lưu -> cache ở đây có thể là hashmap/array.
Với bài thế này thì dễ dàng nhìn được nếu độ dài array là số chẵn thì luôn luôn có thể thắng nên thêm cái điều kiện if(n % 2 === 0) return true;
JavaScript:
function PredictTheWinner(nums: number[]): boolean {
    const n = nums.length;
    if (n % 2 === 0 || n === 1) return true;
    const memo = new Array(n).fill(0).map(e => Array(n).fill(-1))
    const go = (l: number, r: number): number => {
        if (memo[l][r] !== -1) return memo[l][r];
        if (l === r) return nums[l]
        const lScore = nums[l] - go(l + 1, r)
        const rScore = nums[r] - go(l, r-1)
        memo[l][r] = Math.max(lScore, rScore)
        return memo[l][r]
    }
    return go(0, n-1) >= 0;
};
Mấy bài game theory, cờ kiếc này nọ có vẻ toàn là dùng DP hết :go:
Tai sao do dai array la so chan thi thang 1 luon thang nhi?
 
lý thuyết trò chơi, làm hàm dp đơn giản thôi
Python:
class Solution:
    def PredictTheWinner(self, nums: List[int]):
        @cache
        def solve(i, j):
            if i == j: return nums[i]
            popDau = nums[i] - solve(i+1, j)
            popDit = nums[j] - solve(i, j-1)
            return max(popDau, popDit)
        return solve(0, len(nums)-1) >= 0
 
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
 
Sửa lần cuối:
* Có xem đáp án

Mã:
var soupServings = function(n) {
    n = Math.ceil(n / 25);
    if (n > 1000) {
        return 1;
    }
    const memo = [];
    const go = (i, j) => memo[i * 1000 + j] ??= (() => {
        if (i <= 0) {
            return j <= 0 ? .5 : 1;
        }
        if (j <= 0) {
            return 0;
        }
        return (go(i-4, j) + go(i-3, j-1) + go(i-2, j-2) + go(i-1, j-3)) / 4;
    })();
    return go(n, n);
};
 
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
Nói về Cửu âm chân kinh cho Binary Search thì chia sẻ cho thím và 1 số thím chưa đọc cái này. :byebye:

https://leetcode.com/discuss/genera...-Binary-Search-Template.-Solved-many-problems

via theNEXTvoz for iPhone
 
C++:
class Solution {
   public:
    double soupServings(int n) {
        if (n >= 4825) return 1.0;
        return recurse((n + 24) / 25, (n + 24) / 25);
    }
   private:
    double recurse(int a, int b) {
        if (a <= 0 && b <= 0) return 0.5;
        if (a <= 0) return 1.0;
        if (b <= 0) return 0.0;
        if (memo[a][b] != 0) return memo[a][b];
        return memo[a][b] = 0.25 * (recurse(a - 4, b) +
                                    recurse(a - 3, b - 1) + 
                                    recurse(a - 2, b - 2) +
                                    recurse(a - 1, b - 3));
    }
   private:
    double memo[195][195];
};
 
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
BS kiểu low <= high lấy mid làm ans làm bình thường thôi, nó là cách general và bug free nhất mà bác.
Python:
class Solution:
    def minEatingSpeed(self, piles: List[int], h: int) -> int:
        l = 1
        r = sum(piles)
        ans = 0
        while l <= r:
            m = (l + r) >> 1
            if h >= sum((pile + m - 1)// m for pile in piles):
                ans = m
                r = m - 1
            else:
                l = m + 1
        return ans
 
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
em bổ sung một chút thông tin có thể hữu ích :byebye:
Những bài tìm kiếm nhị phân với số thực thì có thể dùng epsilon để kiểm tra điều kiện thoát vòng lặp, hoặc nếu lười thì có thể dùng for tầm 90 lần là sẽ được kết quả tương đối chính xác (giả sử lo thấp nhất là 0 và hi cao nhất là 1e18, lúc này dif ban đầu của ta sẽ là dif = hi - lo = 1e18, sau mỗi vòng lặp thì dif sẽ giảm đi một nửa, sau 90 vòng lặp thì dif chắc chắn nhỏ hơn 1e-9, độ chênh lệch chặt nhất có thể của một bài mình từng thấy, có thể kiểm tra 1e18 / (2 ^ 90) = 8.0779357e-10 < 1e-9.
 
ghét mấy cái bài xác suất vkl.
Qcg0oqw.jpg
hnay chịu thua, đành đi đọc solution của lee215 :burn_joss_stick:
 
Nói về Cửu âm chân kinh cho Binary Search thì chia sẻ cho thím và 1 số thím chưa đọc cái này. :byebye:

https://leetcode.com/discuss/genera...-Binary-Search-Template.-Solved-many-problems

via theNEXTvoz for iPhone
Cái template này có mấy bài giải ko ra đâu thím, em gặp trong mấy hôm nay tu luyện rồi. Nên mới phải đi tìm chân kinh :too_sad:
Nếu bài toán mà tìm ra giá trị ngay ở trong while thì dùng low < high kiểu gì cũng ăn edge cases nên BS ko có template cụ thể mà phải chọn cách nào hợp lí nhất để 1 phát ăn ngay.

via theNEXTvoz for iPhone
 
Sửa lần cuối:
BS kiểu low <= high lấy mid làm ans làm bình thường thôi, nó là cách general và bug free nhất mà bác.
Python:
class Solution:
    def minEatingSpeed(self, piles: List[int], h: int) -> int:
        l = 1
        r = sum(piles)
        ans = 0
        while l <= r:
            m = (l + r) >> 1
            if h >= sum((pile + m - 1)// m for pile in piles):
                ans = m
                r = m - 1
            else:
                l = m + 1
        return ans
Mình ko hiểu sao bài này viết như này convert qua C# ko pass được hết test case nha bác, mình ngồi loay hoay cả buổi sau phải chuyển về low < high mới pass :sweat::sweat:

via theNEXTvoz for iPhone
 
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
Hình như lo=mid+1. Anw, kinh nghiệm thím giống mình, return trong loop thì dùng <= ko thì <.
Mà thím dùng premium à? Cái link cuối ko xem được

Mình thấy std của c++ toàn dùng < với [lo, hi).

via theNEXTvoz for iPhone
 
Hình như lo=mid+1. Anw, kinh nghiệm thím giống mình, return trong loop thì dùng <= ko thì <.
Mà thím dùng premium à? Cái link cuối ko xem được

Mình thấy std của c++ toàn dùng < với [lo, hi).

via theNEXTvoz for iPhone
À mình viết nhầm, để mình edit.
Mình xài Premium học cho nhanh chứ ko xài premium ko biết luyện tới bao giờ :D
 
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
Xin bài viết gốc với bác

via theNEXTvoz for iPhone
 
Cái template này có mấy bài giải ko ra đâu thím, em gặp trong mấy hôm nay tu luyện rồi. Nên mới phải đi tìm chân kinh :too_sad:
Nếu bài toán mà tìm ra giá trị ngay ở trong while thì dùng low < high kiểu gì cũng ăn edge cases nên BS ko có template cụ thể mà phải chọn cách nào hợp lí nhất để 1 phát ăn ngay.

via theNEXTvoz for iPhone
Cũng ko hẳn đâu thím ơi, nó chỉ là 2 cách implementation khác nhau thôi. Cơ bản chênh lệch 2 cái là ko đáng kể.
low <= high: khi thím muốn return ngay ở trong vòng lặp
low < high: kết lúc vòng lặp trước đã, rồi tính kết quả dựa trên giá trị low-high.
2 cái nó chỉ là implementation khác nhau nhưng kết quả thì ko thay đổi đâu thím.
Ví dụ như bài Koko này em thấy vẫn viết theo được kiểu đó thôi. Em nghĩ là do cái hàm feasible của thím viết thế nào thôi
JGdqgzY.png
Thím thử gửi cho em cái bài nào mà template này fail để e quẩy thử xem kk.
C#:
public class Solution {
    private bool feasible(int[] piles, int m, int h) {
        int total = 0;
        foreach (int pile in piles) {
            total+= (pile + m - 1) / m;
        }
        return total <=h;
    }
    public int MinEatingSpeed(int[] piles, int h) {
        int l = 1, r = piles.Max();
        while (l < r) {
            int m = l + (r - l) / 2;
            if (feasible(piles,m, h)) {
                r = m;
            } else {
                l = m + 1;
            }
        }
        return l;
    }

}
mà đang viết JS/TS sang ngôn ngữ khác viết ngượng tay vãi, data type lỗi toè loe
qZV215Z.png
 
Sửa lần cuối:
Vẫn giải đc mà thím ơi, ví dụ như bài Koko này em thấy vẫn viết theo được kiểu đó thôi. Em nghĩ là do cái hàm feasible của thím viết thế nào thôi
JGdqgzY.png
Thím thử gửi cho em cái bài nào mà template này fail để e quẩy thử xem kk.
C#:
public class Solution {
    private bool feasible(int[] piles, int m, int h) {
        int total = 0;
        foreach (int pile in piles) {
            total+= (pile + m - 1) / m;
        }
        return total <=h;
    }
    public int MinEatingSpeed(int[] piles, int h) {
        int l = 1, r = piles.Max();
        while (l < r) {
            int m = l + (r - l) / 2;
            if (feasible(piles,m, h)) {
                r = m;
            } else {
                l = m + 1;
            }
        }
        return l;
    }

}
mà đang viết JS/TS sang ngôn ngữ khác viết ngượng tay vãi, data type lỗi toè loe
qZV215Z.png
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
 
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.974
Quay lại
Lên đầu trang