thảo luận [Học Tập] Topic thuật toán

cảm giác đầu tiên khi làm đc 1 bài hard trên leetcode khá fun, https://leetcode.com/problems/frog-jump/, bài hard này chắc cx dễ thôi nhưng đối vs em thế là vui r, khoe tí thôi, đây là code của em

C++:
1638857267387.png
 
1 bài merge list khá hay, ae tham khảo
https://leetcode.com/problems/merge-k-sorted-lists/

Bài này dùng Min Heap để tối ưu

C++:
    struct Comperator
    {
        bool operator()(ListNode* a, ListNode* b)
        {   
            return a->val > b->val;
        }
    };
    
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        ListNode* head = nullptr;
        ListNode* cur = nullptr;
        
        std::priority_queue<ListNode*, std::vector<ListNode*>, Comperator> minHeap;
        
        for(auto& iter : lists)
        {
            if(!iter)
                continue;
            
            minHeap.push(iter);
        }
        
        while(!minHeap.empty())
        {
            ListNode* node = minHeap.top();
            minHeap.pop();
            
            if(node && node->next)
            {
                minHeap.push(node->next);   
            }   

            if(!head)
            {
                head = node;
            }
            else if(cur)
            {
                cur->next = node;           
            }
            
            cur = node;
            
            if(!node)
                break;
        }

        return head;
    }
 
Nay ở nhà 1 mình húp mỳ đói mờ cả mắt. Ngồi từ 2 rưỡi sáng đến giờ mới implement hết 3 cái thuật string search: Boyer-Moore, KMP, Rabin-Karp, với được 1 bài hard trên leetcode (không biết làm, lúc đầu làm brute force chỉ pass 119/120 case, nhưng thấy họ ghi là xài KMP nên mới lọ mọ tìm cái để đọc đọc). Đọc hết VNOI, mấy web linh tinh các kiểu cũng không hiểu cái KMP. Xem 2 vid của anh Ấn Độ mất 30ph là thông não. Làm xong trời cũng sáng chạy vội sang quán húp bát cháo rồi về ngủ.
g8XXj8u.gif

https://leetcode.com/problems/shortest-palindrome/
C++:
class Solution {
public:
    string shortestPalindrome(string s) {
        string New="";
        New+=s;
        New+='.';
        reverse(s.begin(),s.end());
        New+=s;
        int length=0;
        vector<int>LPS(New.size(),0);
        for(int i=1;i<New.size();i++){
            while(length>0&&New[length]!=New[i]) length=LPS[length-1];
            if(New[length]==New[i]){
                LPS[i]=++length;
            }
            else LPS[i]=0;
        }
        string res="";
        res+=s.substr(0,s.size()-LPS[New.size()-1]);
        reverse(s.begin(),s.end());
        res+=s;
        return res;
    }
};
 
Nay ở nhà 1 mình húp mỳ đói mờ cả mắt. Ngồi từ 2 rưỡi sáng đến giờ mới implement hết 3 cái thuật string search: Boyer-Moore, KMP, Rabin-Karp, với được 1 bài hard trên leetcode (không biết làm, lúc đầu làm brute force chỉ pass 119/120 case, nhưng thấy họ ghi là xài KMP nên mới lọ mọ tìm cái để đọc đọc). Đọc hết VNOI, mấy web linh tinh các kiểu cũng không hiểu cái KMP. Xem 2 vid của anh Ấn Độ mất 30ph là thông não. Làm xong trời cũng sáng chạy vội sang quán húp bát cháo rồi về ngủ.
g8XXj8u.gif

https://leetcode.com/problems/shortest-palindrome/
C++:
class Solution {
public:
    string shortestPalindrome(string s) {
        string New="";
        New+=s;
        New+='.';
        reverse(s.begin(),s.end());
        New+=s;
        int length=0;
        vector<int>LPS(New.size(),0);
        for(int i=1;i<New.size();i++){
            while(length>0&&New[length]!=New[i]) length=LPS[length-1];
            if(New[length]==New[i]){
                LPS[i]=++length;
            }
            else LPS[i]=0;
        }
        string res="";
        res+=s.substr(0,s.size()-LPS[New.size()-1]);
        reverse(s.begin(),s.end());
        res+=s;
        return res;
    }
};

Accepted solution, vét cạn thôi, ko phải tối ưu nhưng gọn :doubt:

Python:
class Solution:
    def shortestPalindrome(self, s: str) -> str:
        shortest_ps = s
        i = 1

        while True:
            half_length_ps = len(shortest_ps) // 2
            if half_length_ps == 0 or shortest_ps[0:half_length_ps] == shortest_ps[-half_length_ps:][::-1]:
                break
            shortest_ps = s[-i:][::-1] + s
            i += 1

        return shortest_ps
 
Mọi người cho em hỏi là thầy em có dạy về thuật toán và đây là sắp xếp nổi bọt nhưng em nhìn thì nếu quay ngang ra nó chả khác gì cái Selection Sort cả. không biết có phải em lú không ạ
Screenshot 2021-12-21 124308.png
 
View attachment 925319

em hơi ngu toán các thím thông não em sao cái ở trên là O(n) còn ở dưới là constant time vậy ạ

Chắc là O(n) với O(1) về space chứ sao lại time được. Đoạn code trên dùng đệ quy, mỗi lần gọi hàm mới thì nó phải khởi tạo heap các kiểu nên tốn memory hơn.

Sent from Samsung SM-G973F using vozFApp
 
Mọi người cho em hỏi là thầy em có dạy về thuật toán và đây là sắp xếp nổi bọt nhưng em nhìn thì nếu quay ngang ra nó chả khác gì cái Selection Sort cả. không biết có phải em lú không ạ View attachment 934285

Này là selection sort rồi, mỗi step chọn ra giá trị min rồi swap về phía đầu mảng. Còn bubble sort đi đến đâu nó swap đến đấy.

Sent from Samsung SM-G973F using vozFApp
 
Này là selection sort rồi, mỗi step chọn ra giá trị min rồi swap về phía đầu mảng. Còn bubble sort đi đến đâu nó swap đến đấy.

Sent from Samsung SM-G973F using vozFApp
Vậy là sai rồi đúng không ạ, vừa nãy em định hỏi lại thầy mà không biết giải thích bằng lời sao nữa
 
Back
Top