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.
Leo cây cả tuần rồi thì phải
janDexM.jpg

Mã:
defmodule Solution do
  def inorder_traversal(root) do
    walk(root) |> List.flatten()
  end
      
  defp walk(nil), do: []
  defp walk(%TreeNode{val: v, left: l, right: r}), do: [walk(l), v, walk(r)]
end
 
tìm cao nhân giải giúp e bài này,
bỏ qua điều kiện H,W < 100
k dùng cách duyệt qua mảng 2 chiều
RcJ9x8H.png
a6EC8K5.png
AgLoZ7Z.png
 
tìm cao nhân giải giúp e bài này,
bỏ qua điều kiện H,W < 100
k dùng cách duyệt qua mảng 2 chiều
RcJ9x8H.png
a6EC8K5.png
AgLoZ7Z.png
với mỗi manhattanDist = 1, 2, 3, ... loop dx, dy sao cho tổng |dx| + |dy| = manhattanDist ròi lụm mấy ghế g[by+dy][bx+dx] còn trống vào mảng emptySeats. Nếu có ghế trống thì break loop manhattanDist rồi trả về mảng emptySeats thoy

irGoYrZ.gif

C++:
for (int manhattanDist = 1; /*manhattanDist < maxManhattanDist*/; ++manhattanDist) {
    std::vector<std::pair<int, int>> emptySeats;
    for (int dx = 1; dx < manhattanDist; ++dx) {
        const int dy = manhattanDist - dx;
        collectSeat(bx + dx, by + dy, emptySeats);
        collectSeat(bx + dx, by - dy, emptySeats);
        collectSeat(bx - dx, by + dy, emptySeats);
        collectSeat(bx - dx, by - dy, emptySeats);
    }
    // dx = 0, dy = manhattanDist
    collectSeat(bx, by + manhattanDist, emptySeats);
    collectSeat(bx, by - manhattanDist, emptySeats);
    // dx = manhattanDist, dy = 0
    collectSeat(bx + manhattanDist, by, emptySeats);
    collectSeat(bx - manhattanDist, by, emptySeats);
    if (!emptySeats.empty()) {
        output(emptySeats);
        break;
    }
}
 
Sửa lần cuối:
với mỗi manhattanDist = 1, 2, 3, ... loop dx, dy sao cho tổng |dx| + |dy| = manhattanDist ròi lụm mấy ghế g[by+dy][bx+dx] còn trống vào mảng emptySeats. Nếu có ghế trống thì break loop manhattanDist rồi trả về mảng emptySeats thoy
thím ơi có giải cách này dc bằng javascript k thím:beauty:
 
bài hôm nay đề đơn giản mà toy ko biết làm O(nlogn) phải đọc lời giải
OANgL56.png


toy ko nghĩ ra cách đi ngược
dzipaLk.gif
có thằng làm O(n) nữa
LTT2cUR.png
 
Sửa lần cuối:
Bài hôm nay có hơi hướng competitive nhỉ, thích ghê ^^
Java:
class Solution {
    public int numberOfWeakCharacters(int[][] properties) {
        Arrays.sort(properties, new Comparator<int[]>(){
            public int compare(int[] a, int[] b){
                return a[0]-b[0];
            }
        });   
        
        int res=0;
        int n=properties.length;
        int[] d=new int[n];
        d[n-1]=properties[n-1][1];
        for(int i=n-2;i>=0;i--){
            d[i]=Math.max(d[i+1], properties[i][1]);
        }
        
        for(int i=0;i<n;i++){
            int greater=lowerBound(properties, properties[i][0]);
            if(greater>=0 && greater<n){
                if(d[greater]>properties[i][1]){
                    res++;
                }
            }
        }
        
        return res;
    }
    
    int lowerBound(int[][] properties, int target){
        int l=0;
        int r=properties.length-1;
        int res=r+1;
        while(l<=r){
            int m=(l+r)/2;
            if(properties[m][0]>target){
                r=m-1;
                res=m;
            }
            else{
                l=m+1;
            }
        }
        return res;
    }
}
 
Vì giá trị lớn nhất bằng kích thước lớn nhất nên có thể làm trong O(n)

C++:
class Solution {
public:
    int numberOfWeakCharacters(vector<vector<int>>& properties) {
        vector<int> max_def(100'004, 0);
        int min_atk = INT_MAX, max_atk = INT_MIN;
        for (auto &v : properties) {
            if (v[1] > max_def[v[0]])
                max_def[v[0]] = v[1];
            min_atk = min(min_atk, v[0]);
            max_atk = max(max_atk, v[0]);
        }
   
        std::partial_sum(
            make_reverse_iterator(begin(max_def) + max_atk + 1),
            make_reverse_iterator(begin(max_def) + min_atk),
            make_reverse_iterator(begin(max_def) + max_atk + 1),
            [](auto x, auto y) { return max(x, y); });
   
        int res = 0;
        for (auto &v : properties)
            if (v[1] < max_def[v[0]+1])
                ++res;
   
        return res;
    }
};

1662696086370.png

https://leetcode.com/submissions/detail/795240394/
 
Sửa lần cuối:
Bài nay làm O(nlogn) mà thấy chưa tối ưu lắm, nghe đâu O(n) được để lát suy nghĩ tiếp :big_smile:
Có vẻ như dùng được counting sort nên có thể giảm thành O(n)
Nhận thấy nếu thêm lần lượt theo attack giảm dần thì defense phải tăng dần ==> Sort
https://leetcode.com/submissions/detail/795224797/
 
Sửa lần cuối:
Nay lười quá nên chỉ nghĩ tới O(nlogn) thôi :shame:
Ruby:
def number_of_weak_characters(prop)
  prop.sort! { |a, b| [a[0], b[1]] <=> [b[0], a[1]] }
  count = 0
  max_i = prop.length - 1
  i = prop.length - 2
  while i >= 0
    if prop[max_i][1] > prop[i][1]
      count += 1
    else
      max_i = i
    end
    i -= 1
  end
  count
end
 
Sửa lần cuối:
Sửa lần cuối:
partial_sum làm gì ko trong xáng, transform được ròi: https://leetcode.com/submissions/detail/795181262/ dòng cuối xài count_if dễ đọc dễ hiểu
uq1dgnk.png

edit: cũng vậy
code toy xài max_element, transform, count_if đẹp thế tự dưng lòi ra cái for lạc quẻ
Qz8dGvJ.png


tìm minAtk thêm xao code nó chạy tận 951ms, tụi lc đo time như loằn: https://leetcode.com/submissions/detail/795180608/

ơ giờ mới biết make_reverse_iterator
ghXpJrI.png

partial_sum nghe hợp logic hơn chứ. Ý tưởng là lấy max của tất cả những dãy prefix. Giống như prefix sum nhưng là max thay vì +.
 
1 dòng. :p
Python:
return reduce(lambda p, n: [p[0] + int(n[1] < p[1]), n[1] if n[1] > p[1] else p[1]], sorted(properties, key=lambda n: (-n[0], n[1])), [0, -1])[0]
Ý tưởng là sort input list theo điểm attack từ cao xuống thấp, rồi xem có bao nhiêu thằng điểm defend không trong dãy tăng dần.
 
Sửa lần cuối:
Hết cây rồi, mừng quá
hkNtitg.png


Mã:
defmodule Solution do
  def number_of_weak_characters(properties) do
    properties
    |> Enum.sort_by(fn [atk, def] -> {-atk, def} end)
    |> Enum.reduce({0, 0}, fn [_, def], {max, count} ->
      cond do
        def < max -> {max, count + 1}
        true -> {def, count}
      end
    end)
    |> elem(1)
  end
end
 
partial_sum nghe hợp logic hơn chứ. Ý tưởng là lấy max của tất cả những dãy prefix. Giống như prefix sum nhưng là max thay vì +.
nghe cũng hợp lý thặc, chắc toy biết ít hàm quá đọc tên ko quen
OANgL56.png


Đổi sang std::exclusive_scan tính prefix sum để max_def[i] không bao gồm giá trị tại i.
Đoạn cuối khỏi phải so sánh v[1] < max_def[v[0]+1] làm xấu code.
đúng như cái hàm transform của toy này, mà xài transform viết cái lambda hack quá, nào là mutable nào là exchange
OANgL56.png
kinh thặc ba cái hàm ít ai xài nhưng lại có sẵn trong std mới ghê
UKiCiKh.png


4 dòng
68747470733a2f2f692e696d6775722e636f6d2f6b493461396c482e6a7067
https://leetcode.com/submissions/detail/795512000/
C++:
struct Solution {
    int numberOfWeakCharacters(vector<vector<int>>& props) {
        vector<int> maxDefs((*max_element(begin(props), end(props)))[0] + 1, 0);
        for (const auto& p : props) maxDefs[p[0]] = max(maxDefs[p[0]], p[1]);
        exclusive_scan(maxDefs.rbegin(), maxDefs.rend(), maxDefs.rbegin(), 0, [](int a, int b) { return max(a, b); });
        return count_if(begin(props), end(props), [&](const auto& p) { return p[1] < maxDefs[p[0]]; });
    }
};
 
Sửa lần cuối:
Python:
class Solution:
    def numberOfWeakCharacters(self, properties: List[List[int]]) -> int:
        count, max_sofar = 0, float("-inf")
        for _, i in sorted(properties, key=lambda x: (-x[0],x[1])):
            count = count + (1 if i<max_sofar else 0)
            max_sofar = max(i,max_sofar)
        return count
 
tìm cao nhân giải giúp e bài này,
bỏ qua điều kiện H,W < 100
k dùng cách duyệt qua mảng 2 chiều
RcJ9x8H.png
a6EC8K5.png
AgLoZ7Z.png
Thím thử tiếp cận theo hướng dùng queue BFS xem, bắt đầu duyệt tại vị trí best view sau đó lan dần ra xung quanh khi gặp ghế đầu tiên thỏa thì tính lại distance (d1), khi nào vị trí đầu tiên trong queue có distance vs best view > d1 thì dừng
 
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.772
Quay lại
Lên đầu trang