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.
Java:
class Solution {
    public long countFairPairs(int[] nums, int lower, int upper) {
        long ans = 0;
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++) {
            int l = binSearch(nums, i + 1, nums.length - 1, lower - nums[i]);
            int u = binSearch(nums, i + 1, nums.length - 1, upper - nums[i] + 1);
            ans += (u - l);
        }
        return ans;
    }

    private int binSearch(int[] nums, int l, int r, int target) {
        while (l <= r) {
            int m = l + ((r - l) >> 1);
            if (nums[m] >= target) r = m - 1;
            else l = m + 1;
        }
        return l;
    }
}
Off voz 1 hôm mà giờ có quả theme sida vl :ah:
 
JavaScript:
var countFairPairs = function (nums, lower, upper) {
    nums.sort((u, v) => u - v);
    const n = nums.length;
    let ans = 0;
    for (let i = 1; i < n; i++) {
        const l = _.clamp(_.sortedIndex(nums, lower - nums[i]), i);
        const r = _.clamp(_.sortedLastIndex(nums, upper - nums[i]), i);
        ans += r - l;
    }
    return ans;
};
 
Không thấy Change Notes ở đâu bác nhỉ :v chả biết có thêm chức năng gì không hay là chỉ đổi mỗi giao diện
z8SmL8K.png
 
Nộp bài ăn mừng voz có giao diện mới :ROFLMAO:

C++:
class Solution {
public:
    long long countFairPairs(vector<int>& nums, int lower, int upper) {
        sort(nums.begin(), nums.end());
        int n = nums.size();
        long long res = 0;
        for (int i=0, l=n, r=n-1; i<n; ++i) {
            while (l>i && nums[i] + nums[l-1] >= lower) --l;
            while (r>i && nums[i] + nums[r] > upper) --r;

            if (r == i) {
                break;
            }
            if (l == n) {
                continue;
            }
            res += (r - max(i+1, l)) + 1;
        }
        return res;
    }
};
 
Java:
class Solution {
    public long countFairPairs(int[] nums, int lower, int upper) {
        int n = nums.length;
        Arrays.sort(nums);
        int l =1;
        int r = n-1;
        long res =0;
        for(int i =0 ;i<n-1;i++){
            if(i>=r) break;
            while(r>i &&nums[r]>upper-nums[i]){
                r--;
            }
            l=i+1;
            while(l<=r && nums[l]<lower -nums[i]){
                l++;
            }
            res+=r-l+1;
        }
        return res;
    }
  
}
uwooUzw.gif
 
Java:
class Solution {
    public long countFairPairs(int[] nums, int lower, int upper) {
        int n = nums.length;
        Arrays.sort(nums);
        int l =1;
        int r = n-1;
        long res =0;
        for(int i =0 ;i<n-1;i++){
            if(i>=r) break;
            while(r>i &&nums[r]>upper-nums[i]){
                r--;
            }
            l=i+1;
            while(l<=r && nums[l]<lower -nums[i]){
                l++;
            }
            res+=r-l+1;
        }
        return res;
    }
 
}
uwooUzw.gif
Two Pointer này lỏ
osCpCsi.png
 
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 =((
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;
    }
};
 
Nộp bài ăn mừng voz có giao diện mới :ROFLMAO:

C++:
class Solution {
public:
    long long countFairPairs(vector<int>& nums, int lower, int upper) {
        sort(nums.begin(), nums.end());
        int n = nums.size();
        long long res = 0;
        for (int i=0, l=n, r=n-1; i<n; ++i) {
            while (l>i && nums[i] + nums[l-1] >= lower) --l;
            while (r>i && nums[i] + nums[r] > upper) --r;

            if (r == i) {
                break;
            }
            if (l == n) {
                continue;
            }
            res += (r - max(i+1, l)) + 1;
        }
        return res;
    }
};
Java:
class Solution {
    public long countFairPairs(int[] nums, int lower, int upper) {
        int n = nums.length;
        Arrays.sort(nums);
        int l =1;
        int r = n-1;
        long res =0;
        for(int i =0 ;i<n-1;i++){
            if(i>=r) break;
            while(r>i &&nums[r]>upper-nums[i]){
                r--;
            }
            l=i+1;
            while(l<=r && nums[l]<lower -nums[i]){
                l++;
            }
            res+=r-l+1;
        }
        return res;
    }
 
}
uwooUzw.gif
bác với e tiếp cận cùng ý tưởng mà sao chênh lệch về cách triển khai thế này
uwooUzw.gif
đây đây là huyết mạch áp chế sao
so cùng lang cho nó trực quan
1731469638343.png
 
LC 2536 GoLang
C-like:
func countFairPairs(nums []int, lower, upper int) int64 {
    sort.Ints(nums)
    return countBs(nums, upper) - countBs(nums, lower - 1)
}

func countBs(nums []int, target int) int64 {
    rs, n := int64(0), len(nums)
    for l, r := 0, n-1; l < n - 1; l++ {
        if r < l + 1 { r = l + 1 }
        for l < r && nums[l] + nums[r] > target { r-- }
        rs += int64(r - l)
    }
    return rs
}
 
bác với e tiếp cận cùng ý tưởng mà sao chênh lệch về cách triển khai thế này
uwooUzw.gif
đây đây là huyết mạch áp chế sao
so cùng lang cho nó trực quan
Xem tệp đính kèm 2779196
Quốc hồn quốc tuý của two pointers là con trỏ chỉ tăng hoặc chỉ giảm trong suốt chương trình, thế éo nào bác lại set l = i +1 xong lại while loop lần nữa
1731472303477.png
 
C++:
class Solution {
public:
    long long countFairPairs(vector<int>& nums, int lower, int upper);
};

using llong = long long;

llong getLower(vector<int>& arr, int value, llong low, llong high) {
    while (low < high) {
        llong mid = low + (high - low) / 2;
        if (arr[mid] < value)
            low = mid + 1;
        else
            high = mid;
    }
    if (arr[low] >= value)
        return low;
    return arr.size();
}

llong getUpper(vector<int>& arr, int value, llong low, llong high) {
    while (low < high) {
        llong mid = low + (high - low + 1) / 2;
        if (arr[mid] > value)
            high = mid - 1;           
        else
            low = mid;
            
    }
    if (arr[high] <= value)
        return high;
    return -1;
}

llong Solution::countFairPairs(vector<int>& nums, int lower, int upper) {
    std::sort(nums.begin(), nums.end());
    llong ans = 0;
    llong lo = 0;
    llong hi = nums.size() - 1;
    for (llong i = 0; i < nums.size(); ++i) {
        lo = i + 1;
        hi = getUpper(nums, upper - nums[i], lo, hi);
        if (lo > hi)
            return ans;
        lo = getLower(nums, lower - nums[i], i+1, hi);
        if (lo > hi)
            continue;
        ans += hi - lo + 1;
    }
    return ans;
}
 
1st problem với các bác dùng kotlin
class Solution {
fun maximumBeauty(items: Array<IntArray>, queries: IntArray): IntArray {
items.sortBy { it[0] }
val queriesWithIndex = queries
.mapIndexed { index, value -> intArrayOf(index, value) }
.sortedBy { it.last() }
val result = IntArray(queries.size)
var ans = 0
var curIdx = 0
for ((idx, value) in queriesWithIndex) {
while (curIdx <= items.lastIndex && items[curIdx][0] <= value) {
ans = maxOf(ans, items[curIdx][1])
curIdx++
}
result[idx] = ans
}
return result
}
}
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)
 
Swift:
class Solution {
    func countFairPairs(_ nums: [Int], _ lower: Int, _ upper: Int) -> Int {
        let nums = nums.sorted()
        var result = 0
        for (index, num) in nums.enumerated() {
            //if num > upper { break }
            // lower
            var posL = -1
            do {
                var left = index+1
                var right = nums.count - 1
                while left <= right {
                    let mid = (left + right) / 2
                    let sum = num + nums[mid]
                    if sum < lower {
                        left = mid + 1
                    } else if sum >= lower {
                        posL = mid
                        right = mid - 1
                    }
                }
            }
            // upper
            var posR = -1
            do {
                var left = index+1
                var right = nums.count - 1
                while left <= right {
                    let mid = (left + right) / 2
                    let sum = num + nums[mid]
                    if sum <= upper {
                        posR = mid
                        left = mid + 1
                    } else {
                        right = mid - 1
                    }
                }
            }
            if posL != -1 && posR != -1 {
                result += posR - posL + 1
            }
        }
        return result
    }
}
 
C++:
func countFairPairs(nums []int, lower int, upper int) int64 {
    n := len(nums)
    if n < 2 {
        return 0
    }

    sort.Ints(nums)
    var count int64

    for i := 0; i < n-1; i++ {
        left := searchLeft(nums, i+1, n-1, lower-nums[i])
        right := searchRight(nums, i+1, n-1, upper-nums[i])

        if left <= right {
            count += int64(right - left + 1)
        }
    }

    return count
}

func searchLeft(nums []int, left, right, target int) int {
    result := right + 1
    for left <= right {
        mid := left + (right-left)/2
        if nums[mid] >= target {
            result = mid
            right = mid - 1
        } else {
            left = mid + 1
        }
    }
    return result
}

func searchRight(nums []int, left, right, target int) int {
    result := left - 1
    for left <= right {
        mid := left + (right-left)/2
        if nums[mid] <= target {
            result = mid
            left = mid + 1
        } else {
            right = mid - 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.491
Quay lại
Lên đầu trang