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.
C++:
vector<int> nodesBetweenCriticalPoints(ListNode* head) {
        vector<int> ans(2, int(1e6));
        vector<int> tmp;
        ListNode *prev;
        ListNode *cur;
        ListNode *next;
        prev = head;
        cur = prev->next;
        next = cur->next;
        int i = 2;
        if (cur->next == nullptr) return {-1, -1};
        while(next != nullptr) {
            if ((cur->val > prev->val && cur->val > next->val) || (cur->val < prev->val && cur->val < next->val)) {
                tmp.push_back(i);
            }
            prev = prev->next;
            cur = cur->next;
            next = next->next;
            ++i;
        }
        int n = tmp.size();
        if(n < 2) return {-1, -1};
        if(n == 2) return {tmp[1] - tmp[0], tmp[1] - tmp[0]};
        ans[1] = tmp[n-1] - tmp[0];
        for(int i = 1; i < n; i++) {
            ans[0] = min(ans[0], tmp[i] - tmp[i - 1]);
        }
        return ans;
    }
chạy chậm quá, hóng cao nhân chỉ thêm ạ
BdAlVxV.png
 
C++:
vector<int> nodesBetweenCriticalPoints(ListNode* head) {
        vector<int> ans(2, int(1e6));
        vector<int> tmp;
        ListNode *prev;
        ListNode *cur;
        ListNode *next;
        prev = head;
        cur = prev->next;
        next = cur->next;
        int i = 2;
        if (cur->next == nullptr) return {-1, -1};
        while(next != nullptr) {
            if ((cur->val > prev->val && cur->val > next->val) || (cur->val < prev->val && cur->val < next->val)) {
                tmp.push_back(i);
            }
            prev = prev->next;
            cur = cur->next;
            next = next->next;
            ++i;
        }
        int n = tmp.size();
        if(n < 2) return {-1, -1};
        if(n == 2) return {tmp[1] - tmp[0], tmp[1] - tmp[0]};
        ans[1] = tmp[n-1] - tmp[0];
        for(int i = 1; i < n; i++) {
            ans[0] = min(ans[0], tmp[i] - tmp[i - 1]);
        }
        return ans;
    }
chạy chậm quá, hóng cao nhân chỉ thêm ạ
BdAlVxV.png
Em nghĩ bác xử lý không cần temp sẽ nhanh hơn, làm như bác vừa tăng TC vừa tăng SC
, code của bác chạy 2 pass lận
 
Sửa lần cuối:
Swift:
class Solution {
    func nodesBetweenCriticalPoints(_ head: ListNode?) -> [Int] {
        guard let head else { return [-1, -1] }

        var minDistance = -1
        var maxDistance = -1

        var firstPos = 0
        var prePos = 0
        var currPos = 1

        func dfs(node1: ListNode?, node2: ListNode?, node3: ListNode?) {
            guard let node1, let node2, let node3 else { return }
            currPos += 1
            let isDistinct = (node2.val > node1.val && node2.val > node3.val) ||
                            (node2.val < node1.val && node2.val < node3.val)
            if isDistinct {
                if firstPos != 0 {
                    minDistance = minDistance != -1 ? min(minDistance, currPos - prePos) : currPos - prePos
                    maxDistance = max(maxDistance, currPos - firstPos)
                    prePos = currPos
                } else {
                    firstPos = currPos
                    prePos = currPos
                }
            }

            dfs(node1: node2, node2: node3, node3: node3.next)
        }

        dfs(node1: head, node2: head.next, node3: head.next?.next)

        return [minDistance, maxDistance]
    }
}
Bác này giỏi quá, vậy mà cũng nghĩ ra được
 
C++:
vector<int> nodesBetweenCriticalPoints(ListNode* head) {
        vector<int> ans(2, int(1e6));
        vector<int> tmp;
        ListNode *prev;
        ListNode *cur;
        ListNode *next;
        prev = head;
        cur = prev->next;
        next = cur->next;
        int i = 2;
        if (cur->next == nullptr) return {-1, -1};
        while(next != nullptr) {
            if ((cur->val > prev->val && cur->val > next->val) || (cur->val < prev->val && cur->val < next->val)) {
                tmp.push_back(i);
            }
            prev = prev->next;
            cur = cur->next;
            next = next->next;
            ++i;
        }
        int n = tmp.size();
        if(n < 2) return {-1, -1};
        if(n == 2) return {tmp[1] - tmp[0], tmp[1] - tmp[0]};
        ans[1] = tmp[n-1] - tmp[0];
        for(int i = 1; i < n; i++) {
            ans[0] = min(ans[0], tmp[i] - tmp[i - 1]);
        }
        return ans;
    }
chạy chậm quá, hóng cao nhân chỉ thêm ạ
BdAlVxV.png
bỏ hết mấy cái biến này đi bác. mình có dùng lại thằng head nữa đâu
ListNode *prev;
ListNode *cur;
ListNode *next;
head = head->next thôi
 
Mã:
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def nodesBetweenCriticalPoints(self, head: Optional[ListNode]) -> List[int]:
        prev = head.val
        head = head.next
        cnt = 2
        res = []
        ans = [float("inf") , -1]
        while head.next:
            if head.val > head.next.val and head.val > prev:res.append(cnt)
            if head.val < head.next.val and head.val < prev:res.append(cnt)
            cnt += 1
            prev = head.val
            head = head.next

        if len(res) < 2: return [-1 , -1]
        
        ans[1] = res[-1] - res[0]
        for i in range(1 , len(res)):
            ans[0] = min(ans[0] , res[i] - res[i - 1])
        return ans
 
C++:
vector<int> nodesBetweenCriticalPoints(ListNode* head) {
        vector<int> ans(2, int(1e6));
        vector<int> tmp;
        ListNode *prev;
        ListNode *cur;
        ListNode *next;
        prev = head;
        cur = prev->next;
        next = cur->next;
        int i = 2;
        if (cur->next == nullptr) return {-1, -1};
        while(next != nullptr) {
            if ((cur->val > prev->val && cur->val > next->val) || (cur->val < prev->val && cur->val < next->val)) {
                tmp.push_back(i);
            }
            prev = prev->next;
            cur = cur->next;
            next = next->next;
            ++i;
        }
        int n = tmp.size();
        if(n < 2) return {-1, -1};
        if(n == 2) return {tmp[1] - tmp[0], tmp[1] - tmp[0]};
        ans[1] = tmp[n-1] - tmp[0];
        for(int i = 1; i < n; i++) {
            ans[0] = min(ans[0], tmp[i] - tmp[i - 1]);
        }
        return ans;
    }
chạy chậm quá, hóng cao nhân chỉ thêm ạ
BdAlVxV.png
Bác thử thay ans và tmp bằng các variables kiểu int bình thường thôi (mỗi cái thay bằng hai variables), để đỡ phải truy cập bộ nhớ và các thao tác push tốn tài nguyên. Thay bằng biến kiểu int thì compiler sẽ có thể optimize dùng registers.
 
trư cũng nghĩ là dùng 3 biến được nhưng chưa biết làm kiểu gì
9tSTebu.png
Cái tmp hình như bác để lưu các critical points, thực ra không cần lưu hết, chỉ cần lưu cái đầu tiên và một cái hiện tại (để tính max distance), còn min distance thì bác cứ tính dần dần ngay trong vòng lặp while (về sau vòng lặp for không cần nữa).
 
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.793
Quay lại
Lên đầu trang