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.
Thanks bác,
solution working well (and efficient).

Nếu bác wrap giữa cặp thẻ CODE /CODE nữa là đẹp.
[CODE=Java]
class Solution {
public static void main(String[] args) {}
}
[/CODE]
->
Java:
class Solution {
  public static void main(String[] args) {} 
}
nếu ko có highlight ngôn ngữ Kotlin thì có thể chọn Java (java) hoặc CLike (clike)
cảm ơn bác đỡ góp ý
 
Java:
    class Solution {
        fun countFairPairs(nums: IntArray, lower: Int, upper: Int): Long {
            var ans = 0L
            nums.sort()
            for (i in 0 until nums.lastIndex) {
                val lowerIdx = findLower(i, nums, lower)
                if (lowerIdx == -1) continue
                    
                val upperIdx = findUpper(i, nums, upper)
                if (upperIdx == -1) continue
                if (lowerIdx > upperIdx) continue

                ans += upperIdx - lowerIdx + 1
            }

            return ans
        }

        private fun findLower(i: Int, nums: IntArray, lower: Int): Int {
            var s = i + 1
            var e = nums.lastIndex
            var idx = -1
            while (s <= e) {
                val mid = (s + e) / 2
                if (nums[mid] + nums[i] >= lower) {
                    idx = mid
                    e = mid - 1
                } else {
                    s = mid + 1
                }
            }
            return idx
        }

        private fun findUpper(i: Int, nums: IntArray, upper: Int): Int {
            var s = i + 1
            var e = nums.lastIndex
            var idx = -1
            while (s <= e) {
                val mid = (s + e) / 2
                if (nums[mid] + nums[i] <= upper) {
                    idx = mid
                    s = mid + 1
                } else {
                    e = mid - 1
                }
            }
            return idx
        }

    }
 
Python:
class Solution:
    def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int:
        nums.sort()
        n = len(nums)

        def search(target, l, r):
            while l <= r:
                pivot = l + (r - l) // 2
                
                if nums[pivot] >= target:
                    r = pivot - 1
                else:
                    l = pivot + 1

            return l

        res = 0
        for i in range(n):
            minSatisfy = search(lower - nums[i], i + 1, n - 1)
            maxSatisfy = search(upper - nums[i] + 1, i + 1, n - 1)
            res += maxSatisfy - minSatisfy

        return res
 
Python:
class Solution:
    def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int:
        nums = sorted(nums)
        n = len(nums)
        left, right, greaterThanUpperPairs= 0, n - 1, 0
        while left < right:
            if nums[left] + nums[right] > upper:
                greaterThanUpperPairs += right - left
                right -= 1
            else:
                left += 1
 
        left, right, smallerThanLowerPairs= 0, n - 1, 0
        while left < right:
            if nums[left] + nums[right] >= lower:
                right -= 1
            else:
                smallerThanLowerPairs += right - left
                left += 1

        return (n*(n-1)//2) - (smallerThanLowerPairs + greaterThanUpperPairs)
Python:
class Solution:
    def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int:
        nums = sorted(nums)
        n = len(nums)
        def countPairsLowerThanTarget(target):
            left = 0
            right = n -1
            ans = 0
            while left < right:
                if nums[left] + nums[right] >= target:
                    right -= 1
                else:
                    ans += right - left
                    left += 1

            return ans

        return countPairsLowerThanTarget(upper + 1) - countPairsLowerThanTarget(lower)
Python:
class Solution:
    def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int:
        nums = sorted(nums)
        n = len(nums)
        def bisearch(left, target):
            right = n - 1
            while left <= right:
                mid = left + (right - left)//2
                if nums[mid] >= target:
                    right = mid - 1

                else:
                    left = mid + 1

            return right + 1

        ans = 0
        for i, val in enumerate(nums):
            left = bisearch(i + 1, lower - nums[i])
            right = bisearch(i + 1, upper + 1 - nums[i])
            ans += right - left

        return ans

Cơm thêm cho ae 1 bài counting khá hay, dạo này dấu hiệu tuổi tác rồi làm 1 2 bài medium với hard là đau đầu vcl =((
Thanks bác :love:

Python:
class Solution:
    def countSubarrays(self, nums: List[int], k: int) -> int:
        pos = nums.index(k)
        res = 0
        n = len(nums)

        curr = 0
        countRight = {}
        for i in range(pos + 1, n):
            if nums[i] < k:
                curr -= 1
            if nums[i] > k:
                curr += 1

            if curr == 0 or curr == 1:
                res += 1

            if curr not in countRight:
                countRight[curr] = 0
            countRight[curr] += 1

        curr = 0
        for i in range(pos - 1, -1, -1):
            if nums[i] < k:
                curr -= 1
            if nums[i] > k:
                curr += 1
               
            if curr == 0 or curr == 1:
                res += 1
           
            if -curr in countRight: # left + right = 0
                res += countRight[-curr]
            if 1 - curr in countRight: # left + right = 1
                res += countRight[-curr + 1]

        return res + 1
 
Sửa lần cuối:
Python:
class Solution:
    def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int:
        nums.sort()
        return sum(
            max(bisect_right(nums, upper - num), i + 1) 
            - max(bisect_left(nums, lower - num), i + 1) 
            for i, num in enumerate(nums)
        )
 
Sửa lần cuối:
Bác làm em đau đầu rồi đấy :mad:
C++:
class Solution {
public:
    int countSubarrays(vector<int>& nums, int k) {
        int index = find(nums.begin(), nums.end(), k) - nums.begin();
        unordered_map<int, int> diff_counter;

        for (int i=index+1, diff=0; i<nums.size(); ++i) {
            if (nums[i] < k) {
                --diff;
            } else {
                ++diff;
            }
            ++diff_counter[diff];
        }
        ++diff_counter[0];

        int res = 0;
        for (int i=index, diff = 0; i>=0; --i) {
            if (nums[i] < k) {
                --diff;
            } else if (nums[i] > k) {
                ++diff;
            }
            res += diff_counter[-diff];
            res += diff_counter[-diff+1];
        }

        return res;
    }
};
Thanks bác :love:

Python:
class Solution:
    def countSubarrays(self, nums: List[int], k: int) -> int:
        pos = nums.index(k)
        res = 0
        n = len(nums)

        curr = 0
        countRight = {}
        for i in range(pos + 1, n):
            if nums[i] < k:
                curr -= 1
            if nums[i] > k:
                curr += 1

            if curr == 0 or curr == 1:
                res += 1

            if curr not in countRight:
                countRight[curr] = 0
            countRight[curr] += 1

        curr = 0
        for i in range(pos - 1, -1, -1):
            if nums[i] < k:
                curr -= 1
            if nums[i] > k:
                curr += 1
               
            if curr == 0 or curr == 1:
                res += 1
           
            if -curr in countRight: # left + right = 0
                res += countRight[-curr]
            if 1 - curr in countRight: # left + right = 1
                res += countRight[-curr + 1]

        return res + 1
:beauty::beauty:

via theNEXTvoz for iPhone
 
Hoodie LC thấy mở lại rồi, có ae nào ở HN đặt bao giờ chưa, không biết nó có ship về tận nhà ko nhỉ :ah:
Đặt cái áo với cái khóa nửa năm nay rồi chưa mặc, giờ lượm cái mũ chứ hoodie mang vô che cái áo thì sao
zFNuZTA.gif



via theNEXTvoz for iPhone
 
dùng siêu template cho binary search, đặt right = len(nums) chứ ko phải len(nums)-1 để xử lý trường hợp uppperbound = nums[-1] :ah:
mà sao voz lại quay về theme mặc định của xenforo thế này, hết tiền thuê dev à :ops:

Python:
class Solution:
    def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int:
        nums.sort()
        count = 0
        for i in range(len(nums)):
            low = self.binary_search(nums,i+1,lower-nums[i])
            high = self.binary_search(nums,i+1,upper-nums[i]+1)
            print(low,high)
            count+=high-low
        return count

    def binary_search(self,nums,low,target):
        l,r = low, len(nums)
        while l<r:
            mid = (l+r)//2
            if nums[mid]<target:
                l = mid+1
            else:
                r = mid
        return l
 
C++:
class Solution {
public:
    long long countFairPairs(vector<int>& nums, int lower, int upper) {
        sort(begin(nums), end(nums));
        long long res = 0;
        for (int i = 0; i < nums.size(); ++i) {
            res += distance(
                lower_bound(begin(nums) + i + 1, end(nums), lower - nums[i]),
                upper_bound(begin(nums) + i + 1, end(nums), upper - nums[i])
            );
        }
        return res;
    }
};
 
dùng siêu template cho binary search, đặt right = len(nums) chứ ko phải len(nums)-1 để xử lý trường hợp uppperbound = nums[-1] :ah:
mà sao voz lại quay về theme mặc định của xenforo thế này, hết tiền thuê dev à :ops:

Python:
class Solution:
    def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int:
        nums.sort()
        count = 0
        for i in range(len(nums)):
            low = self.binary_search(nums,i+1,lower-nums[i])
            high = self.binary_search(nums,i+1,upper-nums[i]+1)
            print(low,high)
            count+=high-low
        return count

    def binary_search(self,nums,low,target):
        l,r = low, len(nums)
        while l<r:
            mid = (l+r)//2
            if nums[mid]<target:
                l = mid+1
            else:
                r = mid
        return l
@Cố Trường Ca thằng e tính time complexity On này thì xứng đáng mấy gậy nhỉ
 
Java:
class Solution {
    public int minimizedMaximum(int n, int[] quantities) {
        int l = 0, r = 0;
        for(int quantity : quantities) {
            if(r < quantity) r = quantity;
        }
        while(l <= r) {
            int mid = l + (r - l)/2;
            if(dis(mid, quantities, n)) {
                r = mid - 1;
            } else l = mid + 1;
        }
        return l;
    }
    public boolean dis(int x, int[] q, int n) {
        int type = 0;
        int remain = q[type];
        for(int i = 0; i < n; i++) {
            if(remain <= x) {
                type++;
                if(type == q.length) return true;
                else remain = q[type];
            } else remain -= x;
        }
        return false;
    }
}
Newbie, xin hãy góp ý nhẹ nhàng chứ ko tôy bỏ đấy 8-)
 
Java:
class Solution {
    public int minimizedMaximum(int n, int[] quantities) {
        int maxQuantity = quantities[0];
        for (int quantity : quantities) {
            maxQuantity = Math.max(
                maxQuantity,
                quantity
            );
        }

        int left = 0, right = maxQuantity;
        int minimumMax = maxQuantity;
        while (left <= right) {
            int curQuantity = (left + right) / 2;
            if (canDistribute(quantities, n, curQuantity)) {
                right = curQuantity - 1;
                minimumMax = Math.min(
                    minimumMax,
                    curQuantity
                );
            } else {
                left = curQuantity + 1;
            }
        }

        return minimumMax;
    }

    public boolean canDistribute(int[] quantities, int numRetailStore, int maxQuantity) {
        if (maxQuantity == 0) return false;
        int numRetailStoreRequire = 0;
        for (int i = 0; i < quantities.length; i++) {
            numRetailStoreRequire += (quantities[i] - 1) / maxQuantity + 1;
        }

        return numRetailStoreRequire <= numRetailStore;
    }
}
Binary Search Week
zFNuZTA.png
 
Python:
class Solution:
    def minimizedMaximum(self, n: int, quantities: List[int]) -> int:
        quantities = sorted(quantities, reverse = True)
        def canDistribute(x):
            stores = 0
            for quantity in quantities:
                stores += math.ceil(quantity/x)
                if stores > n:
                    return False
            return True
        left = 1
        right = max(quantities)
        while left <= right:
            mid = left + (right - left)//2
            if canDistribute(mid):
                right = mid - 1
            else:
                left = mid + 1
        return right + 1

Làm tí graph nâng cao nào ae :ah:

 
C++:
bool canDistribute(int n, vector<int>& quantities, int k) {
    int required = 0;
    for (int q : quantities) {
        required += q / k + (q % k == 0 ? 0 : 1);       
    }
    return required <= n;
}

int Solution::minimizedMaximum(int n, vector<int>& quantities) {
    int left = 1;
    int right = 1;
    for (int q : quantities) {
        if (right < q)
            right = q;
    }
    int k = right;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (canDistribute(n, quantities, mid)) {
            right = mid - 1;
            k = mid;
        } else {
            left = mid + 1;
        }
    }
    return k;
}
 
Python:
class Solution:
    def minimizedMaximum(self, n: int, quantities: List[int]) -> int:
        def valid(target):
            return target > 0 and sum([math.ceil(q / target) for q in quantities]) <= n

        l, r = 1, max(quantities)
        while l <= r:
            mid = l + (r - l) // 2
            if valid(mid):
                r = mid - 1
            else:
                l = mid + 1
        result = r + 1
        return result
 
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.214.659
Quay lại
Lên đầu trang