Bảng băm trong LeetCode
Bảng băm
127. Chuỗi từ chuyển đổi
Bài toán
Từ điển wordList chứa một chuỗi từ beginWord đến endWord với dãy chuyển đổi được tạo theo các quy tắc sau: beginWord -> s(1) -> s(2) -> ... -> s(k):
Mỗi cặp từ kề nhau chỉ khác nhau bởi một ký tự.
Đối với 1 <= i <= k, mỗi s(i) đều nằm trong wordList. Lưu ý rằng, beginWord không cần ...
Đăng vào ngày 7 tháng 7 lúc 01:55
Giải bài toán quan hệ họ hàng bằng cấu trúc Union-Find
Bài toán yêu cầu xác định xem hai người có cùng một tổ tiên (thuộc cùng một nhóm họ hàng) hay không, dựa trên các mối quan hệ đã cho. Đây là bài toán kinh điển áp dụng cấu trúc dữ liệu Union-Find (Disjoint Set Union - DSU).
Dưới đây là cách triển khai bằng Java:
import java.util.Scanner;
public class Main {
static int[] parent;
// K ...
Đăng vào ngày 5 tháng 7 lúc 10:54
LeetCode Two Pointers Problem: Trapping Rain Water
Classic two-pointer problem on LeetCode
Initial Approach
To accumulate water, each bar must have taller bars on both sides. Additionally, the water level above a bar is determined by the shorter of the two boundary bars — that is, the minimum of the left and right max heights minus the current bar's height.
The key challenge lies in identifying ...
Đăng vào ngày 4 tháng 7 lúc 23:41
Tìm hai số xuất hiện duy nhất trong mảng
Mô tả bài toán:
Cho một mảng số nguyên nums có đúng hai phần tử chỉ xuất hiện một lần, tất cả các phần tử còn lại đều xuất hiện đúng hai lần. Hãy tìm hai phần tử đó. Bạn có thể trả về kết quả theo bất kỳ thứ tự nào.
Bạn phải thiết kế một thuật toán với độ phức tạp thời gian tuyến tính và chỉ sử dụng bộ nhớ phụ hằng số.
Ví dụ 1:
<strong> ...
Đăng vào ngày 23 tháng 6 lúc 07:02
Giải pháp chi tiết LeetCode Weekly Contest 399
Bài 1: Tổng số cặp số tốt I
Đối với bài toán này, chúng ta cần đếm số lượng cặp chỉ số (i, j) sao cho nums1[i] chia hết cho nums2[j] * k. Do giới hạn kích thước của mảng là nhỏ (n, m <= 50), chúng ta có thể sử dụng phương pháp mô phỏng trực tiếp (brute-force) bằng cách duyệt qua tất cả các cặp có thể.
class Solution {
public:
int numberO ...
Đăng vào ngày 18 tháng 6 lúc 18:25
Các Bài Tập LeetCode: Phân Tách Chuỗi Hồi Văn, Chèn Vị Trí, Tìm Kiếm Ma Trận
Phân Tách Chuỗi Hồi Văn
Sử dụng hai hàm: một để kiểm tra chuỗi có phải là hồi văn hay không, và một để thực hiện thuật toán quay lui.
class Solution:
def kiemTraHoiVan(self, chuoi):
return chuoi == chuoi[::-1]
def quyLui(self, chuoi, viTriBatDau, duongDiHienTai, ketQua):
if viTriBatDau >= len(chuoi):
ketQua ...
Đăng vào ngày 18 tháng 6 lúc 06:25
Phân phối Kẹo, Tách Từ II, Điểm Tối Đa Trên Một Đường Thẳng
Bài viết này trình bày các giải pháp cho ba bài toán LeetCode: 135. Phân phối Kẹo, 140. Tách Từ II và 149. Điểm Tối Đa Trên Một Đường Thẳng.
135. Phân phối Kẹo
Bài toán yêu cầu phân phối kẹo cho các trẻ em dựa trên xếp hạng của họ sao cho mỗi trẻ em nhận được ít nhất một viên kẹo và trẻ em có xếp hạng cao hơn phải nhận được nhiều kẹo hơn trẻ e ...
Đăng vào ngày 13 tháng 6 lúc 05:09
Giải thuật xử lý danh sách liên kết: Đảo ngược, hợp nhất và phát hiện chu trình
Đảo ngược danh sách liên kết
Một cách hiệu quả để đảo ngược danh sách liên kết là sử dụng kỹ thuật chèn đầu. Ta duyệt qua từng nút trong danh sách gốc, tách từng nút ra và chèn vào đầu danh sách mới. Trong quá trình này, cần lưu trữ con trỏ đến nút kế tiếp trước khi thay đổi liên kết.
struct ListNode* reverseList(struct ListNode* head) {
s ...
Đăng vào ngày 12 tháng 6 lúc 20:14
Xác Suất Tồn Tại Của Mã Tế Sau K Bước Di Chuyển Trên Bàn Cờ
Bài toán: 688. Xác suất tồn tại của mã tế trên bàn cờ
Cách tiếp cận: Có tối đa k * n * n trạng thái, đáp ứng yêu cầu về thời gian.
Phương pháp 1: Đệ quy + Tìm kiếm theo chiều sâu (DFS). Độ phức tạp thời gian là O(k * n²), chi tiết xem trong chú thích.
Phiên bản C++:
class Solution {
public:
// tám hướng di chuyển
int huongDiChuyenX[8]={ ...
Đăng vào ngày 5 tháng 6 lúc 23:10
Các bài toán xử lý danh sách liên kết trên LeetCode
21. Gộp hai danh sách liên kết đã sắp xếp
Cho hai danh sách liên kết tăng dần, hãy gộp chúng thành một danh sách mới cũng theo thứ tự tăng dần.
ListNode* merge(ListNode* a, ListNode* b) {
if (!a) return b;
if (!b) return a;
if (a->val < b->val) {
a->next = merge(a->next, b);
return a;
} else {
...
Đăng vào ngày 2 tháng 6 lúc 21:43