thảo luận Leetcode contest, đường tới Guardian

  • Người tạo chủ đề Người tạo chủ đề freedom.9
  • Ngày bắt đầu Ngày bắt đầu
Trạng thái
Không mở để trả lời thêm.
Mã:
class Solution {
    public long flowerGame(int n, int m) {
        long left_even = ((n % 2 == 0? n : n - 1) - 2) / 2 + 1;
        long left_odd = ((n % 2 == 0 ? n - 1: n) - 1) / 2 + 1;
    
        long right_even = ((m % 2 == 0? m : m - 1) - 2) / 2 + 1;
        long right_odd = ((m % 2 == 0? m - 1: m) - 1) / 2 + 1;
        return left_even * right_odd + left_odd * right_even;
    }
}
Dạo này mình k tham gia contest để giữ rating :cry: , chỉ đợi đề của contest để làm thôi :sleep:
 
Sửa lần cuối:
Mã:
class Solution {
    public long flowerGame(int n, int m) {
        long left_even = ((n % 2 == 0? n : n - 1) - 2) / 2 + 1;
        long left_odd = ((n % 2 == 0 ? n - 1: n) - 1) / 2 + 1;
   
        long right_even = ((m % 2 == 0? m : m - 1) - 2) / 2 + 1;
        long right_odd = ((m % 2 == 0? m - 1: m) - 1) / 2 + 1;
        return left_even * right_odd + left_odd * right_even;
    }
}
Dạo này mình k tham gia contest để giữ rating :cry: , chỉ đợi đề của contest để làm thôi :sleep:
Thế tối nay làm không ngài nah :D
 
Contest cx khá dễ :big_smile:, mà vừa nói chuyện vs gái xong làm nên hơi mất tập trung. Ăn 4 bugs :beat_brick:
 
Sửa lần cuối:
contest tối nay khá dễ

C++:
class Solution {
public:
    long long maximumSubarraySum(vector<int>& nums, int k) {
        int n = nums.size();
        map<int, long long> f;
        long long sum = 0, ans = LLONG_MIN;
        for (int i = 0; i < n; ++i) {
            sum += nums[i];
            if (f.count(nums[i] - k)) {
                ans = max(ans, sum - f[nums[i] - k] + nums[i] - k);
            }
          
            if (f.count(nums[i] + k)) {
                ans = max(ans, sum - f[k + nums[i]] + k + nums[i]);
            }
          
            if (f.count(nums[i])) {
                f[nums[i]] = min(f[nums[i]], sum);
            } else {
                f[nums[i]] = sum;
            }
        }
      
        return (ans == LLONG_MIN)?0:ans;
    }
};

C++:
int numberOfPairs(vector<vector<int>>& points) {
        int n = points.size();
        int ans = 0;
        sort(points.begin(), points.end(), [](auto a, auto b) {
            if (a[0] == b[0]) return a[1] >= b[1];
            return a[0] < b[0];
        });
      
      
        for (int i = 1; i < n; ++i) {
            int b = INT_MAX;
            for (int j = i - 1; j >= 0; --j) {
                if (points[j][1] >= points[i][1] && points[j][1] < b) {
                    ans++;
                    b = points[j][1];
                }
            }
        }
      
        return ans;
    }
 
Sửa lần cuối:
contest tối nay khá dễ
Câu 3
C++:
class Solution {
public:
    long long maximumSubarraySum(vector<int>& nums, int k) {
        int n = nums.size();
        map<int, long long> f;
        long long sum = 0, ans = LLONG_MIN;
        for (int i = 0; i < n; ++i) {
            sum += nums[i];
            if (f.count(nums[i] - k)) {
                ans = max(ans, sum - f[nums[i] - k] + nums[i] - k);
            }
           
            if (f.count(nums[i] + k)) {
                ans = max(ans, sum - f[k + nums[i]] + k + nums[i]);
            }
           
            if (f.count(nums[i])) {
                f[nums[i]] = min(f[nums[i]], sum);
            } else {
                f[nums[i]] = sum;
            }
        }
       
        return (ans == LLONG_MIN)?0:ans;
    }
};

Câu 4
C++:
int numberOfPairs(vector<vector<int>>& points) {
        int n = points.size();
        int ans = 0;
        sort(points.begin(), points.end(), [](auto a, auto b) {
            if (a[0] == b[0]) return a[1] >= b[1];
            return a[0] < b[0];
        });
       
       
        for (int i = 0; i < n; ++i) {
            if (i == 0) continue;
            int b = INT_MAX;
            for (int j = i - 1; j >= 0; --j) {
                if (points[j][1] >= points[i][1] && points[j][1] < b) {
                    ans++;
                    b = points[j][1];
                }
            }
        }
       
        return ans;
    }
sau post solution sau contest bác, ko ông nào copy xong leetcode nó detect giống source nhau khéo ăn ban đấy bác :look_down:
 
Câu 1:
  • Đầu tiên, phải check xem 3 cạnh có là tam giác không bằng công thức cấp 3
  • Sau đó đếm cạnh cho nhanh, nếu max(count) == 2 thì cân, == 3 thì đều

Câu 2:
  • n = 50 nên max time complex = O(n^3) -> 3 vòng for
  • 2 vòng for đầu tiên lấy 2 điểm bất kì, rồi check xem có thoả mãn các đk ko
  • vòng for cuối check có điểm nào ở giữa không, có thì result += 1

Câu 3:
  • n = 10^5 nên time complex = O(n) -> 1 vòng for
  • có thể dùng hash map cho mảng nums (gọi là index_map) key là num, value là list các index
  • Duyệt từng số, rồi duyệt các index trong index_map[num - k], index_map[num + k]. Rồi tìm sum lớn nhất
  • số lượng các cặp thoả mãn đề bài có thể n^2 nên ko dùng hash map rồi duyệt lần lượt các pair đc
  • vậy how to tối ưu
  • thôi đoạn này nhìn code dễ hiểu hơn
Python:
class Solution:
    def maximumSubarraySum(self, nums: List[int], k: int) -> int:
        max_indexes = dict()
        res = -float('inf')
       
        prefix_sum = nums.copy()
        for i in range(1, len(nums)):
            prefix_sum[i] += prefix_sum[i - 1]
       
        def get_prefix_sum(start, end):
            if start == 0:
                return prefix_sum[end]
            return prefix_sum[end] - prefix_sum[start - 1]
       
        for i, num in enumerate(nums):
           
            if num - k in max_indexes:
                res = max(res, get_prefix_sum(max_indexes[num - k], i))
            if num + k in max_indexes:
                res = max(res, get_prefix_sum(max_indexes[num + k], i))
           
            if num not in max_indexes or get_prefix_sum(max_indexes[num], i - 1) < 0:
                max_indexes[num] = i
           
        return 0 if res == -float('inf') else res

Câu 4:
  • n = 1000 nên max time complex = O(n^2 logn) -> 2 vòng for
  • cũng khó giải thíchm chắc nhìn code dễ hiểu hơn
Python:
class Solution:
    def numberOfPairs(self, points: List[List[int]]) -> int:
        n = len(points)
        points.sort(key=lambda x:(x[0], -x[1]))
        pairs_count = 0
       
        for chisato_index in range(n - 1):
            max_previous_takina_y = -float('inf')
            for takina_index in range(chisato_index + 1, n):
                chisato_x, chisato_y = points[chisato_index]
                takina_y, takina_y = points[takina_index]
               
                if chisato_y < takina_y:
                    continue
                   
                if max_previous_takina_y < takina_y:
                    pairs_count += 1

                max_previous_takina_y = max(max_previous_takina_y, takina_y)
                   
        return pairs_count
 
Câu 1:
  • Đầu tiên, phải check xem 3 cạnh có là tam giác không bằng công thức cấp 3
  • Sau đó đếm cạnh cho nhanh, nếu max(count) == 2 thì cân, == 3 thì đều

Câu 2:
  • n = 50 nên max time complex = O(n^3) -> 3 vòng for
  • 2 vòng for đầu tiên lấy 2 điểm bất kì, rồi check xem có thoả mãn các đk ko
  • vòng for cuối check có điểm nào ở giữa không, có thì result += 1

Câu 3:
  • n = 10^5 nên time complex = O(n) -> 1 vòng for
  • có thể dùng hash map cho mảng nums (gọi là index_map) key là num, value là list các index
  • Duyệt từng số, rồi duyệt các index trong index_map[num - k], index_map[num + k]. Rồi tìm sum lớn nhất
  • số lượng các cặp thoả mãn đề bài có thể n^2 nên ko dùng hash map rồi duyệt lần lượt các pair đc
  • vậy how to tối ưu
  • thôi đoạn này nhìn code dễ hiểu hơn
Python:
class Solution:
    def maximumSubarraySum(self, nums: List[int], k: int) -> int:
        max_indexes = dict()
        res = -float('inf')
      
        prefix_sum = nums.copy()
        for i in range(1, len(nums)):
            prefix_sum[i] += prefix_sum[i - 1]
      
        def get_prefix_sum(start, end):
            if start == 0:
                return prefix_sum[end]
            return prefix_sum[end] - prefix_sum[start - 1]
      
        for i, num in enumerate(nums):
          
            if num - k in max_indexes:
                res = max(res, get_prefix_sum(max_indexes[num - k], i))
            if num + k in max_indexes:
                res = max(res, get_prefix_sum(max_indexes[num + k], i))
          
            if num not in max_indexes or get_prefix_sum(max_indexes[num], i - 1) < 0:
                max_indexes[num] = i
          
        return 0 if res == -float('inf') else res

Câu 4:
  • n = 1000 nên max time complex = O(n^2 logn) -> 2 vòng for
  • cũng khó giải thíchm chắc nhìn code dễ hiểu hơn
Python:
class Solution:
    def numberOfPairs(self, points: List[List[int]]) -> int:
        n = len(points)
        points.sort(key=lambda x:(x[0], -x[1]))
        pairs_count = 0
      
        for chisato_index in range(n - 1):
            max_previous_takina_y = -float('inf')
            for takina_index in range(chisato_index + 1, n):
                chisato_x, chisato_y = points[chisato_index]
                takina_y, takina_y = points[takina_index]
              
                if chisato_y < takina_y:
                    continue
                  
                if max_previous_takina_y < takina_y:
                    pairs_count += 1

                max_previous_takina_y = max(max_previous_takina_y, takina_y)
                  
        return pairs_count
Tên biến :surrender: :surrender:
 
Câu 3 mình giải thế này TLE là sao ta, sao thấy mấy thằng giải bằng c++ lại pass?

Python:
class Solution:
    def maximumSubarraySum(self, nums: List[int], k: int) -> int:
        prefixSum = [nums[0]]*len(nums)
        
        for i in range(1,len(nums)):
            prefixSum[i] = nums[i] + prefixSum[i - 1]

        counts = {}
        sum = 0
        ans = -inf
        for i in range(len(nums) - 1, -1, -1):
            if nums[i] - k in counts:
                print(i)
                for j in counts[nums[i] - k]:
                    if i == 0:
                        ans = max(prefixSum[j], ans)
                    else:
                        ans = max(prefixSum[j] - prefixSum[i - 1], ans)
                    
            if k + nums[i] in counts:
                for j in counts[k + nums[i]]:
                    if i == 0:
                        ans = max(prefixSum[j], ans)
                    else:
                        ans = max(prefixSum[j] - prefixSum[i - 1], ans)
                
            if not nums[i] in counts:
                counts[nums[i]] = []
                
            counts[nums[i]].append(i)
            
        if ans == -inf:
            return 0
        
        return ans
 
Câu 3 mình giải thế này TLE là sao ta, sao thấy mấy thằng giải bằng c++ lại pass?

Python:
class Solution:
    def maximumSubarraySum(self, nums: List[int], k: int) -> int:
        prefixSum = [nums[0]]*len(nums)
       
        for i in range(1,len(nums)):
            prefixSum[i] = nums[i] + prefixSum[i - 1]

        counts = {}
        sum = 0
        ans = -inf
        for i in range(len(nums) - 1, -1, -1):
            if nums[i] - k in counts:
                print(i)
                for j in counts[nums[i] - k]:
                    if i == 0:
                        ans = max(prefixSum[j], ans)
                    else:
                        ans = max(prefixSum[j] - prefixSum[i - 1], ans)
                   
            if k + nums[i] in counts:
                for j in counts[k + nums[i]]:
                    if i == 0:
                        ans = max(prefixSum[j], ans)
                    else:
                        ans = max(prefixSum[j] - prefixSum[i - 1], ans)
               
            if not nums[i] in counts:
                counts[nums[i]] = []
               
            counts[nums[i]].append(i)
           
        if ans == -inf:
            return 0
       
        return ans
Họ update sao cho counts bé nhất thôi anh append vào list tất cả index giờ em cho 1 array full 1 thì tle là chắc.
 
Giải bằng C# lại pass, éo hiểu kiểu gì. Bài 3 mình giải có tí mà ko hiểu sao ko pass với python

C#:
public class Solution {
    public long MaximumSubarraySum(int[] nums, int k) {
        int n = nums.Length;
        long[] prefixSum = new long[n];
        prefixSum[0] = nums[0];

        for (int i = 1; i < n; ++i) {
            prefixSum[i] = (long)nums[i] + prefixSum[i - 1];
        }

        Dictionary<long, List<int>> counts = new Dictionary<long, List<int>>();
        long ans = long.MinValue;

        for (int i = n - 1; i >= 0; --i) {
            if (counts.ContainsKey(nums[i] - k)) {
                foreach (var item in counts[nums[i] - k]) {
                    if (i == 0) {
                        ans = Math.Max(prefixSum[item], ans);
                    } else {
                        ans = Math.Max(prefixSum[item] - (i > 0 ? prefixSum[i - 1] : 0), ans);
                    }
                }
            }

            if (counts.ContainsKey(k + nums[i])) {
                foreach (var item in counts[k + nums[i]]) {
                    if (i == 0) {
                        ans = Math.Max(prefixSum[item], ans);
                    } else {
                        ans = Math.Max(prefixSum[item] - (i > 0 ? prefixSum[i - 1] : 0), ans);
                    }
                }
            }

            if (!counts.ContainsKey(nums[i])) {
                counts[nums[i]] = new List<int>();
            }

            counts[nums[i]].Add(i);
        }

        if (ans == long.MinValue) {
            return 0;
        }

        return ans;
    }
}
 
Họ update sao cho counts bé nhất thôi anh append vào list tất cả index giờ em cho 1 array full 1 thì tle là chắc.
Ừ đúng rồi mình ko nghĩ ra, đáng ra chỉ cần lưu lại index có giá trị nhỏ nhất và index có giá trị lớn nhất vào cái counts thôi đúng ko fence nhỉ
 
Ừ đúng rồi mình ko nghĩ ra, đáng ra chỉ cần lưu lại index có giá trị nhỏ nhất và index có giá trị lớn nhất vào cái counts thôi đúng ko fence nhỉ
Không phải là id nhỏ nhất và id lớn nhất đâu anh, anh chỉ cần quan tâm tới tổng hiện tại thôi. Tổng đoạn cần tìm = current_sum - sum[0->index thỏa mãn - 1] => vậy mình muốn cái sum từ 0 đến index thỏa mãn -1 đó nhỏ nhất có thể. Vậy thì chỉ cần lưu f[num] = min(f[num],cur)

Anh có thể thử tham khảo code của em
Python:
class Solution:
    def maximumSubarraySum(self, nums: List[int], k: int) -> int:
        have_ans = False
        inf = 10**16
        ans = -inf
        n = len(nums)
        # abs(nums[i] - nums[j]) == k
        f = {}
        cur = 0
        for x in nums:
            y = x - k
            z = x + k
            
            if x in f:
                f[x] = min(f[x], cur)
            else:
                f[x] = cur
            cur += x
            
            
            if y in f:
                print(ans)
                ans = max(ans, cur - f[y])
            if z in f:
                print(ans)
                ans = max(ans, cur - f[z])


        return ans if ans != -inf else 0
 
Sửa lần cuối:
Không phải là id nhỏ nhất và id lớn nhất đâu anh, anh chỉ cần quan tâm tới tổng hiện tại thôi. Tổng đoạn cần tìm = current_sum - sum[0->index thỏa mãn - 1] => vậy mình muốn cái sum từ 0 đến index thỏa mãn -1 đó nhỏ nhất có thể. Vậy thì chỉ cần lưu f[num] = min(f[num],cur)

Anh có thể thử tham khảo code của em
Python:
class Solution:
    def maximumSubarraySum(self, nums: List[int], k: int) -> int:
        have_ans = False
        inf = 10**16
        ans = -inf
        n = len(nums)
        # abs(nums[i] - nums[j]) == k
        f = {}
        cur = 0
        for x in nums:
            y = x - k
            z = x + k
           
            if x in f:
                f[x] = min(f[x], cur)
            else:
                f[x] = cur
            cur += x
           
           
            if y in f:
                print(ans)
                ans = max(ans, cur - f[y])
            if z in f:
                print(ans)
                ans = max(ans, cur - f[z])


        return ans if ans != -inf else 0
À mình hiểu rồi, thì ra là thế :ah: thanks fence
 
Screenshot 2024-02-08 at 17.35.57.png

Cay éo chịu đc :ah::ah:
 
Trạng thái
Không mở để trả lời thêm.

Thống kê chủ đề

Ngày tạo
freedom.9,
Người trả lời cuối
freedom.9,
Trả lời
2.480
Lượt xem
130.339
Quay lại
Lên đầu trang