From e720aa2d24cd203c5b4e55891a02e97547d2ce42 Mon Sep 17 00:00:00 2001 From: Yudong Jin Date: Sat, 2 Dec 2023 06:21:34 +0800 Subject: [PATCH] feat: Revised the book (#978) * Sync recent changes to the revised Word. * Revised the preface chapter * Revised the introduction chapter * Revised the computation complexity chapter * Revised the chapter data structure * Revised the chapter array and linked list * Revised the chapter stack and queue * Revised the chapter hashing * Revised the chapter tree * Revised the chapter heap * Revised the chapter graph * Revised the chapter searching * Reivised the sorting chapter * Revised the divide and conquer chapter * Revised the chapter backtacking * Revised the DP chapter * Revised the greedy chapter * Revised the appendix chapter * Revised the preface chapter doubly * Revised the figures --- codes/c/chapter_array_and_linkedlist/array.c | 4 +- .../linked_list.c | 2 +- .../c/chapter_array_and_linkedlist/my_list.c | 10 +- codes/c/chapter_backtracking/n_queens.c | 6 +- .../iteration.c | 2 +- codes/c/chapter_divide_and_conquer/hanota.c | 4 +- .../climbing_stairs_backtrack.c | 2 +- .../chapter_dynamic_programming/coin_change.c | 2 +- .../edit_distance.c | 2 +- .../c/chapter_dynamic_programming/knapsack.c | 8 +- .../min_path_sum.c | 2 +- codes/c/chapter_graph/graph_bfs.c | 2 +- codes/c/chapter_graph/graph_dfs.c | 2 +- codes/c/chapter_hashing/array_hash_map.c | 2 +- codes/c/chapter_heap/my_heap.c | 2 +- codes/c/chapter_searching/binary_search.c | 6 +- codes/c/chapter_sorting/bucket_sort.c | 2 +- codes/c/chapter_sorting/heap_sort.c | 2 +- codes/c/chapter_sorting/quick_sort.c | 6 +- codes/c/chapter_sorting/radix_sort.c | 2 +- .../linkedlist_deque.c | 2 +- codes/c/chapter_tree/binary_tree.c | 2 +- .../chapter_array_and_linkedlist/array.cpp | 4 +- .../linked_list.cpp | 2 +- .../cpp/chapter_array_and_linkedlist/list.cpp | 4 +- .../chapter_array_and_linkedlist/my_list.cpp | 14 +- codes/cpp/chapter_backtracking/n_queens.cpp | 6 +- .../iteration.cpp | 2 +- .../cpp/chapter_divide_and_conquer/hanota.cpp | 4 +- .../climbing_stairs_backtrack.cpp | 2 +- .../coin_change.cpp | 2 +- .../edit_distance.cpp | 2 +- .../chapter_dynamic_programming/knapsack.cpp | 8 +- .../min_path_sum.cpp | 2 +- .../chapter_graph/graph_adjacency_list.cpp | 2 +- .../chapter_graph/graph_adjacency_matrix.cpp | 2 +- codes/cpp/chapter_graph/graph_bfs.cpp | 2 +- codes/cpp/chapter_graph/graph_dfs.cpp | 2 +- codes/cpp/chapter_hashing/array_hash_map.cpp | 2 +- codes/cpp/chapter_heap/my_heap.cpp | 4 +- codes/cpp/chapter_searching/binary_search.cpp | 6 +- codes/cpp/chapter_searching/two_sum.cpp | 6 +- codes/cpp/chapter_sorting/bucket_sort.cpp | 2 +- codes/cpp/chapter_sorting/heap_sort.cpp | 2 +- codes/cpp/chapter_sorting/quick_sort.cpp | 8 +- codes/cpp/chapter_sorting/radix_sort.cpp | 2 +- .../linkedlist_deque.cpp | 2 +- codes/cpp/chapter_tree/binary_tree.cpp | 2 +- .../chapter_array_and_linkedlist/array.cs | 4 +- .../linked_list.cs | 2 +- .../chapter_array_and_linkedlist/list.cs | 4 +- .../chapter_array_and_linkedlist/my_list.cs | 14 +- codes/csharp/chapter_backtracking/n_queens.cs | 6 +- .../chapter_divide_and_conquer/hanota.cs | 4 +- .../climbing_stairs_backtrack.cs | 2 +- .../coin_change.cs | 2 +- .../edit_distance.cs | 2 +- .../chapter_dynamic_programming/knapsack.cs | 8 +- .../min_path_sum.cs | 2 +- .../chapter_graph/graph_adjacency_list.cs | 2 +- .../chapter_graph/graph_adjacency_matrix.cs | 2 +- codes/csharp/chapter_graph/graph_bfs.cs | 2 +- codes/csharp/chapter_graph/graph_dfs.cs | 2 +- .../csharp/chapter_hashing/array_hash_map.cs | 2 +- codes/csharp/chapter_heap/my_heap.cs | 2 +- .../csharp/chapter_searching/binary_search.cs | 6 +- codes/csharp/chapter_searching/two_sum.cs | 6 +- codes/csharp/chapter_sorting/bucket_sort.cs | 2 +- codes/csharp/chapter_sorting/heap_sort.cs | 2 +- codes/csharp/chapter_sorting/quick_sort.cs | 8 +- codes/csharp/chapter_sorting/radix_sort.cs | 2 +- .../linkedlist_deque.cs | 2 +- codes/csharp/chapter_tree/binary_tree.cs | 2 +- .../chapter_array_and_linkedlist/array.dart | 2 +- .../linked_list.dart | 2 +- .../chapter_array_and_linkedlist/list.dart | 4 +- .../chapter_array_and_linkedlist/my_list.dart | 14 +- codes/dart/chapter_backtracking/n_queens.dart | 6 +- .../iteration.dart | 2 +- .../chapter_divide_and_conquer/hanota.dart | 4 +- .../climbing_stairs_backtrack.dart | 2 +- .../coin_change.dart | 2 +- .../edit_distance.dart | 2 +- .../chapter_dynamic_programming/knapsack.dart | 8 +- .../min_path_sum.dart | 2 +- .../chapter_graph/graph_adjacency_list.dart | 2 +- .../chapter_graph/graph_adjacency_matrix.dart | 2 +- codes/dart/chapter_graph/graph_bfs.dart | 2 +- codes/dart/chapter_graph/graph_dfs.dart | 2 +- .../dart/chapter_hashing/array_hash_map.dart | 2 +- codes/dart/chapter_heap/my_heap.dart | 2 +- codes/dart/chapter_heap/top_k.dart | 2 +- .../dart/chapter_searching/binary_search.dart | 2 +- codes/dart/chapter_searching/two_sum.dart | 6 +- codes/dart/chapter_sorting/bucket_sort.dart | 2 +- codes/dart/chapter_sorting/heap_sort.dart | 2 +- codes/dart/chapter_sorting/quick_sort.dart | 8 +- codes/dart/chapter_sorting/radix_sort.dart | 2 +- codes/dart/chapter_tree/binary_tree.dart | 2 +- .../go/chapter_array_and_linkedlist/array.go | 4 +- .../linked_list_test.go | 2 +- .../chapter_array_and_linkedlist/list_test.go | 4 +- .../chapter_array_and_linkedlist/my_list.go | 10 +- .../my_list_test.go | 4 +- codes/go/chapter_backtracking/n_queens.go | 2 +- .../iteration.go | 2 +- codes/go/chapter_divide_and_conquer/hanota.go | 4 +- .../climbing_stairs_backtrack.go | 2 +- .../coin_change.go | 2 +- .../coin_change_ii.go | 2 +- .../edit_distance.go | 2 +- .../chapter_dynamic_programming/knapsack.go | 8 +- .../min_path_sum.go | 4 +- .../go/chapter_graph/graph_adjacency_list.go | 2 +- .../chapter_graph/graph_adjacency_matrix.go | 2 +- codes/go/chapter_hashing/array_hash_map.go | 2 +- codes/go/chapter_heap/my_heap.go | 2 +- codes/go/chapter_searching/binary_search.go | 4 +- codes/go/chapter_searching/two_sum.go | 6 +- codes/go/chapter_sorting/bucket_sort.go | 2 +- codes/go/chapter_sorting/heap_sort.go | 2 +- codes/go/chapter_sorting/quick_sort.go | 10 +- codes/go/chapter_sorting/radix_sort.go | 2 +- codes/go/chapter_tree/binary_tree_test.go | 2 +- .../chapter_array_and_linkedlist/array.java | 4 +- .../linked_list.java | 2 +- .../chapter_array_and_linkedlist/list.java | 4 +- .../chapter_array_and_linkedlist/my_list.java | 14 +- codes/java/chapter_backtracking/n_queens.java | 6 +- .../iteration.java | 2 +- .../chapter_divide_and_conquer/hanota.java | 4 +- .../climbing_stairs_backtrack.java | 2 +- .../coin_change.java | 2 +- .../edit_distance.java | 2 +- .../chapter_dynamic_programming/knapsack.java | 8 +- .../min_path_sum.java | 2 +- .../chapter_graph/graph_adjacency_list.java | 2 +- .../chapter_graph/graph_adjacency_matrix.java | 2 +- codes/java/chapter_graph/graph_bfs.java | 2 +- codes/java/chapter_graph/graph_dfs.java | 2 +- .../java/chapter_hashing/array_hash_map.java | 2 +- codes/java/chapter_heap/my_heap.java | 2 +- .../java/chapter_searching/binary_search.java | 6 +- codes/java/chapter_searching/two_sum.java | 6 +- codes/java/chapter_sorting/bucket_sort.java | 2 +- codes/java/chapter_sorting/heap_sort.java | 2 +- codes/java/chapter_sorting/quick_sort.java | 8 +- codes/java/chapter_sorting/radix_sort.java | 2 +- .../linkedlist_deque.java | 2 +- codes/java/chapter_tree/binary_tree.java | 2 +- .../chapter_array_and_linkedlist/array.js | 6 +- .../linked_list.js | 2 +- .../chapter_array_and_linkedlist/list.js | 4 +- .../chapter_array_and_linkedlist/my_list.js | 14 +- .../chapter_backtracking/n_queens.js | 6 +- .../iteration.js | 2 +- .../chapter_divide_and_conquer/hanota.js | 4 +- .../climbing_stairs_backtrack.js | 2 +- .../coin_change.js | 2 +- .../edit_distance.js | 2 +- .../chapter_dynamic_programming/knapsack.js | 8 +- .../min_path_sum.js | 2 +- .../chapter_graph/graph_adjacency_list.js | 2 +- .../chapter_graph/graph_adjacency_matrix.js | 2 +- codes/javascript/chapter_graph/graph_bfs.js | 2 +- codes/javascript/chapter_graph/graph_dfs.js | 2 +- .../chapter_hashing/array_hash_map.js | 2 +- codes/javascript/chapter_heap/my_heap.js | 2 +- .../chapter_searching/binary_search.js | 6 +- codes/javascript/chapter_searching/two_sum.js | 6 +- .../javascript/chapter_sorting/bucket_sort.js | 2 +- codes/javascript/chapter_sorting/heap_sort.js | 2 +- .../javascript/chapter_sorting/quick_sort.js | 8 +- .../javascript/chapter_sorting/radix_sort.js | 2 +- .../linkedlist_deque.js | 4 +- .../chapter_tree/array_binary_tree.js | 2 +- codes/javascript/chapter_tree/binary_tree.js | 2 +- .../chapter_array_and_linkedlist/array.py | 6 +- .../linked_list.py | 2 +- .../chapter_array_and_linkedlist/list.py | 4 +- .../chapter_array_and_linkedlist/my_list.py | 14 +- codes/python/chapter_backtracking/n_queens.py | 6 +- .../iteration.py | 2 +- .../chapter_divide_and_conquer/hanota.py | 4 +- .../climbing_stairs_backtrack.py | 2 +- .../coin_change.py | 2 +- .../edit_distance.py | 2 +- .../chapter_dynamic_programming/knapsack.py | 8 +- .../min_path_sum.py | 2 +- .../chapter_graph/graph_adjacency_list.py | 2 +- .../chapter_graph/graph_adjacency_matrix.py | 2 +- codes/python/chapter_graph/graph_bfs.py | 2 +- codes/python/chapter_graph/graph_dfs.py | 2 +- .../python/chapter_hashing/array_hash_map.py | 2 +- codes/python/chapter_heap/my_heap.py | 2 +- .../python/chapter_searching/binary_search.py | 6 +- codes/python/chapter_searching/two_sum.py | 6 +- codes/python/chapter_sorting/bucket_sort.py | 2 +- codes/python/chapter_sorting/heap_sort.py | 2 +- codes/python/chapter_sorting/quick_sort.py | 10 +- codes/python/chapter_sorting/radix_sort.py | 2 +- .../linkedlist_deque.py | 2 +- codes/python/chapter_tree/binary_tree.py | 2 +- .../chapter_array_and_linkedlist/array.rs | 4 +- .../linked_list.rs | 2 +- .../rust/chapter_array_and_linkedlist/list.rs | 4 +- .../chapter_array_and_linkedlist/my_list.rs | 14 +- codes/rust/chapter_backtracking/n_queens.rs | 6 +- .../iteration.rs | 2 +- .../rust/chapter_divide_and_conquer/hanota.rs | 4 +- .../climbing_stairs_backtrack.rs | 2 +- .../coin_change.rs | 2 +- .../edit_distance.rs | 2 +- .../chapter_dynamic_programming/knapsack.rs | 8 +- .../min_path_sum.rs | 2 +- .../chapter_graph/graph_adjacency_list.rs | 2 +- .../chapter_graph/graph_adjacency_matrix.rs | 2 +- codes/rust/chapter_graph/graph_bfs.rs | 2 +- codes/rust/chapter_graph/graph_dfs.rs | 2 +- codes/rust/chapter_hashing/array_hash_map.rs | 2 +- codes/rust/chapter_heap/my_heap.rs | 2 +- codes/rust/chapter_searching/binary_search.rs | 6 +- codes/rust/chapter_searching/two_sum.rs | 6 +- codes/rust/chapter_sorting/bucket_sort.rs | 2 +- codes/rust/chapter_sorting/heap_sort.rs | 2 +- codes/rust/chapter_sorting/quick_sort.rs | 8 +- codes/rust/chapter_sorting/radix_sort.rs | 2 +- .../linkedlist_deque.rs | 4 +- codes/rust/chapter_tree/binary_tree.rs | 2 +- .../chapter_array_and_linkedlist/array.swift | 4 +- .../linked_list.swift | 2 +- .../chapter_array_and_linkedlist/list.swift | 4 +- .../my_list.swift | 14 +- .../swift/chapter_backtracking/n_queens.swift | 6 +- .../iteration.swift | 2 +- .../chapter_divide_and_conquer/hanota.swift | 4 +- .../climbing_stairs_backtrack.swift | 2 +- .../coin_change.swift | 2 +- .../edit_distance.swift | 2 +- .../knapsack.swift | 8 +- .../min_path_sum.swift | 2 +- .../chapter_graph/graph_adjacency_list.swift | 2 +- .../graph_adjacency_matrix.swift | 2 +- codes/swift/chapter_graph/graph_bfs.swift | 2 +- codes/swift/chapter_graph/graph_dfs.swift | 2 +- .../chapter_hashing/array_hash_map.swift | 2 +- codes/swift/chapter_heap/my_heap.swift | 2 +- .../chapter_searching/binary_search.swift | 6 +- codes/swift/chapter_searching/two_sum.swift | 6 +- codes/swift/chapter_sorting/bucket_sort.swift | 2 +- codes/swift/chapter_sorting/heap_sort.swift | 2 +- codes/swift/chapter_sorting/quick_sort.swift | 4 +- codes/swift/chapter_sorting/radix_sort.swift | 2 +- .../linkedlist_deque.swift | 2 +- codes/swift/chapter_tree/binary_tree.swift | 2 +- .../chapter_array_and_linkedlist/array.ts | 6 +- .../linked_list.ts | 2 +- .../chapter_array_and_linkedlist/list.ts | 4 +- .../chapter_array_and_linkedlist/my_list.ts | 14 +- .../chapter_backtracking/n_queens.ts | 6 +- .../iteration.ts | 2 +- .../chapter_divide_and_conquer/hanota.ts | 4 +- .../climbing_stairs_backtrack.ts | 2 +- .../coin_change.ts | 2 +- .../edit_distance.ts | 2 +- .../chapter_dynamic_programming/knapsack.ts | 8 +- .../min_path_sum.ts | 2 +- .../chapter_graph/graph_adjacency_list.ts | 2 +- .../chapter_graph/graph_adjacency_matrix.ts | 2 +- codes/typescript/chapter_graph/graph_bfs.ts | 2 +- codes/typescript/chapter_graph/graph_dfs.ts | 2 +- .../chapter_hashing/array_hash_map.ts | 2 +- codes/typescript/chapter_heap/my_heap.ts | 2 +- .../chapter_searching/binary_search.ts | 6 +- codes/typescript/chapter_searching/two_sum.ts | 6 +- .../typescript/chapter_sorting/bucket_sort.ts | 2 +- codes/typescript/chapter_sorting/heap_sort.ts | 2 +- .../typescript/chapter_sorting/quick_sort.ts | 8 +- .../typescript/chapter_sorting/radix_sort.ts | 2 +- .../linkedlist_deque.ts | 4 +- .../chapter_tree/array_binary_tree.ts | 2 +- codes/typescript/chapter_tree/binary_tree.ts | 2 +- .../chapter_array_and_linkedlist/array.zig | 4 +- .../linked_list.zig | 2 +- .../zig/chapter_array_and_linkedlist/list.zig | 4 +- .../chapter_array_and_linkedlist/my_list.zig | 14 +- .../iteration.zig | 2 +- .../climbing_stairs_backtrack.zig | 2 +- .../coin_change.zig | 2 +- .../edit_distance.zig | 2 +- .../chapter_dynamic_programming/knapsack.zig | 8 +- .../min_path_sum.zig | 2 +- codes/zig/chapter_hashing/array_hash_map.zig | 2 +- codes/zig/chapter_heap/my_heap.zig | 2 +- codes/zig/chapter_searching/binary_search.zig | 6 +- codes/zig/chapter_searching/two_sum.zig | 6 +- codes/zig/chapter_sorting/quick_sort.zig | 8 +- codes/zig/chapter_sorting/radix_sort.zig | 2 +- .../linkedlist_deque.zig | 2 +- codes/zig/chapter_tree/binary_tree.zig | 2 +- .../contribution.assets/edit_markdown.png | Bin 77268 -> 87838 bytes docs/chapter_appendix/contribution.md | 14 +- docs/chapter_appendix/installation.md | 6 +- docs/chapter_appendix/terminology.md | 170 +++++++----------- .../array.assets/array_remove_element.png | Bin 28152 -> 27642 bytes docs/chapter_array_and_linkedlist/array.md | 42 ++--- .../linked_list.md | 60 +++---- docs/chapter_array_and_linkedlist/list.md | 60 +++---- .../computer_storage_devices.png | Bin 41837 -> 12981 bytes .../ram_and_cache.assets/storage_pyramid.png | Bin 53492 -> 19155 bytes .../ram_and_cache.md | 6 +- docs/chapter_array_and_linkedlist/summary.md | 32 ++-- .../preorder_find_constrained_paths.png | Bin 30918 -> 30459 bytes .../backtracking_algorithm.md | 72 ++++---- docs/chapter_backtracking/n_queens_problem.md | 10 +- .../permutations_problem.md | 30 ++-- .../subset_sum_problem.md | 22 +-- docs/chapter_backtracking/summary.md | 10 +- .../iteration_and_recursion.md | 40 ++--- .../performance_evaluation.md | 14 +- .../space_complexity.md | 24 +-- .../summary.md | 26 +-- .../time_complexity.md | 44 ++--- .../basic_data_types.md | 20 +-- .../character_encoding.md | 52 +++--- .../classification_of_data_structure.md | 16 +- docs/chapter_data_structure/index.md | 2 +- .../chapter_data_structure/number_encoding.md | 24 +-- docs/chapter_data_structure/summary.md | 8 +- .../binary_search_recur.md | 20 +-- .../build_binary_tree_problem.md | 22 +-- .../divide_and_conquer.md | 40 ++--- .../hanota_problem.md | 24 +-- docs/chapter_divide_and_conquer/summary.md | 12 +- .../dp_problem_features.md | 36 ++-- .../dp_solution_pipeline.md | 26 +-- .../edit_distance_problem.md | 14 +- .../intro_to_dynamic_programming.md | 30 ++-- .../knapsack_problem.md | 30 ++-- docs/chapter_dynamic_programming/summary.md | 18 +- .../unbounded_knapsack_problem.md | 54 +++--- .../graph.assets/adjacency_matrix.png | Bin 21965 -> 22288 bytes docs/chapter_graph/graph.md | 16 +- docs/chapter_graph/graph_operations.md | 6 +- docs/chapter_graph/graph_traversal.md | 26 +-- docs/chapter_graph/index.md | 2 +- docs/chapter_graph/summary.md | 14 +- .../fractional_knapsack_problem.md | 20 +-- docs/chapter_greedy/greedy_algorithm.md | 42 ++--- docs/chapter_greedy/index.md | 4 +- docs/chapter_greedy/max_capacity_problem.md | 20 +-- .../max_product_cutting_problem.md | 10 +- docs/chapter_greedy/summary.md | 4 +- docs/chapter_hashing/hash_algorithm.md | 48 ++--- .../hash_table_chaining.png | Bin 31646 -> 31442 bytes docs/chapter_hashing/hash_collision.md | 26 +-- docs/chapter_hashing/hash_map.md | 12 +- docs/chapter_hashing/index.md | 4 +- docs/chapter_hashing/summary.md | 18 +- docs/chapter_heap/build_heap.md | 10 +- docs/chapter_heap/heap.md | 32 ++-- docs/chapter_heap/index.md | 4 +- docs/chapter_heap/summary.md | 2 +- docs/chapter_heap/top_k.md | 12 +- .../algorithms_are_everywhere.md | 14 +- docs/chapter_introduction/summary.md | 6 +- docs/chapter_introduction/what_is_dsa.md | 20 +-- docs/chapter_preface/about_the_book.md | 31 ++-- .../suggestions.assets/code_md_to_repo.png | Bin 60126 -> 85191 bytes .../suggestions.assets/download_code.png | Bin 73183 -> 93233 bytes docs/chapter_preface/suggestions.md | 32 ++-- docs/chapter_preface/summary.md | 8 +- docs/chapter_searching/binary_search.md | 14 +- docs/chapter_searching/binary_search_edge.md | 10 +- .../binary_search_insertion.md | 10 +- .../replace_linear_by_hashing.md | 10 +- .../searching_algorithm_revisited.md | 10 +- docs/chapter_searching/summary.md | 8 +- docs/chapter_sorting/bubble_sort.md | 6 +- .../bucket_sort_overview.png | Bin 45635 -> 44577 bytes docs/chapter_sorting/bucket_sort.md | 18 +- docs/chapter_sorting/counting_sort.md | 16 +- docs/chapter_sorting/heap_sort.md | 6 +- docs/chapter_sorting/insertion_sort.md | 12 +- docs/chapter_sorting/merge_sort.md | 12 +- docs/chapter_sorting/quick_sort.md | 10 +- docs/chapter_sorting/radix_sort.md | 8 +- docs/chapter_sorting/selection_sort.md | 10 +- docs/chapter_sorting/sorting_algorithm.md | 10 +- .../sorting_algorithms_comparison.png | Bin 60946 -> 60656 bytes docs/chapter_sorting/summary.md | 14 +- docs/chapter_stack_and_queue/deque.md | 14 +- docs/chapter_stack_and_queue/index.md | 2 +- docs/chapter_stack_and_queue/queue.md | 30 ++-- docs/chapter_stack_and_queue/stack.md | 24 +-- docs/chapter_stack_and_queue/summary.md | 6 +- .../array_representation_of_tree.md | 14 +- docs/chapter_tree/avl_tree.md | 42 ++--- docs/chapter_tree/binary_search_tree.md | 18 +- docs/chapter_tree/binary_tree.md | 50 +++--- docs/chapter_tree/binary_tree_traversal.md | 14 +- docs/chapter_tree/index.md | 2 +- docs/chapter_tree/summary.md | 20 +-- docs/index.md | 14 +- 404 files changed, 1537 insertions(+), 1558 deletions(-) diff --git a/codes/c/chapter_array_and_linkedlist/array.c b/codes/c/chapter_array_and_linkedlist/array.c index 9ab22ff58..a826cbb32 100644 --- a/codes/c/chapter_array_and_linkedlist/array.c +++ b/codes/c/chapter_array_and_linkedlist/array.c @@ -37,11 +37,11 @@ void insert(int *nums, int size, int num, int index) { for (int i = size - 1; i > index; i--) { nums[i] = nums[i - 1]; } - // 将 num 赋给 index 处元素 + // 将 num 赋给 index 处的元素 nums[index] = num; } -/* 删除索引 index 处元素 */ +/* 删除索引 index 处的元素 */ // 注意:stdio.h 占用了 remove 关键词 void removeItem(int *nums, int size, int index) { // 把索引 index 之后的所有元素向前移动一位 diff --git a/codes/c/chapter_array_and_linkedlist/linked_list.c b/codes/c/chapter_array_and_linkedlist/linked_list.c index 8f5e72f0e..5110d46ae 100644 --- a/codes/c/chapter_array_and_linkedlist/linked_list.c +++ b/codes/c/chapter_array_and_linkedlist/linked_list.c @@ -56,7 +56,7 @@ int main() { ListNode *n2 = newListNode(2); ListNode *n3 = newListNode(5); ListNode *n4 = newListNode(4); - // 构建引用指向 + // 构建节点之间的引用 n0->next = n1; n1->next = n2; n2->next = n3; diff --git a/codes/c/chapter_array_and_linkedlist/my_list.c b/codes/c/chapter_array_and_linkedlist/my_list.c index 9ee55968f..01b37ea26 100644 --- a/codes/c/chapter_array_and_linkedlist/my_list.c +++ b/codes/c/chapter_array_and_linkedlist/my_list.c @@ -6,7 +6,7 @@ #include "../utils/common.h" -/* 列表类简易实现 */ +/* 列表类 */ typedef struct { int *arr; // 数组(存储列表元素) int capacity; // 列表容量 @@ -54,7 +54,7 @@ void set(MyList *nums, int index, int num) { nums->arr[index] = num; } -/* 尾部添加元素 */ +/* 在尾部添加元素 */ void add(MyList *nums, int num) { if (size(nums) == capacity(nums)) { extendCapacity(nums); // 扩容 @@ -63,7 +63,7 @@ void add(MyList *nums, int num) { nums->size++; } -/* 中间插入元素 */ +/* 在中间插入元素 */ void insert(MyList *nums, int index, int num) { assert(index >= 0 && index < size(nums)); // 元素数量超出容量时,触发扩容机制 @@ -117,7 +117,7 @@ int *toArray(MyList *nums) { int main() { /* 初始化列表 */ MyList *nums = newMyList(); - /* 尾部添加元素 */ + /* 在尾部添加元素 */ add(nums, 1); add(nums, 3); add(nums, 2); @@ -127,7 +127,7 @@ int main() { printArray(toArray(nums), size(nums)); printf("容量 = %d ,长度 = %d\n", capacity(nums), size(nums)); - /* 中间插入元素 */ + /* 在中间插入元素 */ insert(nums, 3, 6); printf("在索引 3 处插入数字 6 ,得到 nums = "); printArray(toArray(nums), size(nums)); diff --git a/codes/c/chapter_backtracking/n_queens.c b/codes/c/chapter_backtracking/n_queens.c index 3ea83051e..e1e3485cf 100644 --- a/codes/c/chapter_backtracking/n_queens.c +++ b/codes/c/chapter_backtracking/n_queens.c @@ -26,7 +26,7 @@ void backtrack(int row, int n, char state[MAX_SIZE][MAX_SIZE], char ***res, int // 计算该格子对应的主对角线和副对角线 int diag1 = row - col + n - 1; int diag2 = row + col; - // 剪枝:不允许该格子所在列、主对角线、副对角线存在皇后 + // 剪枝:不允许该格子所在列、主对角线、副对角线上存在皇后 if (!cols[col] && !diags1[diag1] && !diags2[diag2]) { // 尝试:将皇后放置在该格子 state[row][col] = 'Q'; @@ -51,8 +51,8 @@ char ***nQueens(int n, int *returnSize) { state[i][n] = '\0'; } bool cols[MAX_SIZE] = {false}; // 记录列是否有皇后 - bool diags1[2 * MAX_SIZE - 1] = {false}; // 记录主对角线是否有皇后 - bool diags2[2 * MAX_SIZE - 1] = {false}; // 记录副对角线是否有皇后 + bool diags1[2 * MAX_SIZE - 1] = {false}; // 记录主对角线上是否有皇后 + bool diags2[2 * MAX_SIZE - 1] = {false}; // 记录副对角线上是否有皇后 char ***res = (char ***)malloc(sizeof(char **) * MAX_SIZE); *returnSize = 0; diff --git a/codes/c/chapter_computational_complexity/iteration.c b/codes/c/chapter_computational_complexity/iteration.c index de49ab514..95594354d 100644 --- a/codes/c/chapter_computational_complexity/iteration.c +++ b/codes/c/chapter_computational_complexity/iteration.c @@ -32,7 +32,7 @@ int whileLoop(int n) { int whileLoopII(int n) { int res = 0; int i = 1; // 初始化条件变量 - // 循环求和 1, 4, ... + // 循环求和 1, 4, 10, ... while (i <= n) { res += i; // 更新条件变量 diff --git a/codes/c/chapter_divide_and_conquer/hanota.c b/codes/c/chapter_divide_and_conquer/hanota.c index 1c7d24c90..6979720b1 100644 --- a/codes/c/chapter_divide_and_conquer/hanota.c +++ b/codes/c/chapter_divide_and_conquer/hanota.c @@ -20,7 +20,7 @@ void move(int *src, int *srcSize, int *tar, int *tarSize) { (*tarSize)++; } -/* 求解汉诺塔:问题 f(i) */ +/* 求解汉诺塔问题 f(i) */ void dfs(int i, int *src, int *srcSize, int *buf, int *bufSize, int *tar, int *tarSize) { // 若 src 只剩下一个圆盘,则直接将其移到 tar if (i == 1) { @@ -35,7 +35,7 @@ void dfs(int i, int *src, int *srcSize, int *buf, int *bufSize, int *tar, int *t dfs(i - 1, buf, bufSize, src, srcSize, tar, tarSize); } -/* 求解汉诺塔 */ +/* 求解汉诺塔问题 */ void solveHanota(int *A, int *ASize, int *B, int *BSize, int *C, int *CSize) { // 将 A 顶部 n 个圆盘借助 B 移到 C dfs(*ASize, A, ASize, B, BSize, C, CSize); diff --git a/codes/c/chapter_dynamic_programming/climbing_stairs_backtrack.c b/codes/c/chapter_dynamic_programming/climbing_stairs_backtrack.c index 5e5b3eba2..4673ce261 100644 --- a/codes/c/chapter_dynamic_programming/climbing_stairs_backtrack.c +++ b/codes/c/chapter_dynamic_programming/climbing_stairs_backtrack.c @@ -25,7 +25,7 @@ void backtrack(int *choices, int state, int n, int *res, int len) { /* 爬楼梯:回溯 */ int climbingStairsBacktrack(int n) { - int choices[2] = {1, 2}; // 可选择向上爬 1 或 2 阶 + int choices[2] = {1, 2}; // 可选择向上爬 1 阶或 2 阶 int state = 0; // 从第 0 阶开始爬 int *res = (int *)malloc(sizeof(int)); *res = 0; // 使用 res[0] 记录方案数量 diff --git a/codes/c/chapter_dynamic_programming/coin_change.c b/codes/c/chapter_dynamic_programming/coin_change.c index f1127e745..d700eeb9f 100644 --- a/codes/c/chapter_dynamic_programming/coin_change.c +++ b/codes/c/chapter_dynamic_programming/coin_change.c @@ -24,7 +24,7 @@ int coinChangeDP(int coins[], int amt, int coinsSize) { for (int a = 1; a <= amt; a++) { dp[0][a] = MAX; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (int i = 1; i <= n; i++) { for (int a = 1; a <= amt; a++) { if (coins[i - 1] > a) { diff --git a/codes/c/chapter_dynamic_programming/edit_distance.c b/codes/c/chapter_dynamic_programming/edit_distance.c index 229eabe2d..8c1255c40 100644 --- a/codes/c/chapter_dynamic_programming/edit_distance.c +++ b/codes/c/chapter_dynamic_programming/edit_distance.c @@ -72,7 +72,7 @@ int editDistanceDP(char *s, char *t, int n, int m) { for (int j = 1; j <= m; j++) { dp[0][j] = j; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (s[i - 1] == t[j - 1]) { diff --git a/codes/c/chapter_dynamic_programming/knapsack.c b/codes/c/chapter_dynamic_programming/knapsack.c index 19b1f232f..886faedc1 100644 --- a/codes/c/chapter_dynamic_programming/knapsack.c +++ b/codes/c/chapter_dynamic_programming/knapsack.c @@ -13,11 +13,11 @@ int myMax(int a, int b) { /* 0-1 背包:暴力搜索 */ int knapsackDFS(int wgt[], int val[], int i, int c) { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i == 0 || c == 0) { return 0; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (wgt[i - 1] > c) { return knapsackDFS(wgt, val, i - 1, c); } @@ -30,7 +30,7 @@ int knapsackDFS(int wgt[], int val[], int i, int c) { /* 0-1 背包:记忆化搜索 */ int knapsackDFSMem(int wgt[], int val[], int memCols, int **mem, int i, int c) { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i == 0 || c == 0) { return 0; } @@ -38,7 +38,7 @@ int knapsackDFSMem(int wgt[], int val[], int memCols, int **mem, int i, int c) { if (mem[i][c] != -1) { return mem[i][c]; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (wgt[i - 1] > c) { return knapsackDFSMem(wgt, val, memCols, mem, i - 1, c); } diff --git a/codes/c/chapter_dynamic_programming/min_path_sum.c b/codes/c/chapter_dynamic_programming/min_path_sum.c index e4a7b78c1..be19b7578 100644 --- a/codes/c/chapter_dynamic_programming/min_path_sum.c +++ b/codes/c/chapter_dynamic_programming/min_path_sum.c @@ -69,7 +69,7 @@ int minPathSumDP(int grid[MAX_SIZE][MAX_SIZE], int n, int m) { for (int i = 1; i < n; i++) { dp[i][0] = dp[i - 1][0] + grid[i][0]; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (int i = 1; i < n; i++) { for (int j = 1; j < m; j++) { dp[i][j] = myMin(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; diff --git a/codes/c/chapter_graph/graph_bfs.c b/codes/c/chapter_graph/graph_bfs.c index 19276648c..6d13154de 100644 --- a/codes/c/chapter_graph/graph_bfs.c +++ b/codes/c/chapter_graph/graph_bfs.c @@ -66,7 +66,7 @@ void graphBFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize, // 遍历该顶点的所有邻接顶点 AdjListNode *node = findNode(graph, vet); while (node != NULL) { - // 跳过已被访问过的顶点 + // 跳过已被访问的顶点 if (!isVisited(visited, *visitedSize, node->vertex)) { enqueue(queue, node->vertex); // 只入队未访问的顶点 visited[(*visitedSize)++] = node->vertex; // 标记该顶点已被访问 diff --git a/codes/c/chapter_graph/graph_dfs.c b/codes/c/chapter_graph/graph_dfs.c index e8e676341..2e53257d9 100644 --- a/codes/c/chapter_graph/graph_dfs.c +++ b/codes/c/chapter_graph/graph_dfs.c @@ -27,7 +27,7 @@ void dfs(GraphAdjList *graph, Vertex **res, int *resSize, Vertex *vet) { // 遍历该顶点的所有邻接顶点 AdjListNode *node = findNode(graph, vet); while (node != NULL) { - // 跳过已被访问过的顶点 + // 跳过已被访问的顶点 if (!isVisited(res, *resSize, node->vertex)) { // 递归访问邻接顶点 dfs(graph, res, resSize, node->vertex); diff --git a/codes/c/chapter_hashing/array_hash_map.c b/codes/c/chapter_hashing/array_hash_map.c index 3853ef00b..5263ee4ce 100644 --- a/codes/c/chapter_hashing/array_hash_map.c +++ b/codes/c/chapter_hashing/array_hash_map.c @@ -21,7 +21,7 @@ typedef struct { int len; } MapSet; -/* 基于数组简易实现的哈希表 */ +/* 基于数组实现的哈希表 */ typedef struct { Pair *buckets[HASHTABLE_CAPACITY]; } ArrayHashMap; diff --git a/codes/c/chapter_heap/my_heap.c b/codes/c/chapter_heap/my_heap.c index 342df0944..cd7762aac 100644 --- a/codes/c/chapter_heap/my_heap.c +++ b/codes/c/chapter_heap/my_heap.c @@ -99,7 +99,7 @@ int pop(MaxHeap *maxHeap) { printf("heap is empty!"); return INT_MAX; } - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) swap(maxHeap, 0, size(maxHeap) - 1); // 删除节点 int val = maxHeap->data[maxHeap->size - 1]; diff --git a/codes/c/chapter_searching/binary_search.c b/codes/c/chapter_searching/binary_search.c index c21d13404..c09aa3f21 100644 --- a/codes/c/chapter_searching/binary_search.c +++ b/codes/c/chapter_searching/binary_search.c @@ -24,9 +24,9 @@ int binarySearch(int *nums, int len, int target) { return -1; } -/* 二分查找(左闭右开) */ +/* 二分查找(左闭右开区间) */ int binarySearchLCRO(int *nums, int len, int target) { - // 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 + // 初始化左闭右开区间 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 int i = 0, j = len; // 循环,当搜索区间为空时跳出(当 i = j 时为空) while (i < j) { @@ -51,7 +51,7 @@ int main() { int index = binarySearch(nums, 10, target); printf("目标元素 6 的索引 = %d\n", index); - /* 二分查找(左闭右开) */ + /* 二分查找(左闭右开区间) */ index = binarySearchLCRO(nums, 10, target); printf("目标元素 6 的索引 = %d\n", index); diff --git a/codes/c/chapter_sorting/bucket_sort.c b/codes/c/chapter_sorting/bucket_sort.c index 019027a10..5af623d28 100644 --- a/codes/c/chapter_sorting/bucket_sort.c +++ b/codes/c/chapter_sorting/bucket_sort.c @@ -34,7 +34,7 @@ void bucketSort(float nums[], int size) { // 1. 将数组元素分配到各个桶中 for (int i = 0; i < size; i++) { - // 输入数据范围 [0, 1),使用 num * k 映射到索引范围 [0, k-1] + // 输入数据范围为 [0, 1),使用 num * k 映射到索引范围 [0, k-1] int bucket_idx = nums[i] * k; int j = 0; // 如果桶中有数据且数据小于当前值 nums[i], 要将其放到当前桶的后面,相当于 cpp 中的 push_back diff --git a/codes/c/chapter_sorting/heap_sort.c b/codes/c/chapter_sorting/heap_sort.c index 6af0a63fb..baa65f24f 100644 --- a/codes/c/chapter_sorting/heap_sort.c +++ b/codes/c/chapter_sorting/heap_sort.c @@ -38,7 +38,7 @@ void heapSort(int nums[], int n) { } // 从堆中提取最大元素,循环 n-1 轮 for (int i = n - 1; i > 0; --i) { - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) int tmp = nums[0]; nums[0] = nums[i]; nums[i] = tmp; diff --git a/codes/c/chapter_sorting/quick_sort.c b/codes/c/chapter_sorting/quick_sort.c index c8ae9a7f8..7fe861803 100644 --- a/codes/c/chapter_sorting/quick_sort.c +++ b/codes/c/chapter_sorting/quick_sort.c @@ -16,7 +16,7 @@ void swap(int nums[], int i, int j) { /* 快速排序类 */ // 快速排序类-哨兵划分 int partition(int nums[], int left, int right) { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) { @@ -68,7 +68,7 @@ int partitionMedian(int nums[], int left, int right) { int med = medianThree(nums, left, (left + right) / 2, right); // 将中位数交换至数组最左端 swap(nums, left, med); - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) @@ -100,7 +100,7 @@ void quickSortTailCall(int nums[], int left, int right) { while (left < right) { // 哨兵划分操作 int pivot = partition(nums, left, right); - // 对两个子数组中较短的那个执行快排 + // 对两个子数组中较短的那个执行快速排序 if (pivot - left < right - pivot) { quickSortTailCall(nums, left, pivot - 1); // 递归排序左子数组 left = pivot + 1; // 剩余未排序区间为 [pivot + 1, right] diff --git a/codes/c/chapter_sorting/radix_sort.c b/codes/c/chapter_sorting/radix_sort.c index be74e6dbc..2a201a23e 100644 --- a/codes/c/chapter_sorting/radix_sort.c +++ b/codes/c/chapter_sorting/radix_sort.c @@ -14,7 +14,7 @@ int digit(int num, int exp) { /* 计数排序(根据 nums 第 k 位排序) */ void countingSortDigit(int nums[], int size, int exp) { - // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶 + // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶数组 int *counter = (int *)malloc((sizeof(int) * 10)); // 统计 0~9 各数字的出现次数 for (int i = 0; i < size; i++) { diff --git a/codes/c/chapter_stack_and_queue/linkedlist_deque.c b/codes/c/chapter_stack_and_queue/linkedlist_deque.c index 6501d4af1..53569ec6f 100644 --- a/codes/c/chapter_stack_and_queue/linkedlist_deque.c +++ b/codes/c/chapter_stack_and_queue/linkedlist_deque.c @@ -67,7 +67,7 @@ bool empty(LinkedListDeque *deque) { /* 入队 */ void push(LinkedListDeque *deque, int num, bool isFront) { DoublyListNode *node = newDoublyListNode(num); - // 若链表为空,则令 front, rear 都指向node + // 若链表为空,则令 front 和 rear 都指向node if (empty(deque)) { deque->front = deque->rear = node; } diff --git a/codes/c/chapter_tree/binary_tree.c b/codes/c/chapter_tree/binary_tree.c index 58f60546b..3472391dc 100644 --- a/codes/c/chapter_tree/binary_tree.c +++ b/codes/c/chapter_tree/binary_tree.c @@ -15,7 +15,7 @@ int main() { TreeNode *n3 = newTreeNode(3); TreeNode *n4 = newTreeNode(4); TreeNode *n5 = newTreeNode(5); - // 构建引用指向(即指针) + // 构建节点之间的引用(指针) n1->left = n2; n1->right = n3; n2->left = n4; diff --git a/codes/cpp/chapter_array_and_linkedlist/array.cpp b/codes/cpp/chapter_array_and_linkedlist/array.cpp index e3507840d..20840f55c 100644 --- a/codes/cpp/chapter_array_and_linkedlist/array.cpp +++ b/codes/cpp/chapter_array_and_linkedlist/array.cpp @@ -35,11 +35,11 @@ void insert(int *nums, int size, int num, int index) { for (int i = size - 1; i > index; i--) { nums[i] = nums[i - 1]; } - // 将 num 赋给 index 处元素 + // 将 num 赋给 index 处的元素 nums[index] = num; } -/* 删除索引 index 处元素 */ +/* 删除索引 index 处的元素 */ void remove(int *nums, int size, int index) { // 把索引 index 之后的所有元素向前移动一位 for (int i = index; i < size - 1; i++) { diff --git a/codes/cpp/chapter_array_and_linkedlist/linked_list.cpp b/codes/cpp/chapter_array_and_linkedlist/linked_list.cpp index ecf3615cd..9e54cf841 100644 --- a/codes/cpp/chapter_array_and_linkedlist/linked_list.cpp +++ b/codes/cpp/chapter_array_and_linkedlist/linked_list.cpp @@ -56,7 +56,7 @@ int main() { ListNode *n2 = new ListNode(2); ListNode *n3 = new ListNode(5); ListNode *n4 = new ListNode(4); - // 构建引用指向 + // 构建节点之间的引用 n0->next = n1; n1->next = n2; n2->next = n3; diff --git a/codes/cpp/chapter_array_and_linkedlist/list.cpp b/codes/cpp/chapter_array_and_linkedlist/list.cpp index cd10c0ca1..e58cf663f 100644 --- a/codes/cpp/chapter_array_and_linkedlist/list.cpp +++ b/codes/cpp/chapter_array_and_linkedlist/list.cpp @@ -27,7 +27,7 @@ int main() { cout << "清空列表后 nums = "; printVector(nums); - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.push_back(1); nums.push_back(3); nums.push_back(2); @@ -36,7 +36,7 @@ int main() { cout << "添加元素后 nums = "; printVector(nums); - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.insert(nums.begin() + 3, 6); cout << "在索引 3 处插入数字 6 ,得到 nums = "; printVector(nums); diff --git a/codes/cpp/chapter_array_and_linkedlist/my_list.cpp b/codes/cpp/chapter_array_and_linkedlist/my_list.cpp index 96b46cfca..5fe40790a 100644 --- a/codes/cpp/chapter_array_and_linkedlist/my_list.cpp +++ b/codes/cpp/chapter_array_and_linkedlist/my_list.cpp @@ -6,12 +6,12 @@ #include "../utils/common.hpp" -/* 列表类简易实现 */ +/* 列表类 */ class MyList { private: int *arr; // 数组(存储列表元素) int arrCapacity = 10; // 列表容量 - int arrSize = 0; // 列表长度(即当前元素数量) + int arrSize = 0; // 列表长度(当前元素数量) int extendRatio = 2; // 每次列表扩容的倍数 public: @@ -25,7 +25,7 @@ class MyList { delete[] arr; } - /* 获取列表长度(即当前元素数量)*/ + /* 获取列表长度(当前元素数量)*/ int size() { return arrSize; } @@ -50,7 +50,7 @@ class MyList { arr[index] = num; } - /* 尾部添加元素 */ + /* 在尾部添加元素 */ void add(int num) { // 元素数量超出容量时,触发扩容机制 if (size() == capacity()) @@ -60,7 +60,7 @@ class MyList { arrSize++; } - /* 中间插入元素 */ + /* 在中间插入元素 */ void insert(int index, int num) { if (index < 0 || index >= size()) throw out_of_range("索引越界"); @@ -121,7 +121,7 @@ class MyList { int main() { /* 初始化列表 */ MyList *nums = new MyList(); - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums->add(1); nums->add(3); nums->add(2); @@ -132,7 +132,7 @@ int main() { printVector(vec); cout << "容量 = " << nums->capacity() << " ,长度 = " << nums->size() << endl; - /* 中间插入元素 */ + /* 在中间插入元素 */ nums->insert(3, 6); cout << "在索引 3 处插入数字 6 ,得到 nums = "; vec = nums->toVector(); diff --git a/codes/cpp/chapter_backtracking/n_queens.cpp b/codes/cpp/chapter_backtracking/n_queens.cpp index afb9e229d..8d4d7c87d 100644 --- a/codes/cpp/chapter_backtracking/n_queens.cpp +++ b/codes/cpp/chapter_backtracking/n_queens.cpp @@ -19,7 +19,7 @@ void backtrack(int row, int n, vector> &state, vector>> nQueens(int n) { // 初始化 n*n 大小的棋盘,其中 'Q' 代表皇后,'#' 代表空位 vector> state(n, vector(n, "#")); vector cols(n, false); // 记录列是否有皇后 - vector diags1(2 * n - 1, false); // 记录主对角线是否有皇后 - vector diags2(2 * n - 1, false); // 记录副对角线是否有皇后 + vector diags1(2 * n - 1, false); // 记录主对角线上是否有皇后 + vector diags2(2 * n - 1, false); // 记录副对角线上是否有皇后 vector>> res; backtrack(0, n, state, res, cols, diags1, diags2); diff --git a/codes/cpp/chapter_computational_complexity/iteration.cpp b/codes/cpp/chapter_computational_complexity/iteration.cpp index f17a27e85..2bccbc151 100644 --- a/codes/cpp/chapter_computational_complexity/iteration.cpp +++ b/codes/cpp/chapter_computational_complexity/iteration.cpp @@ -32,7 +32,7 @@ int whileLoop(int n) { int whileLoopII(int n) { int res = 0; int i = 1; // 初始化条件变量 - // 循环求和 1, 4, ... + // 循环求和 1, 4, 10, ... while (i <= n) { res += i; // 更新条件变量 diff --git a/codes/cpp/chapter_divide_and_conquer/hanota.cpp b/codes/cpp/chapter_divide_and_conquer/hanota.cpp index a27bbe516..4300bce1b 100644 --- a/codes/cpp/chapter_divide_and_conquer/hanota.cpp +++ b/codes/cpp/chapter_divide_and_conquer/hanota.cpp @@ -15,7 +15,7 @@ void move(vector &src, vector &tar) { tar.push_back(pan); } -/* 求解汉诺塔:问题 f(i) */ +/* 求解汉诺塔问题 f(i) */ void dfs(int i, vector &src, vector &buf, vector &tar) { // 若 src 只剩下一个圆盘,则直接将其移到 tar if (i == 1) { @@ -30,7 +30,7 @@ void dfs(int i, vector &src, vector &buf, vector &tar) { dfs(i - 1, buf, src, tar); } -/* 求解汉诺塔 */ +/* 求解汉诺塔问题 */ void solveHanota(vector &A, vector &B, vector &C) { int n = A.size(); // 将 A 顶部 n 个圆盘借助 B 移到 C diff --git a/codes/cpp/chapter_dynamic_programming/climbing_stairs_backtrack.cpp b/codes/cpp/chapter_dynamic_programming/climbing_stairs_backtrack.cpp index 7e7e352b1..3fde4dbb2 100644 --- a/codes/cpp/chapter_dynamic_programming/climbing_stairs_backtrack.cpp +++ b/codes/cpp/chapter_dynamic_programming/climbing_stairs_backtrack.cpp @@ -25,7 +25,7 @@ void backtrack(vector &choices, int state, int n, vector &res) { /* 爬楼梯:回溯 */ int climbingStairsBacktrack(int n) { - vector choices = {1, 2}; // 可选择向上爬 1 或 2 阶 + vector choices = {1, 2}; // 可选择向上爬 1 阶或 2 阶 int state = 0; // 从第 0 阶开始爬 vector res = {0}; // 使用 res[0] 记录方案数量 backtrack(choices, state, n, res); diff --git a/codes/cpp/chapter_dynamic_programming/coin_change.cpp b/codes/cpp/chapter_dynamic_programming/coin_change.cpp index db84c7dea..ea145549b 100644 --- a/codes/cpp/chapter_dynamic_programming/coin_change.cpp +++ b/codes/cpp/chapter_dynamic_programming/coin_change.cpp @@ -16,7 +16,7 @@ int coinChangeDP(vector &coins, int amt) { for (int a = 1; a <= amt; a++) { dp[0][a] = MAX; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (int i = 1; i <= n; i++) { for (int a = 1; a <= amt; a++) { if (coins[i - 1] > a) { diff --git a/codes/cpp/chapter_dynamic_programming/edit_distance.cpp b/codes/cpp/chapter_dynamic_programming/edit_distance.cpp index 5f92d1fc1..61ab5c2b9 100644 --- a/codes/cpp/chapter_dynamic_programming/edit_distance.cpp +++ b/codes/cpp/chapter_dynamic_programming/edit_distance.cpp @@ -65,7 +65,7 @@ int editDistanceDP(string s, string t) { for (int j = 1; j <= m; j++) { dp[0][j] = j; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (s[i - 1] == t[j - 1]) { diff --git a/codes/cpp/chapter_dynamic_programming/knapsack.cpp b/codes/cpp/chapter_dynamic_programming/knapsack.cpp index 0c32c50b1..a0848c8ea 100644 --- a/codes/cpp/chapter_dynamic_programming/knapsack.cpp +++ b/codes/cpp/chapter_dynamic_programming/knapsack.cpp @@ -6,11 +6,11 @@ using namespace std; /* 0-1 背包:暴力搜索 */ int knapsackDFS(vector &wgt, vector &val, int i, int c) { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i == 0 || c == 0) { return 0; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (wgt[i - 1] > c) { return knapsackDFS(wgt, val, i - 1, c); } @@ -23,7 +23,7 @@ int knapsackDFS(vector &wgt, vector &val, int i, int c) { /* 0-1 背包:记忆化搜索 */ int knapsackDFSMem(vector &wgt, vector &val, vector> &mem, int i, int c) { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i == 0 || c == 0) { return 0; } @@ -31,7 +31,7 @@ int knapsackDFSMem(vector &wgt, vector &val, vector> &mem, if (mem[i][c] != -1) { return mem[i][c]; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (wgt[i - 1] > c) { return knapsackDFSMem(wgt, val, mem, i - 1, c); } diff --git a/codes/cpp/chapter_dynamic_programming/min_path_sum.cpp b/codes/cpp/chapter_dynamic_programming/min_path_sum.cpp index f31f8fa34..508f27619 100644 --- a/codes/cpp/chapter_dynamic_programming/min_path_sum.cpp +++ b/codes/cpp/chapter_dynamic_programming/min_path_sum.cpp @@ -59,7 +59,7 @@ int minPathSumDP(vector> &grid) { for (int i = 1; i < n; i++) { dp[i][0] = dp[i - 1][0] + grid[i][0]; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (int i = 1; i < n; i++) { for (int j = 1; j < m; j++) { dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; diff --git a/codes/cpp/chapter_graph/graph_adjacency_list.cpp b/codes/cpp/chapter_graph/graph_adjacency_list.cpp index 4fe4c4572..9176dfc29 100644 --- a/codes/cpp/chapter_graph/graph_adjacency_list.cpp +++ b/codes/cpp/chapter_graph/graph_adjacency_list.cpp @@ -9,7 +9,7 @@ /* 基于邻接表实现的无向图类 */ class GraphAdjList { public: - // 邻接表,key: 顶点,value:该顶点的所有邻接顶点 + // 邻接表,key:顶点,value:该顶点的所有邻接顶点 unordered_map> adjList; /* 在 vector 中删除指定节点 */ diff --git a/codes/cpp/chapter_graph/graph_adjacency_matrix.cpp b/codes/cpp/chapter_graph/graph_adjacency_matrix.cpp index a935ca889..91d51a6bf 100644 --- a/codes/cpp/chapter_graph/graph_adjacency_matrix.cpp +++ b/codes/cpp/chapter_graph/graph_adjacency_matrix.cpp @@ -65,7 +65,7 @@ class GraphAdjMat { if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) { throw out_of_range("顶点不存在"); } - // 在无向图中,邻接矩阵沿主对角线对称,即满足 (i, j) == (j, i) + // 在无向图中,邻接矩阵关于主对角线对称,即满足 (i, j) == (j, i) adjMat[i][j] = 1; adjMat[j][i] = 1; } diff --git a/codes/cpp/chapter_graph/graph_bfs.cpp b/codes/cpp/chapter_graph/graph_bfs.cpp index 9106df884..717579efd 100644 --- a/codes/cpp/chapter_graph/graph_bfs.cpp +++ b/codes/cpp/chapter_graph/graph_bfs.cpp @@ -25,7 +25,7 @@ vector graphBFS(GraphAdjList &graph, Vertex *startVet) { // 遍历该顶点的所有邻接顶点 for (auto adjVet : graph.adjList[vet]) { if (visited.count(adjVet)) - continue; // 跳过已被访问过的顶点 + continue; // 跳过已被访问的顶点 que.push(adjVet); // 只入队未访问的顶点 visited.emplace(adjVet); // 标记该顶点已被访问 } diff --git a/codes/cpp/chapter_graph/graph_dfs.cpp b/codes/cpp/chapter_graph/graph_dfs.cpp index d32811240..533897f54 100644 --- a/codes/cpp/chapter_graph/graph_dfs.cpp +++ b/codes/cpp/chapter_graph/graph_dfs.cpp @@ -14,7 +14,7 @@ void dfs(GraphAdjList &graph, unordered_set &visited, vector // 遍历该顶点的所有邻接顶点 for (Vertex *adjVet : graph.adjList[vet]) { if (visited.count(adjVet)) - continue; // 跳过已被访问过的顶点 + continue; // 跳过已被访问的顶点 // 递归访问邻接顶点 dfs(graph, visited, res, adjVet); } diff --git a/codes/cpp/chapter_hashing/array_hash_map.cpp b/codes/cpp/chapter_hashing/array_hash_map.cpp index 6f339d6f1..96a1a140d 100644 --- a/codes/cpp/chapter_hashing/array_hash_map.cpp +++ b/codes/cpp/chapter_hashing/array_hash_map.cpp @@ -17,7 +17,7 @@ struct Pair { } }; -/* 基于数组简易实现的哈希表 */ +/* 基于数组实现的哈希表 */ class ArrayHashMap { private: vector buckets; diff --git a/codes/cpp/chapter_heap/my_heap.cpp b/codes/cpp/chapter_heap/my_heap.cpp index b32e07584..b3b75fec4 100644 --- a/codes/cpp/chapter_heap/my_heap.cpp +++ b/codes/cpp/chapter_heap/my_heap.cpp @@ -24,7 +24,7 @@ class MaxHeap { /* 获取父节点索引 */ int parent(int i) { - return (i - 1) / 2; // 向下取整 + return (i - 1) / 2; // 向下整除 } /* 从节点 i 开始,从底至顶堆化 */ @@ -100,7 +100,7 @@ class MaxHeap { if (isEmpty()) { throw out_of_range("堆为空"); } - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) swap(maxHeap[0], maxHeap[size() - 1]); // 删除节点 maxHeap.pop_back(); diff --git a/codes/cpp/chapter_searching/binary_search.cpp b/codes/cpp/chapter_searching/binary_search.cpp index 5ddc0ae86..90781553c 100644 --- a/codes/cpp/chapter_searching/binary_search.cpp +++ b/codes/cpp/chapter_searching/binary_search.cpp @@ -24,9 +24,9 @@ int binarySearch(vector &nums, int target) { return -1; } -/* 二分查找(左闭右开) */ +/* 二分查找(左闭右开区间) */ int binarySearchLCRO(vector &nums, int target) { - // 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 + // 初始化左闭右开区间 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 int i = 0, j = nums.size(); // 循环,当搜索区间为空时跳出(当 i = j 时为空) while (i < j) { @@ -51,7 +51,7 @@ int main() { int index = binarySearch(nums, target); cout << "目标元素 6 的索引 = " << index << endl; - /* 二分查找(左闭右开) */ + /* 二分查找(左闭右开区间) */ index = binarySearchLCRO(nums, target); cout << "目标元素 6 的索引 = " << index << endl; diff --git a/codes/cpp/chapter_searching/two_sum.cpp b/codes/cpp/chapter_searching/two_sum.cpp index ff012a05b..933f7de18 100644 --- a/codes/cpp/chapter_searching/two_sum.cpp +++ b/codes/cpp/chapter_searching/two_sum.cpp @@ -9,7 +9,7 @@ /* 方法一:暴力枚举 */ vector twoSumBruteForce(vector &nums, int target) { int size = nums.size(); - // 两层循环,时间复杂度 O(n^2) + // 两层循环,时间复杂度为 O(n^2) for (int i = 0; i < size - 1; i++) { for (int j = i + 1; j < size; j++) { if (nums[i] + nums[j] == target) @@ -22,9 +22,9 @@ vector twoSumBruteForce(vector &nums, int target) { /* 方法二:辅助哈希表 */ vector twoSumHashTable(vector &nums, int target) { int size = nums.size(); - // 辅助哈希表,空间复杂度 O(n) + // 辅助哈希表,空间复杂度为 O(n) unordered_map dic; - // 单层循环,时间复杂度 O(n) + // 单层循环,时间复杂度为 O(n) for (int i = 0; i < size; i++) { if (dic.find(target - nums[i]) != dic.end()) { return {dic[target - nums[i]], i}; diff --git a/codes/cpp/chapter_sorting/bucket_sort.cpp b/codes/cpp/chapter_sorting/bucket_sort.cpp index 8e5cb472b..2f3dcc2da 100644 --- a/codes/cpp/chapter_sorting/bucket_sort.cpp +++ b/codes/cpp/chapter_sorting/bucket_sort.cpp @@ -13,7 +13,7 @@ void bucketSort(vector &nums) { vector> buckets(k); // 1. 将数组元素分配到各个桶中 for (float num : nums) { - // 输入数据范围 [0, 1),使用 num * k 映射到索引范围 [0, k-1] + // 输入数据范围为 [0, 1),使用 num * k 映射到索引范围 [0, k-1] int i = num * k; // 将 num 添加进桶 bucket_idx buckets[i].push_back(num); diff --git a/codes/cpp/chapter_sorting/heap_sort.cpp b/codes/cpp/chapter_sorting/heap_sort.cpp index 8df0dbc2a..a80b14a43 100644 --- a/codes/cpp/chapter_sorting/heap_sort.cpp +++ b/codes/cpp/chapter_sorting/heap_sort.cpp @@ -36,7 +36,7 @@ void heapSort(vector &nums) { } // 从堆中提取最大元素,循环 n-1 轮 for (int i = nums.size() - 1; i > 0; --i) { - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) swap(nums[0], nums[i]); // 以根节点为起点,从顶至底进行堆化 siftDown(nums, i, 0); diff --git a/codes/cpp/chapter_sorting/quick_sort.cpp b/codes/cpp/chapter_sorting/quick_sort.cpp index 8b6ebb038..b6d1dc231 100644 --- a/codes/cpp/chapter_sorting/quick_sort.cpp +++ b/codes/cpp/chapter_sorting/quick_sort.cpp @@ -18,7 +18,7 @@ class QuickSort { /* 哨兵划分 */ static int partition(vector &nums, int left, int right) { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) @@ -73,7 +73,7 @@ class QuickSortMedian { int med = medianThree(nums, left, (left + right) / 2, right); // 将中位数交换至数组最左端 swap(nums, left, med); - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) @@ -112,7 +112,7 @@ class QuickSortTailCall { /* 哨兵划分 */ static int partition(vector &nums, int left, int right) { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) @@ -132,7 +132,7 @@ class QuickSortTailCall { while (left < right) { // 哨兵划分操作 int pivot = partition(nums, left, right); - // 对两个子数组中较短的那个执行快排 + // 对两个子数组中较短的那个执行快速排序 if (pivot - left < right - pivot) { quickSort(nums, left, pivot - 1); // 递归排序左子数组 left = pivot + 1; // 剩余未排序区间为 [pivot + 1, right] diff --git a/codes/cpp/chapter_sorting/radix_sort.cpp b/codes/cpp/chapter_sorting/radix_sort.cpp index 927922c17..0c92c086f 100644 --- a/codes/cpp/chapter_sorting/radix_sort.cpp +++ b/codes/cpp/chapter_sorting/radix_sort.cpp @@ -14,7 +14,7 @@ int digit(int num, int exp) { /* 计数排序(根据 nums 第 k 位排序) */ void countingSortDigit(vector &nums, int exp) { - // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶 + // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶数组 vector counter(10, 0); int n = nums.size(); // 统计 0~9 各数字的出现次数 diff --git a/codes/cpp/chapter_stack_and_queue/linkedlist_deque.cpp b/codes/cpp/chapter_stack_and_queue/linkedlist_deque.cpp index 4c1bb8726..d9cc953ed 100644 --- a/codes/cpp/chapter_stack_and_queue/linkedlist_deque.cpp +++ b/codes/cpp/chapter_stack_and_queue/linkedlist_deque.cpp @@ -50,7 +50,7 @@ class LinkedListDeque { /* 入队操作 */ void push(int num, bool isFront) { DoublyListNode *node = new DoublyListNode(num); - // 若链表为空,则令 front, rear 都指向 node + // 若链表为空,则令 front 和 rear 都指向 node if (isEmpty()) front = rear = node; // 队首入队操作 diff --git a/codes/cpp/chapter_tree/binary_tree.cpp b/codes/cpp/chapter_tree/binary_tree.cpp index 55d1ef777..c783f9a4a 100644 --- a/codes/cpp/chapter_tree/binary_tree.cpp +++ b/codes/cpp/chapter_tree/binary_tree.cpp @@ -15,7 +15,7 @@ int main() { TreeNode *n3 = new TreeNode(3); TreeNode *n4 = new TreeNode(4); TreeNode *n5 = new TreeNode(5); - // 构建引用指向(即指针) + // 构建节点之间的引用(指针) n1->left = n2; n1->right = n3; n2->left = n4; diff --git a/codes/csharp/chapter_array_and_linkedlist/array.cs b/codes/csharp/chapter_array_and_linkedlist/array.cs index 5b8fcd38c..ec8487f89 100644 --- a/codes/csharp/chapter_array_and_linkedlist/array.cs +++ b/codes/csharp/chapter_array_and_linkedlist/array.cs @@ -33,11 +33,11 @@ public class array { for (int i = nums.Length - 1; i > index; i--) { nums[i] = nums[i - 1]; } - // 将 num 赋给 index 处元素 + // 将 num 赋给 index 处的元素 nums[index] = num; } - /* 删除索引 index 处元素 */ + /* 删除索引 index 处的元素 */ void Remove(int[] nums, int index) { // 把索引 index 之后的所有元素向前移动一位 for (int i = index; i < nums.Length - 1; i++) { diff --git a/codes/csharp/chapter_array_and_linkedlist/linked_list.cs b/codes/csharp/chapter_array_and_linkedlist/linked_list.cs index 2da7bd872..65db5ed23 100644 --- a/codes/csharp/chapter_array_and_linkedlist/linked_list.cs +++ b/codes/csharp/chapter_array_and_linkedlist/linked_list.cs @@ -54,7 +54,7 @@ public class linked_list { ListNode n2 = new(2); ListNode n3 = new(5); ListNode n4 = new(4); - // 构建引用指向 + // 构建节点之间的引用 n0.next = n1; n1.next = n2; n2.next = n3; diff --git a/codes/csharp/chapter_array_and_linkedlist/list.cs b/codes/csharp/chapter_array_and_linkedlist/list.cs index 1bd2a92c0..1c11ac17e 100644 --- a/codes/csharp/chapter_array_and_linkedlist/list.cs +++ b/codes/csharp/chapter_array_and_linkedlist/list.cs @@ -27,7 +27,7 @@ public class list { nums.Clear(); Console.WriteLine("清空列表后 nums = " + string.Join(",", nums)); - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.Add(1); nums.Add(3); nums.Add(2); @@ -35,7 +35,7 @@ public class list { nums.Add(4); Console.WriteLine("添加元素后 nums = " + string.Join(",", nums)); - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.Insert(3, 6); Console.WriteLine("在索引 3 处插入数字 6 ,得到 nums = " + string.Join(",", nums)); diff --git a/codes/csharp/chapter_array_and_linkedlist/my_list.cs b/codes/csharp/chapter_array_and_linkedlist/my_list.cs index 89890eaf8..40df4f46e 100644 --- a/codes/csharp/chapter_array_and_linkedlist/my_list.cs +++ b/codes/csharp/chapter_array_and_linkedlist/my_list.cs @@ -6,11 +6,11 @@ namespace hello_algo.chapter_array_and_linkedlist; -/* 列表类简易实现 */ +/* 列表类 */ class MyList { private int[] arr; // 数组(存储列表元素) private int arrCapacity = 10; // 列表容量 - private int arrSize = 0; // 列表长度(即当前元素数量) + private int arrSize = 0; // 列表长度(当前元素数量) private readonly int extendRatio = 2; // 每次列表扩容的倍数 /* 构造方法 */ @@ -18,7 +18,7 @@ class MyList { arr = new int[arrCapacity]; } - /* 获取列表长度(即当前元素数量)*/ + /* 获取列表长度(当前元素数量)*/ public int Size() { return arrSize; } @@ -43,7 +43,7 @@ class MyList { arr[index] = num; } - /* 尾部添加元素 */ + /* 在尾部添加元素 */ public void Add(int num) { // 元素数量超出容量时,触发扩容机制 if (arrSize == arrCapacity) @@ -53,7 +53,7 @@ class MyList { arrSize++; } - /* 中间插入元素 */ + /* 在中间插入元素 */ public void Insert(int index, int num) { if (index < 0 || index >= arrSize) throw new IndexOutOfRangeException("索引越界"); @@ -108,7 +108,7 @@ public class my_list { public void Test() { /* 初始化列表 */ MyList nums = new(); - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.Add(1); nums.Add(3); nums.Add(2); @@ -117,7 +117,7 @@ public class my_list { Console.WriteLine("列表 nums = " + string.Join(",", nums.ToArray()) + " ,容量 = " + nums.Capacity() + " ,长度 = " + nums.Size()); - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.Insert(3, 6); Console.WriteLine("在索引 3 处插入数字 6 ,得到 nums = " + string.Join(",", nums.ToArray())); diff --git a/codes/csharp/chapter_backtracking/n_queens.cs b/codes/csharp/chapter_backtracking/n_queens.cs index 84fa22c61..80f15bd5f 100644 --- a/codes/csharp/chapter_backtracking/n_queens.cs +++ b/codes/csharp/chapter_backtracking/n_queens.cs @@ -24,7 +24,7 @@ public class n_queens { // 计算该格子对应的主对角线和副对角线 int diag1 = row - col + n - 1; int diag2 = row + col; - // 剪枝:不允许该格子所在列、主对角线、副对角线存在皇后 + // 剪枝:不允许该格子所在列、主对角线、副对角线上存在皇后 if (!cols[col] && !diags1[diag1] && !diags2[diag2]) { // 尝试:将皇后放置在该格子 state[row][col] = "Q"; @@ -50,8 +50,8 @@ public class n_queens { state.Add(row); } bool[] cols = new bool[n]; // 记录列是否有皇后 - bool[] diags1 = new bool[2 * n - 1]; // 记录主对角线是否有皇后 - bool[] diags2 = new bool[2 * n - 1]; // 记录副对角线是否有皇后 + bool[] diags1 = new bool[2 * n - 1]; // 记录主对角线上是否有皇后 + bool[] diags2 = new bool[2 * n - 1]; // 记录副对角线上是否有皇后 List>> res = []; Backtrack(0, n, state, res, cols, diags1, diags2); diff --git a/codes/csharp/chapter_divide_and_conquer/hanota.cs b/codes/csharp/chapter_divide_and_conquer/hanota.cs index c112fbeaa..230d6c2be 100644 --- a/codes/csharp/chapter_divide_and_conquer/hanota.cs +++ b/codes/csharp/chapter_divide_and_conquer/hanota.cs @@ -16,7 +16,7 @@ public class hanota { tar.Add(pan); } - /* 求解汉诺塔:问题 f(i) */ + /* 求解汉诺塔问题 f(i) */ void DFS(int i, List src, List buf, List tar) { // 若 src 只剩下一个圆盘,则直接将其移到 tar if (i == 1) { @@ -31,7 +31,7 @@ public class hanota { DFS(i - 1, buf, src, tar); } - /* 求解汉诺塔 */ + /* 求解汉诺塔问题 */ void SolveHanota(List A, List B, List C) { int n = A.Count; // 将 A 顶部 n 个圆盘借助 B 移到 C diff --git a/codes/csharp/chapter_dynamic_programming/climbing_stairs_backtrack.cs b/codes/csharp/chapter_dynamic_programming/climbing_stairs_backtrack.cs index d7ee0baa5..41e4f14a2 100644 --- a/codes/csharp/chapter_dynamic_programming/climbing_stairs_backtrack.cs +++ b/codes/csharp/chapter_dynamic_programming/climbing_stairs_backtrack.cs @@ -25,7 +25,7 @@ public class climbing_stairs_backtrack { /* 爬楼梯:回溯 */ int ClimbingStairsBacktrack(int n) { - List choices = [1, 2]; // 可选择向上爬 1 或 2 阶 + List choices = [1, 2]; // 可选择向上爬 1 阶或 2 阶 int state = 0; // 从第 0 阶开始爬 List res = [0]; // 使用 res[0] 记录方案数量 Backtrack(choices, state, n, res); diff --git a/codes/csharp/chapter_dynamic_programming/coin_change.cs b/codes/csharp/chapter_dynamic_programming/coin_change.cs index 43b32aef9..7810f39ca 100644 --- a/codes/csharp/chapter_dynamic_programming/coin_change.cs +++ b/codes/csharp/chapter_dynamic_programming/coin_change.cs @@ -17,7 +17,7 @@ public class coin_change { for (int a = 1; a <= amt; a++) { dp[0, a] = MAX; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (int i = 1; i <= n; i++) { for (int a = 1; a <= amt; a++) { if (coins[i - 1] > a) { diff --git a/codes/csharp/chapter_dynamic_programming/edit_distance.cs b/codes/csharp/chapter_dynamic_programming/edit_distance.cs index e7835343f..243811a23 100644 --- a/codes/csharp/chapter_dynamic_programming/edit_distance.cs +++ b/codes/csharp/chapter_dynamic_programming/edit_distance.cs @@ -66,7 +66,7 @@ public class edit_distance { for (int j = 1; j <= m; j++) { dp[0, j] = j; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (s[i - 1] == t[j - 1]) { diff --git a/codes/csharp/chapter_dynamic_programming/knapsack.cs b/codes/csharp/chapter_dynamic_programming/knapsack.cs index b78657856..fabb81e49 100644 --- a/codes/csharp/chapter_dynamic_programming/knapsack.cs +++ b/codes/csharp/chapter_dynamic_programming/knapsack.cs @@ -9,11 +9,11 @@ namespace hello_algo.chapter_dynamic_programming; public class knapsack { /* 0-1 背包:暴力搜索 */ int KnapsackDFS(int[] weight, int[] val, int i, int c) { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i == 0 || c == 0) { return 0; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (weight[i - 1] > c) { return KnapsackDFS(weight, val, i - 1, c); } @@ -26,7 +26,7 @@ public class knapsack { /* 0-1 背包:记忆化搜索 */ int KnapsackDFSMem(int[] weight, int[] val, int[][] mem, int i, int c) { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i == 0 || c == 0) { return 0; } @@ -34,7 +34,7 @@ public class knapsack { if (mem[i][c] != -1) { return mem[i][c]; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (weight[i - 1] > c) { return KnapsackDFSMem(weight, val, mem, i - 1, c); } diff --git a/codes/csharp/chapter_dynamic_programming/min_path_sum.cs b/codes/csharp/chapter_dynamic_programming/min_path_sum.cs index dd95b91b8..bfb75291b 100644 --- a/codes/csharp/chapter_dynamic_programming/min_path_sum.cs +++ b/codes/csharp/chapter_dynamic_programming/min_path_sum.cs @@ -60,7 +60,7 @@ public class min_path_sum { for (int i = 1; i < n; i++) { dp[i, 0] = dp[i - 1, 0] + grid[i][0]; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (int i = 1; i < n; i++) { for (int j = 1; j < m; j++) { dp[i, j] = Math.Min(dp[i, j - 1], dp[i - 1, j]) + grid[i][j]; diff --git a/codes/csharp/chapter_graph/graph_adjacency_list.cs b/codes/csharp/chapter_graph/graph_adjacency_list.cs index 4e70234c5..89e0b1652 100644 --- a/codes/csharp/chapter_graph/graph_adjacency_list.cs +++ b/codes/csharp/chapter_graph/graph_adjacency_list.cs @@ -8,7 +8,7 @@ namespace hello_algo.chapter_graph; /* 基于邻接表实现的无向图类 */ public class GraphAdjList { - // 邻接表,key: 顶点,value:该顶点的所有邻接顶点 + // 邻接表,key:顶点,value:该顶点的所有邻接顶点 public Dictionary> adjList; /* 构造函数 */ diff --git a/codes/csharp/chapter_graph/graph_adjacency_matrix.cs b/codes/csharp/chapter_graph/graph_adjacency_matrix.cs index 5d5933d31..871cd9c05 100644 --- a/codes/csharp/chapter_graph/graph_adjacency_matrix.cs +++ b/codes/csharp/chapter_graph/graph_adjacency_matrix.cs @@ -68,7 +68,7 @@ class GraphAdjMat { // 索引越界与相等处理 if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j) throw new IndexOutOfRangeException(); - // 在无向图中,邻接矩阵沿主对角线对称,即满足 (i, j) == (j, i) + // 在无向图中,邻接矩阵关于主对角线对称,即满足 (i, j) == (j, i) adjMat[i][j] = 1; adjMat[j][i] = 1; } diff --git a/codes/csharp/chapter_graph/graph_bfs.cs b/codes/csharp/chapter_graph/graph_bfs.cs index 32b072bbf..2f4166ef3 100644 --- a/codes/csharp/chapter_graph/graph_bfs.cs +++ b/codes/csharp/chapter_graph/graph_bfs.cs @@ -23,7 +23,7 @@ public class graph_bfs { res.Add(vet); // 记录访问顶点 foreach (Vertex adjVet in graph.adjList[vet]) { if (visited.Contains(adjVet)) { - continue; // 跳过已被访问过的顶点 + continue; // 跳过已被访问的顶点 } que.Enqueue(adjVet); // 只入队未访问的顶点 visited.Add(adjVet); // 标记该顶点已被访问 diff --git a/codes/csharp/chapter_graph/graph_dfs.cs b/codes/csharp/chapter_graph/graph_dfs.cs index f0c5e7a72..336f3a724 100644 --- a/codes/csharp/chapter_graph/graph_dfs.cs +++ b/codes/csharp/chapter_graph/graph_dfs.cs @@ -14,7 +14,7 @@ public class graph_dfs { // 遍历该顶点的所有邻接顶点 foreach (Vertex adjVet in graph.adjList[vet]) { if (visited.Contains(adjVet)) { - continue; // 跳过已被访问过的顶点 + continue; // 跳过已被访问的顶点 } // 递归访问邻接顶点 DFS(graph, visited, res, adjVet); diff --git a/codes/csharp/chapter_hashing/array_hash_map.cs b/codes/csharp/chapter_hashing/array_hash_map.cs index 46c9b10ee..eff06175e 100644 --- a/codes/csharp/chapter_hashing/array_hash_map.cs +++ b/codes/csharp/chapter_hashing/array_hash_map.cs @@ -12,7 +12,7 @@ class Pair(int key, string val) { public string val = val; } -/* 基于数组简易实现的哈希表 */ +/* 基于数组实现的哈希表 */ class ArrayHashMap { List buckets; public ArrayHashMap() { diff --git a/codes/csharp/chapter_heap/my_heap.cs b/codes/csharp/chapter_heap/my_heap.cs index addf07c6c..c9369d951 100644 --- a/codes/csharp/chapter_heap/my_heap.cs +++ b/codes/csharp/chapter_heap/my_heap.cs @@ -85,7 +85,7 @@ class MaxHeap { // 判空处理 if (IsEmpty()) throw new IndexOutOfRangeException(); - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) Swap(0, Size() - 1); // 删除节点 int val = maxHeap.Last(); diff --git a/codes/csharp/chapter_searching/binary_search.cs b/codes/csharp/chapter_searching/binary_search.cs index 34e6defbc..f4cf8852c 100644 --- a/codes/csharp/chapter_searching/binary_search.cs +++ b/codes/csharp/chapter_searching/binary_search.cs @@ -25,9 +25,9 @@ public class binary_search { return -1; } - /* 二分查找(左闭右开) */ + /* 二分查找(左闭右开区间) */ int BinarySearchLCRO(int[] nums, int target) { - // 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 + // 初始化左闭右开区间 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 int i = 0, j = nums.Length; // 循环,当搜索区间为空时跳出(当 i = j 时为空) while (i < j) { @@ -52,7 +52,7 @@ public class binary_search { int index = BinarySearch(nums, target); Console.WriteLine("目标元素 6 的索引 = " + index); - /* 二分查找(左闭右开) */ + /* 二分查找(左闭右开区间) */ index = BinarySearchLCRO(nums, target); Console.WriteLine("目标元素 6 的索引 = " + index); } diff --git a/codes/csharp/chapter_searching/two_sum.cs b/codes/csharp/chapter_searching/two_sum.cs index 5fce6fff3..d463eeb21 100644 --- a/codes/csharp/chapter_searching/two_sum.cs +++ b/codes/csharp/chapter_searching/two_sum.cs @@ -10,7 +10,7 @@ public class two_sum { /* 方法一:暴力枚举 */ int[] TwoSumBruteForce(int[] nums, int target) { int size = nums.Length; - // 两层循环,时间复杂度 O(n^2) + // 两层循环,时间复杂度为 O(n^2) for (int i = 0; i < size - 1; i++) { for (int j = i + 1; j < size; j++) { if (nums[i] + nums[j] == target) @@ -23,9 +23,9 @@ public class two_sum { /* 方法二:辅助哈希表 */ int[] TwoSumHashTable(int[] nums, int target) { int size = nums.Length; - // 辅助哈希表,空间复杂度 O(n) + // 辅助哈希表,空间复杂度为 O(n) Dictionary dic = []; - // 单层循环,时间复杂度 O(n) + // 单层循环,时间复杂度为 O(n) for (int i = 0; i < size; i++) { if (dic.ContainsKey(target - nums[i])) { return [dic[target - nums[i]], i]; diff --git a/codes/csharp/chapter_sorting/bucket_sort.cs b/codes/csharp/chapter_sorting/bucket_sort.cs index 1cd5df43d..3fac83dbf 100644 --- a/codes/csharp/chapter_sorting/bucket_sort.cs +++ b/codes/csharp/chapter_sorting/bucket_sort.cs @@ -17,7 +17,7 @@ public class bucket_sort { } // 1. 将数组元素分配到各个桶中 foreach (float num in nums) { - // 输入数据范围 [0, 1),使用 num * k 映射到索引范围 [0, k-1] + // 输入数据范围为 [0, 1),使用 num * k 映射到索引范围 [0, k-1] int i = (int)(num * k); // 将 num 添加进桶 i buckets[i].Add(num); diff --git a/codes/csharp/chapter_sorting/heap_sort.cs b/codes/csharp/chapter_sorting/heap_sort.cs index 76be3e152..68df059f1 100644 --- a/codes/csharp/chapter_sorting/heap_sort.cs +++ b/codes/csharp/chapter_sorting/heap_sort.cs @@ -36,7 +36,7 @@ public class heap_sort { } // 从堆中提取最大元素,循环 n-1 轮 for (int i = nums.Length - 1; i > 0; i--) { - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) (nums[i], nums[0]) = (nums[0], nums[i]); // 以根节点为起点,从顶至底进行堆化 SiftDown(nums, i, 0); diff --git a/codes/csharp/chapter_sorting/quick_sort.cs b/codes/csharp/chapter_sorting/quick_sort.cs index bf4331043..f0fb4f328 100644 --- a/codes/csharp/chapter_sorting/quick_sort.cs +++ b/codes/csharp/chapter_sorting/quick_sort.cs @@ -14,7 +14,7 @@ class quickSort { /* 哨兵划分 */ static int Partition(int[] nums, int left, int right) { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) @@ -65,7 +65,7 @@ class QuickSortMedian { int med = MedianThree(nums, left, (left + right) / 2, right); // 将中位数交换至数组最左端 Swap(nums, left, med); - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) @@ -100,7 +100,7 @@ class QuickSortTailCall { /* 哨兵划分 */ static int Partition(int[] nums, int left, int right) { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) @@ -119,7 +119,7 @@ class QuickSortTailCall { while (left < right) { // 哨兵划分操作 int pivot = Partition(nums, left, right); - // 对两个子数组中较短的那个执行快排 + // 对两个子数组中较短的那个执行快速排序 if (pivot - left < right - pivot) { QuickSort(nums, left, pivot - 1); // 递归排序左子数组 left = pivot + 1; // 剩余未排序区间为 [pivot + 1, right] diff --git a/codes/csharp/chapter_sorting/radix_sort.cs b/codes/csharp/chapter_sorting/radix_sort.cs index 4c6c8f337..6b14e87ce 100644 --- a/codes/csharp/chapter_sorting/radix_sort.cs +++ b/codes/csharp/chapter_sorting/radix_sort.cs @@ -15,7 +15,7 @@ public class radix_sort { /* 计数排序(根据 nums 第 k 位排序) */ void CountingSortDigit(int[] nums, int exp) { - // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶 + // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶数组 int[] counter = new int[10]; int n = nums.Length; // 统计 0~9 各数字的出现次数 diff --git a/codes/csharp/chapter_stack_and_queue/linkedlist_deque.cs b/codes/csharp/chapter_stack_and_queue/linkedlist_deque.cs index 63cc409b2..d2c51c1a5 100644 --- a/codes/csharp/chapter_stack_and_queue/linkedlist_deque.cs +++ b/codes/csharp/chapter_stack_and_queue/linkedlist_deque.cs @@ -36,7 +36,7 @@ public class LinkedListDeque { /* 入队操作 */ void Push(int num, bool isFront) { ListNode node = new(num); - // 若链表为空,则令 front, rear 都指向 node + // 若链表为空,则令 front 和 rear 都指向 node if (IsEmpty()) { front = node; rear = node; diff --git a/codes/csharp/chapter_tree/binary_tree.cs b/codes/csharp/chapter_tree/binary_tree.cs index 156d6c935..08956de18 100644 --- a/codes/csharp/chapter_tree/binary_tree.cs +++ b/codes/csharp/chapter_tree/binary_tree.cs @@ -16,7 +16,7 @@ public class binary_tree { TreeNode n3 = new(3); TreeNode n4 = new(4); TreeNode n5 = new(5); - // 构建引用指向(即指针) + // 构建节点之间的引用(指针) n1.left = n2; n1.right = n3; n2.left = n4; diff --git a/codes/dart/chapter_array_and_linkedlist/array.dart b/codes/dart/chapter_array_and_linkedlist/array.dart index ffd835d45..60e065223 100644 --- a/codes/dart/chapter_array_and_linkedlist/array.dart +++ b/codes/dart/chapter_array_and_linkedlist/array.dart @@ -39,7 +39,7 @@ void insert(List nums, int _num, int index) { nums[index] = _num; } -/* 删除索引 index 处元素 */ +/* 删除索引 index 处的元素 */ void remove(List nums, int index) { // 把索引 index 之后的所有元素向前移动一位 for (var i = index; i < nums.length - 1; i++) { diff --git a/codes/dart/chapter_array_and_linkedlist/linked_list.dart b/codes/dart/chapter_array_and_linkedlist/linked_list.dart index bcc6f9868..fc304b363 100644 --- a/codes/dart/chapter_array_and_linkedlist/linked_list.dart +++ b/codes/dart/chapter_array_and_linkedlist/linked_list.dart @@ -54,7 +54,7 @@ void main() { ListNode n2 = ListNode(2); ListNode n3 = ListNode(5); ListNode n4 = ListNode(4); - // 构建引用指向 + // 构建节点之间的引用 n0.next = n1; n1.next = n2; n2.next = n3; diff --git a/codes/dart/chapter_array_and_linkedlist/list.dart b/codes/dart/chapter_array_and_linkedlist/list.dart index 050260a6f..bf80cee12 100644 --- a/codes/dart/chapter_array_and_linkedlist/list.dart +++ b/codes/dart/chapter_array_and_linkedlist/list.dart @@ -24,7 +24,7 @@ void main() { nums.clear(); print('清空列表后 nums = $nums'); - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.add(1); nums.add(3); nums.add(2); @@ -32,7 +32,7 @@ void main() { nums.add(4); print('添加元素后 nums = $nums'); - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.insert(3, 6); print('在索引 3 处插入数字 6 ,得到 nums = $nums'); diff --git a/codes/dart/chapter_array_and_linkedlist/my_list.dart b/codes/dart/chapter_array_and_linkedlist/my_list.dart index 4d54309a8..b3d102088 100644 --- a/codes/dart/chapter_array_and_linkedlist/my_list.dart +++ b/codes/dart/chapter_array_and_linkedlist/my_list.dart @@ -4,11 +4,11 @@ * Author: Jefferson (JeffersonHuang77@gmail.com) */ -/* 列表类简易实现 */ +/* 列表类 */ class MyList { late List _arr; // 数组(存储列表元素) int _capacity = 10; // 列表容量 - int _size = 0; // 列表长度(即当前元素数量) + int _size = 0; // 列表长度(当前元素数量) int _extendRatio = 2; // 每次列表扩容的倍数 /* 构造方法 */ @@ -16,7 +16,7 @@ class MyList { _arr = List.filled(_capacity, 0); } - /* 获取列表长度(即当前元素数量)*/ + /* 获取列表长度(当前元素数量)*/ int size() => _size; /* 获取列表容量 */ @@ -34,7 +34,7 @@ class MyList { _arr[index] = _num; } - /* 尾部添加元素 */ + /* 在尾部添加元素 */ void add(int _num) { // 元素数量超出容量时,触发扩容机制 if (_size == _capacity) extendCapacity(); @@ -43,7 +43,7 @@ class MyList { _size++; } - /* 中间插入元素 */ + /* 在中间插入元素 */ void insert(int index, int _num) { if (index >= _size) throw RangeError('索引越界'); // 元素数量超出容量时,触发扩容机制 @@ -97,7 +97,7 @@ class MyList { void main() { /* 初始化列表 */ MyList nums = MyList(); - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.add(1); nums.add(3); nums.add(2); @@ -106,7 +106,7 @@ void main() { print( '列表 nums = ${nums.toArray()} ,容量 = ${nums.capacity()} ,长度 = ${nums.size()}'); - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.insert(3, 6); print('在索引 3 处插入数字 6 ,得到 nums = ${nums.toArray()}'); diff --git a/codes/dart/chapter_backtracking/n_queens.dart b/codes/dart/chapter_backtracking/n_queens.dart index bff248f6d..0e865f056 100644 --- a/codes/dart/chapter_backtracking/n_queens.dart +++ b/codes/dart/chapter_backtracking/n_queens.dart @@ -28,7 +28,7 @@ void backtrack( // 计算该格子对应的主对角线和副对角线 int diag1 = row - col + n - 1; int diag2 = row + col; - // 剪枝:不允许该格子所在列、主对角线、副对角线存在皇后 + // 剪枝:不允许该格子所在列、主对角线、副对角线上存在皇后 if (!cols[col] && !diags1[diag1] && !diags2[diag2]) { // 尝试:将皇后放置在该格子 state[row][col] = "Q"; @@ -51,8 +51,8 @@ List>> nQueens(int n) { // 初始化 n*n 大小的棋盘,其中 'Q' 代表皇后,'#' 代表空位 List> state = List.generate(n, (index) => List.filled(n, "#")); List cols = List.filled(n, false); // 记录列是否有皇后 - List diags1 = List.filled(2 * n - 1, false); // 记录主对角线是否有皇后 - List diags2 = List.filled(2 * n - 1, false); // 记录副对角线是否有皇后 + List diags1 = List.filled(2 * n - 1, false); // 记录主对角线上是否有皇后 + List diags2 = List.filled(2 * n - 1, false); // 记录副对角线上是否有皇后 List>> res = []; backtrack(0, n, state, res, cols, diags1, diags2); diff --git a/codes/dart/chapter_computational_complexity/iteration.dart b/codes/dart/chapter_computational_complexity/iteration.dart index 3bcdc9e1e..3022b6d57 100644 --- a/codes/dart/chapter_computational_complexity/iteration.dart +++ b/codes/dart/chapter_computational_complexity/iteration.dart @@ -30,7 +30,7 @@ int whileLoop(int n) { int whileLoopII(int n) { int res = 0; int i = 1; // 初始化条件变量 - // 循环求和 1, 4, ... + // 循环求和 1, 4, 10, ... while (i <= n) { res += i; // 更新条件变量 diff --git a/codes/dart/chapter_divide_and_conquer/hanota.dart b/codes/dart/chapter_divide_and_conquer/hanota.dart index ff3f33c4f..a22a5feaa 100644 --- a/codes/dart/chapter_divide_and_conquer/hanota.dart +++ b/codes/dart/chapter_divide_and_conquer/hanota.dart @@ -12,7 +12,7 @@ void move(List src, List tar) { tar.add(pan); } -/* 求解汉诺塔:问题 f(i) */ +/* 求解汉诺塔问题 f(i) */ void dfs(int i, List src, List buf, List tar) { // 若 src 只剩下一个圆盘,则直接将其移到 tar if (i == 1) { @@ -27,7 +27,7 @@ void dfs(int i, List src, List buf, List tar) { dfs(i - 1, buf, src, tar); } -/* 求解汉诺塔 */ +/* 求解汉诺塔问题 */ void solveHanota(List A, List B, List C) { int n = A.length; // 将 A 顶部 n 个圆盘借助 B 移到 C diff --git a/codes/dart/chapter_dynamic_programming/climbing_stairs_backtrack.dart b/codes/dart/chapter_dynamic_programming/climbing_stairs_backtrack.dart index 3300fbd49..198a07c6e 100644 --- a/codes/dart/chapter_dynamic_programming/climbing_stairs_backtrack.dart +++ b/codes/dart/chapter_dynamic_programming/climbing_stairs_backtrack.dart @@ -22,7 +22,7 @@ void backtrack(List choices, int state, int n, List res) { /* 爬楼梯:回溯 */ int climbingStairsBacktrack(int n) { - List choices = [1, 2]; // 可选择向上爬 1 或 2 阶 + List choices = [1, 2]; // 可选择向上爬 1 阶或 2 阶 int state = 0; // 从第 0 阶开始爬 List res = []; res.add(0); // 使用 res[0] 记录方案数量 diff --git a/codes/dart/chapter_dynamic_programming/coin_change.dart b/codes/dart/chapter_dynamic_programming/coin_change.dart index 30e163935..366072813 100644 --- a/codes/dart/chapter_dynamic_programming/coin_change.dart +++ b/codes/dart/chapter_dynamic_programming/coin_change.dart @@ -16,7 +16,7 @@ int coinChangeDP(List coins, int amt) { for (int a = 1; a <= amt; a++) { dp[0][a] = MAX; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (int i = 1; i <= n; i++) { for (int a = 1; a <= amt; a++) { if (coins[i - 1] > a) { diff --git a/codes/dart/chapter_dynamic_programming/edit_distance.dart b/codes/dart/chapter_dynamic_programming/edit_distance.dart index 452ea1391..72d97319b 100644 --- a/codes/dart/chapter_dynamic_programming/edit_distance.dart +++ b/codes/dart/chapter_dynamic_programming/edit_distance.dart @@ -56,7 +56,7 @@ int editDistanceDP(String s, String t) { for (int j = 1; j <= m; j++) { dp[0][j] = j; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (s[i - 1] == t[j - 1]) { diff --git a/codes/dart/chapter_dynamic_programming/knapsack.dart b/codes/dart/chapter_dynamic_programming/knapsack.dart index 0a900beaa..86113c115 100644 --- a/codes/dart/chapter_dynamic_programming/knapsack.dart +++ b/codes/dart/chapter_dynamic_programming/knapsack.dart @@ -8,11 +8,11 @@ import 'dart:math'; /* 0-1 背包:暴力搜索 */ int knapsackDFS(List wgt, List val, int i, int c) { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i == 0 || c == 0) { return 0; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (wgt[i - 1] > c) { return knapsackDFS(wgt, val, i - 1, c); } @@ -31,7 +31,7 @@ int knapsackDFSMem( int i, int c, ) { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i == 0 || c == 0) { return 0; } @@ -39,7 +39,7 @@ int knapsackDFSMem( if (mem[i][c] != -1) { return mem[i][c]; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (wgt[i - 1] > c) { return knapsackDFSMem(wgt, val, mem, i - 1, c); } diff --git a/codes/dart/chapter_dynamic_programming/min_path_sum.dart b/codes/dart/chapter_dynamic_programming/min_path_sum.dart index 484a431fc..43c5bdece 100644 --- a/codes/dart/chapter_dynamic_programming/min_path_sum.dart +++ b/codes/dart/chapter_dynamic_programming/min_path_sum.dart @@ -61,7 +61,7 @@ int minPathSumDP(List> grid) { for (int i = 1; i < n; i++) { dp[i][0] = dp[i - 1][0] + grid[i][0]; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (int i = 1; i < n; i++) { for (int j = 1; j < m; j++) { dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; diff --git a/codes/dart/chapter_graph/graph_adjacency_list.dart b/codes/dart/chapter_graph/graph_adjacency_list.dart index 250c189ce..c563f8222 100644 --- a/codes/dart/chapter_graph/graph_adjacency_list.dart +++ b/codes/dart/chapter_graph/graph_adjacency_list.dart @@ -8,7 +8,7 @@ import '../utils/vertex.dart'; /* 基于邻接表实现的无向图类 */ class GraphAdjList { - // 邻接表,key: 顶点,value:该顶点的所有邻接顶点 + // 邻接表,key:顶点,value:该顶点的所有邻接顶点 Map> adjList = {}; /* 构造方法 */ diff --git a/codes/dart/chapter_graph/graph_adjacency_matrix.dart b/codes/dart/chapter_graph/graph_adjacency_matrix.dart index b4d2d4793..7a90b3c37 100644 --- a/codes/dart/chapter_graph/graph_adjacency_matrix.dart +++ b/codes/dart/chapter_graph/graph_adjacency_matrix.dart @@ -67,7 +67,7 @@ class GraphAdjMat { if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) { throw IndexError; } - // 在无向图中,邻接矩阵沿主对角线对称,即满足 (i, j) == (j, i) + // 在无向图中,邻接矩阵关于主对角线对称,即满足 (i, j) == (j, i) adjMat[i][j] = 1; adjMat[j][i] = 1; } diff --git a/codes/dart/chapter_graph/graph_bfs.dart b/codes/dart/chapter_graph/graph_bfs.dart index 9acec3f2c..f2fea88c5 100644 --- a/codes/dart/chapter_graph/graph_bfs.dart +++ b/codes/dart/chapter_graph/graph_bfs.dart @@ -27,7 +27,7 @@ List graphBFS(GraphAdjList graph, Vertex startVet) { // 遍历该顶点的所有邻接顶点 for (Vertex adjVet in graph.adjList[vet]!) { if (visited.contains(adjVet)) { - continue; // 跳过已被访问过的顶点 + continue; // 跳过已被访问的顶点 } que.add(adjVet); // 只入队未访问的顶点 visited.add(adjVet); // 标记该顶点已被访问 diff --git a/codes/dart/chapter_graph/graph_dfs.dart b/codes/dart/chapter_graph/graph_dfs.dart index 8b9b93eaa..6d64dca99 100644 --- a/codes/dart/chapter_graph/graph_dfs.dart +++ b/codes/dart/chapter_graph/graph_dfs.dart @@ -19,7 +19,7 @@ void dfs( // 遍历该顶点的所有邻接顶点 for (Vertex adjVet in graph.adjList[vet]!) { if (visited.contains(adjVet)) { - continue; // 跳过已被访问过的顶点 + continue; // 跳过已被访问的顶点 } // 递归访问邻接顶点 dfs(graph, visited, res, adjVet); diff --git a/codes/dart/chapter_hashing/array_hash_map.dart b/codes/dart/chapter_hashing/array_hash_map.dart index 945a06cdc..8a8770aa9 100644 --- a/codes/dart/chapter_hashing/array_hash_map.dart +++ b/codes/dart/chapter_hashing/array_hash_map.dart @@ -11,7 +11,7 @@ class Pair { Pair(this.key, this.val); } -/* 基于数组简易实现的哈希表 */ +/* 基于数组实现的哈希表 */ class ArrayHashMap { late List _buckets; diff --git a/codes/dart/chapter_heap/my_heap.dart b/codes/dart/chapter_heap/my_heap.dart index b7b95e4ba..e9e8535c9 100644 --- a/codes/dart/chapter_heap/my_heap.dart +++ b/codes/dart/chapter_heap/my_heap.dart @@ -85,7 +85,7 @@ class MaxHeap { int pop() { // 判空处理 if (isEmpty()) throw Exception('堆为空'); - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) _swap(0, size() - 1); // 删除节点 int val = _maxHeap.removeLast(); diff --git a/codes/dart/chapter_heap/top_k.dart b/codes/dart/chapter_heap/top_k.dart index d66df86c1..7053fd8b6 100644 --- a/codes/dart/chapter_heap/top_k.dart +++ b/codes/dart/chapter_heap/top_k.dart @@ -115,7 +115,7 @@ class MinHeap { int pop() { // 判空处理 if (isEmpty()) throw Exception('堆为空'); - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) _swap(0, size() - 1); // 删除节点 int val = _minHeap.removeLast(); diff --git a/codes/dart/chapter_searching/binary_search.dart b/codes/dart/chapter_searching/binary_search.dart index fcce4b7a6..34c557d7f 100644 --- a/codes/dart/chapter_searching/binary_search.dart +++ b/codes/dart/chapter_searching/binary_search.dart @@ -28,7 +28,7 @@ int binarySearch(List nums, int target) { /* 二分查找(左闭右开区间) */ int binarySearchLCRO(List nums, int target) { - // 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 + // 初始化左闭右开区间 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 int i = 0, j = nums.length; // 循环,当搜索区间为空时跳出(当 i = j 时为空) while (i < j) { diff --git a/codes/dart/chapter_searching/two_sum.dart b/codes/dart/chapter_searching/two_sum.dart index 3dd661a24..c854cba2f 100644 --- a/codes/dart/chapter_searching/two_sum.dart +++ b/codes/dart/chapter_searching/two_sum.dart @@ -9,7 +9,7 @@ import 'dart:collection'; /* 方法一: 暴力枚举 */ List twoSumBruteForce(List nums, int target) { int size = nums.length; - // 两层循环,时间复杂度 O(n^2) + // 两层循环,时间复杂度为 O(n^2) for (var i = 0; i < size - 1; i++) { for (var j = i + 1; j < size; j++) { if (nums[i] + nums[j] == target) return [i, j]; @@ -21,9 +21,9 @@ List twoSumBruteForce(List nums, int target) { /* 方法二: 辅助哈希表 */ List twoSumHashTable(List nums, int target) { int size = nums.length; - // 辅助哈希表,空间复杂度 O(n) + // 辅助哈希表,空间复杂度为 O(n) Map dic = HashMap(); - // 单层循环,时间复杂度 O(n) + // 单层循环,时间复杂度为 O(n) for (var i = 0; i < size; i++) { if (dic.containsKey(target - nums[i])) { return [dic[target - nums[i]]!, i]; diff --git a/codes/dart/chapter_sorting/bucket_sort.dart b/codes/dart/chapter_sorting/bucket_sort.dart index 284c6ef11..d6c5acbd9 100644 --- a/codes/dart/chapter_sorting/bucket_sort.dart +++ b/codes/dart/chapter_sorting/bucket_sort.dart @@ -12,7 +12,7 @@ void bucketSort(List nums) { // 1. 将数组元素分配到各个桶中 for (double _num in nums) { - // 输入数据范围 [0, 1),使用 _num * k 映射到索引范围 [0, k-1] + // 输入数据范围为 [0, 1),使用 _num * k 映射到索引范围 [0, k-1] int i = (_num * k).toInt(); // 将 _num 添加进桶 bucket_idx buckets[i].add(_num); diff --git a/codes/dart/chapter_sorting/heap_sort.dart b/codes/dart/chapter_sorting/heap_sort.dart index ef8222ada..76254e975 100644 --- a/codes/dart/chapter_sorting/heap_sort.dart +++ b/codes/dart/chapter_sorting/heap_sort.dart @@ -32,7 +32,7 @@ void heapSort(List nums) { } // 从堆中提取最大元素,循环 n-1 轮 for (int i = nums.length - 1; i > 0; i--) { - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) int tmp = nums[0]; nums[0] = nums[i]; nums[i] = tmp; diff --git a/codes/dart/chapter_sorting/quick_sort.dart b/codes/dart/chapter_sorting/quick_sort.dart index 1b039c481..5d75f07e1 100644 --- a/codes/dart/chapter_sorting/quick_sort.dart +++ b/codes/dart/chapter_sorting/quick_sort.dart @@ -15,7 +15,7 @@ class QuickSort { /* 哨兵划分 */ static int _partition(List nums, int left, int right) { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) j--; // 从右向左找首个小于基准数的元素 @@ -65,7 +65,7 @@ class QuickSortMedian { int med = _medianThree(nums, left, (left + right) ~/ 2, right); // 将中位数交换至数组最左端 _swap(nums, left, med); - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) j--; // 从右向左找首个小于基准数的元素 @@ -99,7 +99,7 @@ class QuickSortTailCall { /* 哨兵划分 */ static int _partition(List nums, int left, int right) { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) j--; // 从右向左找首个小于基准数的元素 @@ -116,7 +116,7 @@ class QuickSortTailCall { while (left < right) { // 哨兵划分操作 int pivot = _partition(nums, left, right); - // 对两个子数组中较短的那个执行快排 + // 对两个子数组中较短的那个执行快速排序 if (pivot - left < right - pivot) { quickSort(nums, left, pivot - 1); // 递归排序左子数组 left = pivot + 1; // 剩余未排序区间为 [pivot + 1, right] diff --git a/codes/dart/chapter_sorting/radix_sort.dart b/codes/dart/chapter_sorting/radix_sort.dart index 3f19d15e1..24c7b6800 100644 --- a/codes/dart/chapter_sorting/radix_sort.dart +++ b/codes/dart/chapter_sorting/radix_sort.dart @@ -12,7 +12,7 @@ int digit(int _num, int exp) { /* 计数排序(根据 nums 第 k 位排序) */ void countingSortDigit(List nums, int exp) { - // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶 + // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶数组 List counter = List.filled(10, 0); int n = nums.length; // 统计 0~9 各数字的出现次数 diff --git a/codes/dart/chapter_tree/binary_tree.dart b/codes/dart/chapter_tree/binary_tree.dart index 9b357703e..757578b41 100644 --- a/codes/dart/chapter_tree/binary_tree.dart +++ b/codes/dart/chapter_tree/binary_tree.dart @@ -15,7 +15,7 @@ void main() { TreeNode n3 = TreeNode(3); TreeNode n4 = TreeNode(4); TreeNode n5 = TreeNode(5); - // 构建引用指向(即指针) + // 构建节点之间的引用(指针) n1.left = n2; n1.right = n3; n2.left = n4; diff --git a/codes/go/chapter_array_and_linkedlist/array.go b/codes/go/chapter_array_and_linkedlist/array.go index 792dab618..325276c58 100644 --- a/codes/go/chapter_array_and_linkedlist/array.go +++ b/codes/go/chapter_array_and_linkedlist/array.go @@ -35,11 +35,11 @@ func insert(nums []int, num int, index int) { for i := len(nums) - 1; i > index; i-- { nums[i] = nums[i-1] } - // 将 num 赋给 index 处元素 + // 将 num 赋给 index 处的元素 nums[index] = num } -/* 删除索引 index 处元素 */ +/* 删除索引 index 处的元素 */ func remove(nums []int, index int) { // 把索引 index 之后的所有元素向前移动一位 for i := index; i < len(nums)-1; i++ { diff --git a/codes/go/chapter_array_and_linkedlist/linked_list_test.go b/codes/go/chapter_array_and_linkedlist/linked_list_test.go index ef0a90910..b12c725e6 100644 --- a/codes/go/chapter_array_and_linkedlist/linked_list_test.go +++ b/codes/go/chapter_array_and_linkedlist/linked_list_test.go @@ -20,7 +20,7 @@ func TestLinkedList(t *testing.T) { n3 := NewListNode(5) n4 := NewListNode(4) - // 构建引用指向 + // 构建节点之间的引用 n0.Next = n1 n1.Next = n2 n2.Next = n3 diff --git a/codes/go/chapter_array_and_linkedlist/list_test.go b/codes/go/chapter_array_and_linkedlist/list_test.go index b07a41eea..35e43a85e 100644 --- a/codes/go/chapter_array_and_linkedlist/list_test.go +++ b/codes/go/chapter_array_and_linkedlist/list_test.go @@ -28,7 +28,7 @@ func TestList(t *testing.T) { nums = nil fmt.Println("清空列表后 nums =", nums) - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums = append(nums, 1) nums = append(nums, 3) nums = append(nums, 2) @@ -36,7 +36,7 @@ func TestList(t *testing.T) { nums = append(nums, 4) fmt.Println("添加元素后 nums =", nums) - /* 中间插入元素 */ + /* 在中间插入元素 */ nums = append(nums[:3], append([]int{6}, nums[3:]...)...) // 在索引 3 处插入数字 6 fmt.Println("在索引 3 处插入数字 6 ,得到 nums =", nums) diff --git a/codes/go/chapter_array_and_linkedlist/my_list.go b/codes/go/chapter_array_and_linkedlist/my_list.go index f53aa5b6e..94406d5d9 100644 --- a/codes/go/chapter_array_and_linkedlist/my_list.go +++ b/codes/go/chapter_array_and_linkedlist/my_list.go @@ -4,7 +4,7 @@ package chapter_array_and_linkedlist -/* 列表类简易实现 */ +/* 列表类 */ type myList struct { arrCapacity int arr []int @@ -17,12 +17,12 @@ func newMyList() *myList { return &myList{ arrCapacity: 10, // 列表容量 arr: make([]int, 10), // 数组(存储列表元素) - arrSize: 0, // 列表长度(即当前元素数量) + arrSize: 0, // 列表长度(当前元素数量) extendRatio: 2, // 每次列表扩容的倍数 } } -/* 获取列表长度(即当前元素数量) */ +/* 获取列表长度(当前元素数量) */ func (l *myList) size() int { return l.arrSize } @@ -49,7 +49,7 @@ func (l *myList) set(num, index int) { l.arr[index] = num } -/* 尾部添加元素 */ +/* 在尾部添加元素 */ func (l *myList) add(num int) { // 元素数量超出容量时,触发扩容机制 if l.arrSize == l.arrCapacity { @@ -60,7 +60,7 @@ func (l *myList) add(num int) { l.arrSize++ } -/* 中间插入元素 */ +/* 在中间插入元素 */ func (l *myList) insert(num, index int) { if index < 0 || index >= l.arrSize { panic("索引越界") diff --git a/codes/go/chapter_array_and_linkedlist/my_list_test.go b/codes/go/chapter_array_and_linkedlist/my_list_test.go index 4ed0ebf0a..755f5bbfa 100644 --- a/codes/go/chapter_array_and_linkedlist/my_list_test.go +++ b/codes/go/chapter_array_and_linkedlist/my_list_test.go @@ -13,7 +13,7 @@ import ( func TestMyList(t *testing.T) { /* 初始化列表 */ nums := newMyList() - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.add(1) nums.add(3) nums.add(2) @@ -21,7 +21,7 @@ func TestMyList(t *testing.T) { nums.add(4) fmt.Printf("列表 nums = %v ,容量 = %v ,长度 = %v\n", nums.toArray(), nums.capacity(), nums.size()) - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.insert(6, 3) fmt.Printf("在索引 3 处插入数字 6 ,得到 nums = %v\n", nums.toArray()) diff --git a/codes/go/chapter_backtracking/n_queens.go b/codes/go/chapter_backtracking/n_queens.go index a3c288493..f0d3f2b7e 100644 --- a/codes/go/chapter_backtracking/n_queens.go +++ b/codes/go/chapter_backtracking/n_queens.go @@ -21,7 +21,7 @@ func backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, d // 计算该格子对应的主对角线和副对角线 diag1 := row - col + n - 1 diag2 := row + col - // 剪枝:不允许该格子所在列、主对角线、副对角线存在皇后 + // 剪枝:不允许该格子所在列、主对角线、副对角线上存在皇后 if !(*cols)[col] && !(*diags1)[diag1] && !(*diags2)[diag2] { // 尝试:将皇后放置在该格子 (*state)[row][col] = "Q" diff --git a/codes/go/chapter_computational_complexity/iteration.go b/codes/go/chapter_computational_complexity/iteration.go index 820d32648..79470b862 100644 --- a/codes/go/chapter_computational_complexity/iteration.go +++ b/codes/go/chapter_computational_complexity/iteration.go @@ -35,7 +35,7 @@ func whileLoopII(n int) int { res := 0 // 初始化条件变量 i := 1 - // 循环求和 1, 4, ... + // 循环求和 1, 4, 10, ... for i <= n { res += i // 更新条件变量 diff --git a/codes/go/chapter_divide_and_conquer/hanota.go b/codes/go/chapter_divide_and_conquer/hanota.go index 8b01113fd..96e408093 100644 --- a/codes/go/chapter_divide_and_conquer/hanota.go +++ b/codes/go/chapter_divide_and_conquer/hanota.go @@ -16,7 +16,7 @@ func move(src, tar *list.List) { src.Remove(pan) } -/* 求解汉诺塔:问题 f(i) */ +/* 求解汉诺塔问题 f(i) */ func dfsHanota(i int, src, buf, tar *list.List) { // 若 src 只剩下一个圆盘,则直接将其移到 tar if i == 1 { @@ -31,7 +31,7 @@ func dfsHanota(i int, src, buf, tar *list.List) { dfsHanota(i-1, buf, src, tar) } -/* 求解汉诺塔 */ +/* 求解汉诺塔问题 */ func solveHanota(A, B, C *list.List) { n := A.Len() // 将 A 顶部 n 个圆盘借助 B 移到 C diff --git a/codes/go/chapter_dynamic_programming/climbing_stairs_backtrack.go b/codes/go/chapter_dynamic_programming/climbing_stairs_backtrack.go index b77a07b77..5030faab7 100644 --- a/codes/go/chapter_dynamic_programming/climbing_stairs_backtrack.go +++ b/codes/go/chapter_dynamic_programming/climbing_stairs_backtrack.go @@ -24,7 +24,7 @@ func backtrack(choices []int, state, n int, res []int) { /* 爬楼梯:回溯 */ func climbingStairsBacktrack(n int) int { - // 可选择向上爬 1 或 2 阶 + // 可选择向上爬 1 阶或 2 阶 choices := []int{1, 2} // 从第 0 阶开始爬 state := 0 diff --git a/codes/go/chapter_dynamic_programming/coin_change.go b/codes/go/chapter_dynamic_programming/coin_change.go index 8d4f16546..55f6ee650 100644 --- a/codes/go/chapter_dynamic_programming/coin_change.go +++ b/codes/go/chapter_dynamic_programming/coin_change.go @@ -19,7 +19,7 @@ func coinChangeDP(coins []int, amt int) int { for a := 1; a <= amt; a++ { dp[0][a] = max } - // 状态转移:其余行列 + // 状态转移:其余行和列 for i := 1; i <= n; i++ { for a := 1; a <= amt; a++ { if coins[i-1] > a { diff --git a/codes/go/chapter_dynamic_programming/coin_change_ii.go b/codes/go/chapter_dynamic_programming/coin_change_ii.go index d493ed174..783cef257 100644 --- a/codes/go/chapter_dynamic_programming/coin_change_ii.go +++ b/codes/go/chapter_dynamic_programming/coin_change_ii.go @@ -16,7 +16,7 @@ func coinChangeIIDP(coins []int, amt int) int { for i := 0; i <= n; i++ { dp[i][0] = 1 } - // 状态转移:其余行列 + // 状态转移:其余行和列 for i := 1; i <= n; i++ { for a := 1; a <= amt; a++ { if coins[i-1] > a { diff --git a/codes/go/chapter_dynamic_programming/edit_distance.go b/codes/go/chapter_dynamic_programming/edit_distance.go index 3dd969218..075b0a6b1 100644 --- a/codes/go/chapter_dynamic_programming/edit_distance.go +++ b/codes/go/chapter_dynamic_programming/edit_distance.go @@ -76,7 +76,7 @@ func editDistanceDP(s string, t string) int { for j := 1; j <= m; j++ { dp[0][j] = j } - // 状态转移:其余行列 + // 状态转移:其余行和列 for i := 1; i <= n; i++ { for j := 1; j <= m; j++ { if s[i-1] == t[j-1] { diff --git a/codes/go/chapter_dynamic_programming/knapsack.go b/codes/go/chapter_dynamic_programming/knapsack.go index 45a63ebc6..1445d0917 100644 --- a/codes/go/chapter_dynamic_programming/knapsack.go +++ b/codes/go/chapter_dynamic_programming/knapsack.go @@ -8,11 +8,11 @@ import "math" /* 0-1 背包:暴力搜索 */ func knapsackDFS(wgt, val []int, i, c int) int { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if i == 0 || c == 0 { return 0 } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if wgt[i-1] > c { return knapsackDFS(wgt, val, i-1, c) } @@ -25,7 +25,7 @@ func knapsackDFS(wgt, val []int, i, c int) int { /* 0-1 背包:记忆化搜索 */ func knapsackDFSMem(wgt, val []int, mem [][]int, i, c int) int { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if i == 0 || c == 0 { return 0 } @@ -33,7 +33,7 @@ func knapsackDFSMem(wgt, val []int, mem [][]int, i, c int) int { if mem[i][c] != -1 { return mem[i][c] } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if wgt[i-1] > c { return knapsackDFSMem(wgt, val, mem, i-1, c) } diff --git a/codes/go/chapter_dynamic_programming/min_path_sum.go b/codes/go/chapter_dynamic_programming/min_path_sum.go index e8cfa8876..0b843d9c2 100644 --- a/codes/go/chapter_dynamic_programming/min_path_sum.go +++ b/codes/go/chapter_dynamic_programming/min_path_sum.go @@ -62,7 +62,7 @@ func minPathSumDP(grid [][]int) int { for i := 1; i < n; i++ { dp[i][0] = dp[i-1][0] + grid[i][0] } - // 状态转移:其余行列 + // 状态转移:其余行和列 for i := 1; i < n; i++ { for j := 1; j < m; j++ { dp[i][j] = int(math.Min(float64(dp[i][j-1]), float64(dp[i-1][j]))) + grid[i][j] @@ -81,7 +81,7 @@ func minPathSumDPComp(grid [][]int) int { for j := 1; j < m; j++ { dp[j] = dp[j-1] + grid[0][j] } - // 状态转移:其余行列 + // 状态转移:其余行和列 for i := 1; i < n; i++ { // 状态转移:首列 dp[0] = dp[0] + grid[i][0] diff --git a/codes/go/chapter_graph/graph_adjacency_list.go b/codes/go/chapter_graph/graph_adjacency_list.go index dfec71d30..49f94eb8e 100644 --- a/codes/go/chapter_graph/graph_adjacency_list.go +++ b/codes/go/chapter_graph/graph_adjacency_list.go @@ -14,7 +14,7 @@ import ( /* 基于邻接表实现的无向图类 */ type graphAdjList struct { - // 邻接表,key: 顶点,value:该顶点的所有邻接顶点 + // 邻接表,key:顶点,value:该顶点的所有邻接顶点 adjList map[Vertex][]Vertex } diff --git a/codes/go/chapter_graph/graph_adjacency_matrix.go b/codes/go/chapter_graph/graph_adjacency_matrix.go index b57666cc3..9050550c6 100644 --- a/codes/go/chapter_graph/graph_adjacency_matrix.go +++ b/codes/go/chapter_graph/graph_adjacency_matrix.go @@ -76,7 +76,7 @@ func (g *graphAdjMat) addEdge(i, j int) { if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j { fmt.Errorf("%s", "Index Out Of Bounds Exception") } - // 在无向图中,邻接矩阵沿主对角线对称,即满足 (i, j) == (j, i) + // 在无向图中,邻接矩阵关于主对角线对称,即满足 (i, j) == (j, i) g.adjMat[i][j] = 1 g.adjMat[j][i] = 1 } diff --git a/codes/go/chapter_hashing/array_hash_map.go b/codes/go/chapter_hashing/array_hash_map.go index 7ef1ccbdd..8823a63c1 100644 --- a/codes/go/chapter_hashing/array_hash_map.go +++ b/codes/go/chapter_hashing/array_hash_map.go @@ -12,7 +12,7 @@ type pair struct { val string } -/* 基于数组简易实现的哈希表 */ +/* 基于数组实现的哈希表 */ type arrayHashMap struct { buckets []*pair } diff --git a/codes/go/chapter_heap/my_heap.go b/codes/go/chapter_heap/my_heap.go index e34ee9d69..cda948f19 100644 --- a/codes/go/chapter_heap/my_heap.go +++ b/codes/go/chapter_heap/my_heap.go @@ -100,7 +100,7 @@ func (h *maxHeap) pop() any { fmt.Println("error") return nil } - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) h.swap(0, h.size()-1) // 删除节点 val := h.data[len(h.data)-1] diff --git a/codes/go/chapter_searching/binary_search.go b/codes/go/chapter_searching/binary_search.go index 5754ef698..699c653cc 100644 --- a/codes/go/chapter_searching/binary_search.go +++ b/codes/go/chapter_searching/binary_search.go @@ -23,9 +23,9 @@ func binarySearch(nums []int, target int) int { return -1 } -/* 二分查找(左闭右开) */ +/* 二分查找(左闭右开区间) */ func binarySearchLCRO(nums []int, target int) int { - // 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 + // 初始化左闭右开区间 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 i, j := 0, len(nums) // 循环,当搜索区间为空时跳出(当 i = j 时为空) for i < j { diff --git a/codes/go/chapter_searching/two_sum.go b/codes/go/chapter_searching/two_sum.go index ac11e8d54..922a4100c 100644 --- a/codes/go/chapter_searching/two_sum.go +++ b/codes/go/chapter_searching/two_sum.go @@ -7,7 +7,7 @@ package chapter_searching /* 方法一:暴力枚举 */ func twoSumBruteForce(nums []int, target int) []int { size := len(nums) - // 两层循环,时间复杂度 O(n^2) + // 两层循环,时间复杂度为 O(n^2) for i := 0; i < size-1; i++ { for j := i + 1; i < size; j++ { if nums[i]+nums[j] == target { @@ -20,9 +20,9 @@ func twoSumBruteForce(nums []int, target int) []int { /* 方法二:辅助哈希表 */ func twoSumHashTable(nums []int, target int) []int { - // 辅助哈希表,空间复杂度 O(n) + // 辅助哈希表,空间复杂度为 O(n) hashTable := map[int]int{} - // 单层循环,时间复杂度 O(n) + // 单层循环,时间复杂度为 O(n) for idx, val := range nums { if preIdx, ok := hashTable[target-val]; ok { return []int{preIdx, idx} diff --git a/codes/go/chapter_sorting/bucket_sort.go b/codes/go/chapter_sorting/bucket_sort.go index af4206fe0..3f8e05ea7 100644 --- a/codes/go/chapter_sorting/bucket_sort.go +++ b/codes/go/chapter_sorting/bucket_sort.go @@ -16,7 +16,7 @@ func bucketSort(nums []float64) { } // 1. 将数组元素分配到各个桶中 for _, num := range nums { - // 输入数据范围 [0, 1),使用 num * k 映射到索引范围 [0, k-1] + // 输入数据范围为 [0, 1),使用 num * k 映射到索引范围 [0, k-1] i := int(num * float64(k)) // 将 num 添加进桶 i buckets[i] = append(buckets[i], num) diff --git a/codes/go/chapter_sorting/heap_sort.go b/codes/go/chapter_sorting/heap_sort.go index 1cac8a68d..7ab866eaf 100644 --- a/codes/go/chapter_sorting/heap_sort.go +++ b/codes/go/chapter_sorting/heap_sort.go @@ -36,7 +36,7 @@ func heapSort(nums *[]int) { } // 从堆中提取最大元素,循环 n-1 轮 for i := len(*nums) - 1; i > 0; i-- { - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) (*nums)[0], (*nums)[i] = (*nums)[i], (*nums)[0] // 以根节点为起点,从顶至底进行堆化 siftDown(nums, i, 0) diff --git a/codes/go/chapter_sorting/quick_sort.go b/codes/go/chapter_sorting/quick_sort.go index 5b7412584..dcfe74b74 100644 --- a/codes/go/chapter_sorting/quick_sort.go +++ b/codes/go/chapter_sorting/quick_sort.go @@ -15,7 +15,7 @@ type quickSortTailCall struct{} /* 哨兵划分 */ func (q *quickSort) partition(nums []int, left, right int) int { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 i, j := left, right for i < j { for i < j && nums[j] >= nums[left] { @@ -59,11 +59,11 @@ func (q *quickSortMedian) medianThree(nums []int, left, mid, right int) int { /* 哨兵划分(三数取中值)*/ func (q *quickSortMedian) partition(nums []int, left, right int) int { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 med := q.medianThree(nums, left, (left+right)/2, right) // 将中位数交换至数组最左端 nums[left], nums[med] = nums[med], nums[left] - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 i, j := left, right for i < j { for i < j && nums[j] >= nums[left] { @@ -95,7 +95,7 @@ func (q *quickSortMedian) quickSort(nums []int, left, right int) { /* 哨兵划分 */ func (q *quickSortTailCall) partition(nums []int, left, right int) int { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 i, j := left, right for i < j { for i < j && nums[j] >= nums[left] { @@ -118,7 +118,7 @@ func (q *quickSortTailCall) quickSort(nums []int, left, right int) { for left < right { // 哨兵划分操作 pivot := q.partition(nums, left, right) - // 对两个子数组中较短的那个执行快排 + // 对两个子数组中较短的那个执行快速排序 if pivot-left < right-pivot { q.quickSort(nums, left, pivot-1) // 递归排序左子数组 left = pivot + 1 // 剩余未排序区间为 [pivot + 1, right] diff --git a/codes/go/chapter_sorting/radix_sort.go b/codes/go/chapter_sorting/radix_sort.go index d58a7c95f..43a0c8811 100644 --- a/codes/go/chapter_sorting/radix_sort.go +++ b/codes/go/chapter_sorting/radix_sort.go @@ -14,7 +14,7 @@ func digit(num, exp int) int { /* 计数排序(根据 nums 第 k 位排序) */ func countingSortDigit(nums []int, exp int) { - // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶 + // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶数组 counter := make([]int, 10) n := len(nums) // 统计 0~9 各数字的出现次数 diff --git a/codes/go/chapter_tree/binary_tree_test.go b/codes/go/chapter_tree/binary_tree_test.go index f226e4f7c..7f2975559 100644 --- a/codes/go/chapter_tree/binary_tree_test.go +++ b/codes/go/chapter_tree/binary_tree_test.go @@ -19,7 +19,7 @@ func TestBinaryTree(t *testing.T) { n3 := NewTreeNode(3) n4 := NewTreeNode(4) n5 := NewTreeNode(5) - // 构建引用指向(即指针) + // 构建节点之间的引用(指针) n1.Left = n2 n1.Right = n3 n2.Left = n4 diff --git a/codes/java/chapter_array_and_linkedlist/array.java b/codes/java/chapter_array_and_linkedlist/array.java index c0f73d039..65bd08a27 100644 --- a/codes/java/chapter_array_and_linkedlist/array.java +++ b/codes/java/chapter_array_and_linkedlist/array.java @@ -37,11 +37,11 @@ public class array { for (int i = nums.length - 1; i > index; i--) { nums[i] = nums[i - 1]; } - // 将 num 赋给 index 处元素 + // 将 num 赋给 index 处的元素 nums[index] = num; } - /* 删除索引 index 处元素 */ + /* 删除索引 index 处的元素 */ static void remove(int[] nums, int index) { // 把索引 index 之后的所有元素向前移动一位 for (int i = index; i < nums.length - 1; i++) { diff --git a/codes/java/chapter_array_and_linkedlist/linked_list.java b/codes/java/chapter_array_and_linkedlist/linked_list.java index d88411f07..4c4e46580 100644 --- a/codes/java/chapter_array_and_linkedlist/linked_list.java +++ b/codes/java/chapter_array_and_linkedlist/linked_list.java @@ -57,7 +57,7 @@ public class linked_list { ListNode n2 = new ListNode(2); ListNode n3 = new ListNode(5); ListNode n4 = new ListNode(4); - // 构建引用指向 + // 构建节点之间的引用 n0.next = n1; n1.next = n2; n2.next = n3; diff --git a/codes/java/chapter_array_and_linkedlist/list.java b/codes/java/chapter_array_and_linkedlist/list.java index 1c8dd7d7f..e1a30faaf 100644 --- a/codes/java/chapter_array_and_linkedlist/list.java +++ b/codes/java/chapter_array_and_linkedlist/list.java @@ -28,7 +28,7 @@ public class list { nums.clear(); System.out.println("清空列表后 nums = " + nums); - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.add(1); nums.add(3); nums.add(2); @@ -36,7 +36,7 @@ public class list { nums.add(4); System.out.println("添加元素后 nums = " + nums); - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.add(3, 6); System.out.println("在索引 3 处插入数字 6 ,得到 nums = " + nums); diff --git a/codes/java/chapter_array_and_linkedlist/my_list.java b/codes/java/chapter_array_and_linkedlist/my_list.java index 7302f0e0d..0ec9ed286 100644 --- a/codes/java/chapter_array_and_linkedlist/my_list.java +++ b/codes/java/chapter_array_and_linkedlist/my_list.java @@ -8,11 +8,11 @@ package chapter_array_and_linkedlist; import java.util.*; -/* 列表类简易实现 */ +/* 列表类 */ class MyList { private int[] arr; // 数组(存储列表元素) private int capacity = 10; // 列表容量 - private int size = 0; // 列表长度(即当前元素数量) + private int size = 0; // 列表长度(当前元素数量) private int extendRatio = 2; // 每次列表扩容的倍数 /* 构造方法 */ @@ -20,7 +20,7 @@ class MyList { arr = new int[capacity]; } - /* 获取列表长度(即当前元素数量) */ + /* 获取列表长度(当前元素数量) */ public int size() { return size; } @@ -45,7 +45,7 @@ class MyList { arr[index] = num; } - /* 尾部添加元素 */ + /* 在尾部添加元素 */ public void add(int num) { // 元素数量超出容量时,触发扩容机制 if (size == capacity()) @@ -55,7 +55,7 @@ class MyList { size++; } - /* 中间插入元素 */ + /* 在中间插入元素 */ public void insert(int index, int num) { if (index < 0 || index >= size) throw new IndexOutOfBoundsException("索引越界"); @@ -111,7 +111,7 @@ public class my_list { public static void main(String[] args) { /* 初始化列表 */ MyList nums = new MyList(); - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.add(1); nums.add(3); nums.add(2); @@ -120,7 +120,7 @@ public class my_list { System.out.println("列表 nums = " + Arrays.toString(nums.toArray()) + " ,容量 = " + nums.capacity() + " ,长度 = " + nums.size()); - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.insert(3, 6); System.out.println("在索引 3 处插入数字 6 ,得到 nums = " + Arrays.toString(nums.toArray())); diff --git a/codes/java/chapter_backtracking/n_queens.java b/codes/java/chapter_backtracking/n_queens.java index 66b8b6da7..a59912a5d 100644 --- a/codes/java/chapter_backtracking/n_queens.java +++ b/codes/java/chapter_backtracking/n_queens.java @@ -26,7 +26,7 @@ public class n_queens { // 计算该格子对应的主对角线和副对角线 int diag1 = row - col + n - 1; int diag2 = row + col; - // 剪枝:不允许该格子所在列、主对角线、副对角线存在皇后 + // 剪枝:不允许该格子所在列、主对角线、副对角线上存在皇后 if (!cols[col] && !diags1[diag1] && !diags2[diag2]) { // 尝试:将皇后放置在该格子 state.get(row).set(col, "Q"); @@ -52,8 +52,8 @@ public class n_queens { state.add(row); } boolean[] cols = new boolean[n]; // 记录列是否有皇后 - boolean[] diags1 = new boolean[2 * n - 1]; // 记录主对角线是否有皇后 - boolean[] diags2 = new boolean[2 * n - 1]; // 记录副对角线是否有皇后 + boolean[] diags1 = new boolean[2 * n - 1]; // 记录主对角线上是否有皇后 + boolean[] diags2 = new boolean[2 * n - 1]; // 记录副对角线上是否有皇后 List>> res = new ArrayList<>(); backtrack(0, n, state, res, cols, diags1, diags2); diff --git a/codes/java/chapter_computational_complexity/iteration.java b/codes/java/chapter_computational_complexity/iteration.java index ae8aaba0a..9bef2d2f5 100644 --- a/codes/java/chapter_computational_complexity/iteration.java +++ b/codes/java/chapter_computational_complexity/iteration.java @@ -33,7 +33,7 @@ public class iteration { static int whileLoopII(int n) { int res = 0; int i = 1; // 初始化条件变量 - // 循环求和 1, 4, ... + // 循环求和 1, 4, 10, ... while (i <= n) { res += i; // 更新条件变量 diff --git a/codes/java/chapter_divide_and_conquer/hanota.java b/codes/java/chapter_divide_and_conquer/hanota.java index adc1dd2b2..8fdb4695d 100644 --- a/codes/java/chapter_divide_and_conquer/hanota.java +++ b/codes/java/chapter_divide_and_conquer/hanota.java @@ -17,7 +17,7 @@ public class hanota { tar.add(pan); } - /* 求解汉诺塔:问题 f(i) */ + /* 求解汉诺塔问题 f(i) */ static void dfs(int i, List src, List buf, List tar) { // 若 src 只剩下一个圆盘,则直接将其移到 tar if (i == 1) { @@ -32,7 +32,7 @@ public class hanota { dfs(i - 1, buf, src, tar); } - /* 求解汉诺塔 */ + /* 求解汉诺塔问题 */ static void solveHanota(List A, List B, List C) { int n = A.size(); // 将 A 顶部 n 个圆盘借助 B 移到 C diff --git a/codes/java/chapter_dynamic_programming/climbing_stairs_backtrack.java b/codes/java/chapter_dynamic_programming/climbing_stairs_backtrack.java index 6e30b2726..0478b3476 100644 --- a/codes/java/chapter_dynamic_programming/climbing_stairs_backtrack.java +++ b/codes/java/chapter_dynamic_programming/climbing_stairs_backtrack.java @@ -27,7 +27,7 @@ public class climbing_stairs_backtrack { /* 爬楼梯:回溯 */ public static int climbingStairsBacktrack(int n) { - List choices = Arrays.asList(1, 2); // 可选择向上爬 1 或 2 阶 + List choices = Arrays.asList(1, 2); // 可选择向上爬 1 阶或 2 阶 int state = 0; // 从第 0 阶开始爬 List res = new ArrayList<>(); res.add(0); // 使用 res[0] 记录方案数量 diff --git a/codes/java/chapter_dynamic_programming/coin_change.java b/codes/java/chapter_dynamic_programming/coin_change.java index f5f57c807..53310166e 100644 --- a/codes/java/chapter_dynamic_programming/coin_change.java +++ b/codes/java/chapter_dynamic_programming/coin_change.java @@ -19,7 +19,7 @@ public class coin_change { for (int a = 1; a <= amt; a++) { dp[0][a] = MAX; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (int i = 1; i <= n; i++) { for (int a = 1; a <= amt; a++) { if (coins[i - 1] > a) { diff --git a/codes/java/chapter_dynamic_programming/edit_distance.java b/codes/java/chapter_dynamic_programming/edit_distance.java index 4b1937cee..7010e21fe 100644 --- a/codes/java/chapter_dynamic_programming/edit_distance.java +++ b/codes/java/chapter_dynamic_programming/edit_distance.java @@ -68,7 +68,7 @@ public class edit_distance { for (int j = 1; j <= m; j++) { dp[0][j] = j; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (s.charAt(i - 1) == t.charAt(j - 1)) { diff --git a/codes/java/chapter_dynamic_programming/knapsack.java b/codes/java/chapter_dynamic_programming/knapsack.java index cd7b1cd21..a777c5233 100644 --- a/codes/java/chapter_dynamic_programming/knapsack.java +++ b/codes/java/chapter_dynamic_programming/knapsack.java @@ -12,11 +12,11 @@ public class knapsack { /* 0-1 背包:暴力搜索 */ static int knapsackDFS(int[] wgt, int[] val, int i, int c) { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i == 0 || c == 0) { return 0; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (wgt[i - 1] > c) { return knapsackDFS(wgt, val, i - 1, c); } @@ -29,7 +29,7 @@ public class knapsack { /* 0-1 背包:记忆化搜索 */ static int knapsackDFSMem(int[] wgt, int[] val, int[][] mem, int i, int c) { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i == 0 || c == 0) { return 0; } @@ -37,7 +37,7 @@ public class knapsack { if (mem[i][c] != -1) { return mem[i][c]; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (wgt[i - 1] > c) { return knapsackDFSMem(wgt, val, mem, i - 1, c); } diff --git a/codes/java/chapter_dynamic_programming/min_path_sum.java b/codes/java/chapter_dynamic_programming/min_path_sum.java index 7b6645b85..9eef8685f 100644 --- a/codes/java/chapter_dynamic_programming/min_path_sum.java +++ b/codes/java/chapter_dynamic_programming/min_path_sum.java @@ -62,7 +62,7 @@ public class min_path_sum { for (int i = 1; i < n; i++) { dp[i][0] = dp[i - 1][0] + grid[i][0]; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (int i = 1; i < n; i++) { for (int j = 1; j < m; j++) { dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; diff --git a/codes/java/chapter_graph/graph_adjacency_list.java b/codes/java/chapter_graph/graph_adjacency_list.java index aaadd45b2..3319c4e72 100644 --- a/codes/java/chapter_graph/graph_adjacency_list.java +++ b/codes/java/chapter_graph/graph_adjacency_list.java @@ -11,7 +11,7 @@ import utils.*; /* 基于邻接表实现的无向图类 */ class GraphAdjList { - // 邻接表,key: 顶点,value:该顶点的所有邻接顶点 + // 邻接表,key:顶点,value:该顶点的所有邻接顶点 Map> adjList; /* 构造方法 */ diff --git a/codes/java/chapter_graph/graph_adjacency_matrix.java b/codes/java/chapter_graph/graph_adjacency_matrix.java index 1a9b03f90..449f5f274 100644 --- a/codes/java/chapter_graph/graph_adjacency_matrix.java +++ b/codes/java/chapter_graph/graph_adjacency_matrix.java @@ -71,7 +71,7 @@ class GraphAdjMat { // 索引越界与相等处理 if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) throw new IndexOutOfBoundsException(); - // 在无向图中,邻接矩阵沿主对角线对称,即满足 (i, j) == (j, i) + // 在无向图中,邻接矩阵关于主对角线对称,即满足 (i, j) == (j, i) adjMat.get(i).set(j, 1); adjMat.get(j).set(i, 1); } diff --git a/codes/java/chapter_graph/graph_bfs.java b/codes/java/chapter_graph/graph_bfs.java index 55304ebf1..ec021d928 100644 --- a/codes/java/chapter_graph/graph_bfs.java +++ b/codes/java/chapter_graph/graph_bfs.java @@ -28,7 +28,7 @@ public class graph_bfs { // 遍历该顶点的所有邻接顶点 for (Vertex adjVet : graph.adjList.get(vet)) { if (visited.contains(adjVet)) - continue; // 跳过已被访问过的顶点 + continue; // 跳过已被访问的顶点 que.offer(adjVet); // 只入队未访问的顶点 visited.add(adjVet); // 标记该顶点已被访问 } diff --git a/codes/java/chapter_graph/graph_dfs.java b/codes/java/chapter_graph/graph_dfs.java index 035b3fbec..c0b1d6d41 100644 --- a/codes/java/chapter_graph/graph_dfs.java +++ b/codes/java/chapter_graph/graph_dfs.java @@ -17,7 +17,7 @@ public class graph_dfs { // 遍历该顶点的所有邻接顶点 for (Vertex adjVet : graph.adjList.get(vet)) { if (visited.contains(adjVet)) - continue; // 跳过已被访问过的顶点 + continue; // 跳过已被访问的顶点 // 递归访问邻接顶点 dfs(graph, visited, res, adjVet); } diff --git a/codes/java/chapter_hashing/array_hash_map.java b/codes/java/chapter_hashing/array_hash_map.java index b1c410d3c..e0c875e77 100644 --- a/codes/java/chapter_hashing/array_hash_map.java +++ b/codes/java/chapter_hashing/array_hash_map.java @@ -19,7 +19,7 @@ class Pair { } } -/* 基于数组简易实现的哈希表 */ +/* 基于数组实现的哈希表 */ class ArrayHashMap { private List buckets; diff --git a/codes/java/chapter_heap/my_heap.java b/codes/java/chapter_heap/my_heap.java index 2599abacd..3ddce1f8c 100644 --- a/codes/java/chapter_heap/my_heap.java +++ b/codes/java/chapter_heap/my_heap.java @@ -89,7 +89,7 @@ class MaxHeap { // 判空处理 if (isEmpty()) throw new IndexOutOfBoundsException(); - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) swap(0, size() - 1); // 删除节点 int val = maxHeap.remove(size() - 1); diff --git a/codes/java/chapter_searching/binary_search.java b/codes/java/chapter_searching/binary_search.java index 5811bf8fc..f5fc4bffd 100644 --- a/codes/java/chapter_searching/binary_search.java +++ b/codes/java/chapter_searching/binary_search.java @@ -25,9 +25,9 @@ public class binary_search { return -1; } - /* 二分查找(左闭右开) */ + /* 二分查找(左闭右开区间) */ static int binarySearchLCRO(int[] nums, int target) { - // 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 + // 初始化左闭右开区间 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 int i = 0, j = nums.length; // 循环,当搜索区间为空时跳出(当 i = j 时为空) while (i < j) { @@ -51,7 +51,7 @@ public class binary_search { int index = binarySearch(nums, target); System.out.println("目标元素 6 的索引 = " + index); - /* 二分查找(左闭右开) */ + /* 二分查找(左闭右开区间) */ index = binarySearchLCRO(nums, target); System.out.println("目标元素 6 的索引 = " + index); } diff --git a/codes/java/chapter_searching/two_sum.java b/codes/java/chapter_searching/two_sum.java index d74fef142..9beb2b4df 100644 --- a/codes/java/chapter_searching/two_sum.java +++ b/codes/java/chapter_searching/two_sum.java @@ -12,7 +12,7 @@ public class two_sum { /* 方法一:暴力枚举 */ static int[] twoSumBruteForce(int[] nums, int target) { int size = nums.length; - // 两层循环,时间复杂度 O(n^2) + // 两层循环,时间复杂度为 O(n^2) for (int i = 0; i < size - 1; i++) { for (int j = i + 1; j < size; j++) { if (nums[i] + nums[j] == target) @@ -25,9 +25,9 @@ public class two_sum { /* 方法二:辅助哈希表 */ static int[] twoSumHashTable(int[] nums, int target) { int size = nums.length; - // 辅助哈希表,空间复杂度 O(n) + // 辅助哈希表,空间复杂度为 O(n) Map dic = new HashMap<>(); - // 单层循环,时间复杂度 O(n) + // 单层循环,时间复杂度为 O(n) for (int i = 0; i < size; i++) { if (dic.containsKey(target - nums[i])) { return new int[] { dic.get(target - nums[i]), i }; diff --git a/codes/java/chapter_sorting/bucket_sort.java b/codes/java/chapter_sorting/bucket_sort.java index e47ed40f1..5d1471f72 100644 --- a/codes/java/chapter_sorting/bucket_sort.java +++ b/codes/java/chapter_sorting/bucket_sort.java @@ -19,7 +19,7 @@ public class bucket_sort { } // 1. 将数组元素分配到各个桶中 for (float num : nums) { - // 输入数据范围 [0, 1),使用 num * k 映射到索引范围 [0, k-1] + // 输入数据范围为 [0, 1),使用 num * k 映射到索引范围 [0, k-1] int i = (int) (num * k); // 将 num 添加进桶 i buckets.get(i).add(num); diff --git a/codes/java/chapter_sorting/heap_sort.java b/codes/java/chapter_sorting/heap_sort.java index cb4ab50ac..9acf0fd06 100644 --- a/codes/java/chapter_sorting/heap_sort.java +++ b/codes/java/chapter_sorting/heap_sort.java @@ -40,7 +40,7 @@ public class heap_sort { } // 从堆中提取最大元素,循环 n-1 轮 for (int i = nums.length - 1; i > 0; i--) { - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) int tmp = nums[0]; nums[0] = nums[i]; nums[i] = tmp; diff --git a/codes/java/chapter_sorting/quick_sort.java b/codes/java/chapter_sorting/quick_sort.java index 74d707ea2..f51973082 100644 --- a/codes/java/chapter_sorting/quick_sort.java +++ b/codes/java/chapter_sorting/quick_sort.java @@ -19,7 +19,7 @@ class QuickSort { /* 哨兵划分 */ static int partition(int[] nums, int left, int right) { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) @@ -72,7 +72,7 @@ class QuickSortMedian { int med = medianThree(nums, left, (left + right) / 2, right); // 将中位数交换至数组最左端 swap(nums, left, med); - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) @@ -109,7 +109,7 @@ class QuickSortTailCall { /* 哨兵划分 */ static int partition(int[] nums, int left, int right) { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) @@ -128,7 +128,7 @@ class QuickSortTailCall { while (left < right) { // 哨兵划分操作 int pivot = partition(nums, left, right); - // 对两个子数组中较短的那个执行快排 + // 对两个子数组中较短的那个执行快速排序 if (pivot - left < right - pivot) { quickSort(nums, left, pivot - 1); // 递归排序左子数组 left = pivot + 1; // 剩余未排序区间为 [pivot + 1, right] diff --git a/codes/java/chapter_sorting/radix_sort.java b/codes/java/chapter_sorting/radix_sort.java index 843ffc18a..1d5f0d5af 100644 --- a/codes/java/chapter_sorting/radix_sort.java +++ b/codes/java/chapter_sorting/radix_sort.java @@ -17,7 +17,7 @@ public class radix_sort { /* 计数排序(根据 nums 第 k 位排序) */ static void countingSortDigit(int[] nums, int exp) { - // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶 + // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶数组 int[] counter = new int[10]; int n = nums.length; // 统计 0~9 各数字的出现次数 diff --git a/codes/java/chapter_stack_and_queue/linkedlist_deque.java b/codes/java/chapter_stack_and_queue/linkedlist_deque.java index 6747b82c1..5fa8083b5 100644 --- a/codes/java/chapter_stack_and_queue/linkedlist_deque.java +++ b/codes/java/chapter_stack_and_queue/linkedlist_deque.java @@ -42,7 +42,7 @@ class LinkedListDeque { /* 入队操作 */ private void push(int num, boolean isFront) { ListNode node = new ListNode(num); - // 若链表为空,则令 front, rear 都指向 node + // 若链表为空,则令 front 和 rear 都指向 node if (isEmpty()) front = rear = node; // 队首入队操作 diff --git a/codes/java/chapter_tree/binary_tree.java b/codes/java/chapter_tree/binary_tree.java index 1f4d2c354..7079cea6b 100644 --- a/codes/java/chapter_tree/binary_tree.java +++ b/codes/java/chapter_tree/binary_tree.java @@ -17,7 +17,7 @@ public class binary_tree { TreeNode n3 = new TreeNode(3); TreeNode n4 = new TreeNode(4); TreeNode n5 = new TreeNode(5); - // 构建引用指向(即指针) + // 构建节点之间的引用(指针) n1.left = n2; n1.right = n3; n2.left = n4; diff --git a/codes/javascript/chapter_array_and_linkedlist/array.js b/codes/javascript/chapter_array_and_linkedlist/array.js index 4fdbab4c8..abd3dc791 100644 --- a/codes/javascript/chapter_array_and_linkedlist/array.js +++ b/codes/javascript/chapter_array_and_linkedlist/array.js @@ -15,7 +15,7 @@ function randomAccess(nums) { /* 扩展数组长度 */ // 请注意,JavaScript 的 Array 是动态数组,可以直接扩展 -// 为了方便学习,本函数将 Array 看作是长度不可变的数组 +// 为了方便学习,本函数将 Array 看作长度不可变的数组 function extend(nums, enlarge) { // 初始化一个扩展长度后的数组 const res = new Array(nums.length + enlarge).fill(0); @@ -33,11 +33,11 @@ function insert(nums, num, index) { for (let i = nums.length - 1; i > index; i--) { nums[i] = nums[i - 1]; } - // 将 num 赋给 index 处元素 + // 将 num 赋给 index 处的元素 nums[index] = num; } -/* 删除索引 index 处元素 */ +/* 删除索引 index 处的元素 */ function remove(nums, index) { // 把索引 index 之后的所有元素向前移动一位 for (let i = index; i < nums.length - 1; i++) { diff --git a/codes/javascript/chapter_array_and_linkedlist/linked_list.js b/codes/javascript/chapter_array_and_linkedlist/linked_list.js index ad2ee9236..ea64a964a 100644 --- a/codes/javascript/chapter_array_and_linkedlist/linked_list.js +++ b/codes/javascript/chapter_array_and_linkedlist/linked_list.js @@ -55,7 +55,7 @@ const n1 = new ListNode(3); const n2 = new ListNode(2); const n3 = new ListNode(5); const n4 = new ListNode(4); -// 构建引用指向 +// 构建节点之间的引用 n0.next = n1; n1.next = n2; n2.next = n3; diff --git a/codes/javascript/chapter_array_and_linkedlist/list.js b/codes/javascript/chapter_array_and_linkedlist/list.js index 281132eba..88d0fb64e 100644 --- a/codes/javascript/chapter_array_and_linkedlist/list.js +++ b/codes/javascript/chapter_array_and_linkedlist/list.js @@ -20,7 +20,7 @@ console.log(`将索引 1 处的元素更新为 0 ,得到 nums = ${nums}`); nums.length = 0; console.log(`清空列表后 nums = ${nums}`); -/* 尾部添加元素 */ +/* 在尾部添加元素 */ nums.push(1); nums.push(3); nums.push(2); @@ -28,7 +28,7 @@ nums.push(5); nums.push(4); console.log(`添加元素后 nums = ${nums}`); -/* 中间插入元素 */ +/* 在中间插入元素 */ nums.splice(3, 0, 6); console.log(`在索引 3 处插入数字 6 ,得到 nums = ${nums}`); diff --git a/codes/javascript/chapter_array_and_linkedlist/my_list.js b/codes/javascript/chapter_array_and_linkedlist/my_list.js index 329534653..80c1029ba 100644 --- a/codes/javascript/chapter_array_and_linkedlist/my_list.js +++ b/codes/javascript/chapter_array_and_linkedlist/my_list.js @@ -4,11 +4,11 @@ * Author: Justin (xiefahit@gmail.com) */ -/* 列表类简易实现 */ +/* 列表类 */ class MyList { #arr = new Array(); // 数组(存储列表元素) #capacity = 10; // 列表容量 - #size = 0; // 列表长度(即当前元素数量) + #size = 0; // 列表长度(当前元素数量) #extendRatio = 2; // 每次列表扩容的倍数 /* 构造方法 */ @@ -16,7 +16,7 @@ class MyList { this.#arr = new Array(this.#capacity); } - /* 获取列表长度(即当前元素数量)*/ + /* 获取列表长度(当前元素数量)*/ size() { return this.#size; } @@ -39,7 +39,7 @@ class MyList { this.#arr[index] = num; } - /* 尾部添加元素 */ + /* 在尾部添加元素 */ add(num) { // 如果长度等于容量,则需要扩容 if (this.#size === this.#capacity) { @@ -50,7 +50,7 @@ class MyList { this.#size++; } - /* 中间插入元素 */ + /* 在中间插入元素 */ insert(index, num) { if (index < 0 || index >= this.#size) throw new Error('索引越界'); // 元素数量超出容量时,触发扩容机制 @@ -105,7 +105,7 @@ class MyList { /* Driver Code */ /* 初始化列表 */ const nums = new MyList(); -/* 尾部添加元素 */ +/* 在尾部添加元素 */ nums.add(1); nums.add(3); nums.add(2); @@ -115,7 +115,7 @@ console.log( `列表 nums = ${nums.toArray()} ,容量 = ${nums.capacity()} ,长度 = ${nums.size()}` ); -/* 中间插入元素 */ +/* 在中间插入元素 */ nums.insert(3, 6); console.log(`在索引 3 处插入数字 6 ,得到 nums = ${nums.toArray()}`); diff --git a/codes/javascript/chapter_backtracking/n_queens.js b/codes/javascript/chapter_backtracking/n_queens.js index b56a7dd68..a05a9ee63 100644 --- a/codes/javascript/chapter_backtracking/n_queens.js +++ b/codes/javascript/chapter_backtracking/n_queens.js @@ -16,7 +16,7 @@ function backtrack(row, n, state, res, cols, diags1, diags2) { // 计算该格子对应的主对角线和副对角线 const diag1 = row - col + n - 1; const diag2 = row + col; - // 剪枝:不允许该格子所在列、主对角线、副对角线存在皇后 + // 剪枝:不允许该格子所在列、主对角线、副对角线上存在皇后 if (!cols[col] && !diags1[diag1] && !diags2[diag2]) { // 尝试:将皇后放置在该格子 state[row][col] = 'Q'; @@ -35,8 +35,8 @@ function nQueens(n) { // 初始化 n*n 大小的棋盘,其中 'Q' 代表皇后,'#' 代表空位 const state = Array.from({ length: n }, () => Array(n).fill('#')); const cols = Array(n).fill(false); // 记录列是否有皇后 - const diags1 = Array(2 * n - 1).fill(false); // 记录主对角线是否有皇后 - const diags2 = Array(2 * n - 1).fill(false); // 记录副对角线是否有皇后 + const diags1 = Array(2 * n - 1).fill(false); // 记录主对角线上是否有皇后 + const diags2 = Array(2 * n - 1).fill(false); // 记录副对角线上是否有皇后 const res = []; backtrack(0, n, state, res, cols, diags1, diags2); diff --git a/codes/javascript/chapter_computational_complexity/iteration.js b/codes/javascript/chapter_computational_complexity/iteration.js index abf8ae70d..1e548374f 100644 --- a/codes/javascript/chapter_computational_complexity/iteration.js +++ b/codes/javascript/chapter_computational_complexity/iteration.js @@ -30,7 +30,7 @@ function whileLoop(n) { function whileLoopII(n) { let res = 0; let i = 1; // 初始化条件变量 - // 循环求和 1, 4, ... + // 循环求和 1, 4, 10, ... while (i <= n) { res += i; // 更新条件变量 diff --git a/codes/javascript/chapter_divide_and_conquer/hanota.js b/codes/javascript/chapter_divide_and_conquer/hanota.js index 009d43253..66281a643 100644 --- a/codes/javascript/chapter_divide_and_conquer/hanota.js +++ b/codes/javascript/chapter_divide_and_conquer/hanota.js @@ -12,7 +12,7 @@ function move(src, tar) { tar.push(pan); } -/* 求解汉诺塔:问题 f(i) */ +/* 求解汉诺塔问题 f(i) */ function dfs(i, src, buf, tar) { // 若 src 只剩下一个圆盘,则直接将其移到 tar if (i === 1) { @@ -27,7 +27,7 @@ function dfs(i, src, buf, tar) { dfs(i - 1, buf, src, tar); } -/* 求解汉诺塔 */ +/* 求解汉诺塔问题 */ function solveHanota(A, B, C) { const n = A.length; // 将 A 顶部 n 个圆盘借助 B 移到 C diff --git a/codes/javascript/chapter_dynamic_programming/climbing_stairs_backtrack.js b/codes/javascript/chapter_dynamic_programming/climbing_stairs_backtrack.js index 21e6699d8..ee9f111d0 100644 --- a/codes/javascript/chapter_dynamic_programming/climbing_stairs_backtrack.js +++ b/codes/javascript/chapter_dynamic_programming/climbing_stairs_backtrack.js @@ -20,7 +20,7 @@ function backtrack(choices, state, n, res) { /* 爬楼梯:回溯 */ function climbingStairsBacktrack(n) { - const choices = [1, 2]; // 可选择向上爬 1 或 2 阶 + const choices = [1, 2]; // 可选择向上爬 1 阶或 2 阶 const state = 0; // 从第 0 阶开始爬 const res = new Map(); res.set(0, 0); // 使用 res[0] 记录方案数量 diff --git a/codes/javascript/chapter_dynamic_programming/coin_change.js b/codes/javascript/chapter_dynamic_programming/coin_change.js index 99b1a3363..287d946ed 100644 --- a/codes/javascript/chapter_dynamic_programming/coin_change.js +++ b/codes/javascript/chapter_dynamic_programming/coin_change.js @@ -16,7 +16,7 @@ function coinChangeDP(coins, amt) { for (let a = 1; a <= amt; a++) { dp[0][a] = MAX; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (let i = 1; i <= n; i++) { for (let a = 1; a <= amt; a++) { if (coins[i - 1] > a) { diff --git a/codes/javascript/chapter_dynamic_programming/edit_distance.js b/codes/javascript/chapter_dynamic_programming/edit_distance.js index c7b5bd7a8..2553900b5 100644 --- a/codes/javascript/chapter_dynamic_programming/edit_distance.js +++ b/codes/javascript/chapter_dynamic_programming/edit_distance.js @@ -66,7 +66,7 @@ function editDistanceDP(s, t) { for (let j = 1; j <= m; j++) { dp[0][j] = j; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (let i = 1; i <= n; i++) { for (let j = 1; j <= m; j++) { if (s.charAt(i - 1) === t.charAt(j - 1)) { diff --git a/codes/javascript/chapter_dynamic_programming/knapsack.js b/codes/javascript/chapter_dynamic_programming/knapsack.js index 7a8549e04..0f1058864 100644 --- a/codes/javascript/chapter_dynamic_programming/knapsack.js +++ b/codes/javascript/chapter_dynamic_programming/knapsack.js @@ -6,11 +6,11 @@ /* 0-1 背包:暴力搜索 */ function knapsackDFS(wgt, val, i, c) { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i === 0 || c === 0) { return 0; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (wgt[i - 1] > c) { return knapsackDFS(wgt, val, i - 1, c); } @@ -23,7 +23,7 @@ function knapsackDFS(wgt, val, i, c) { /* 0-1 背包:记忆化搜索 */ function knapsackDFSMem(wgt, val, mem, i, c) { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i === 0 || c === 0) { return 0; } @@ -31,7 +31,7 @@ function knapsackDFSMem(wgt, val, mem, i, c) { if (mem[i][c] !== -1) { return mem[i][c]; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (wgt[i - 1] > c) { return knapsackDFSMem(wgt, val, mem, i - 1, c); } diff --git a/codes/javascript/chapter_dynamic_programming/min_path_sum.js b/codes/javascript/chapter_dynamic_programming/min_path_sum.js index d3bc6e858..4df7ec4a4 100644 --- a/codes/javascript/chapter_dynamic_programming/min_path_sum.js +++ b/codes/javascript/chapter_dynamic_programming/min_path_sum.js @@ -60,7 +60,7 @@ function minPathSumDP(grid) { for (let i = 1; i < n; i++) { dp[i][0] = dp[i - 1][0] + grid[i][0]; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (let i = 1; i < n; i++) { for (let j = 1; j < m; j++) { dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; diff --git a/codes/javascript/chapter_graph/graph_adjacency_list.js b/codes/javascript/chapter_graph/graph_adjacency_list.js index bc4a948bf..ec7567c3c 100644 --- a/codes/javascript/chapter_graph/graph_adjacency_list.js +++ b/codes/javascript/chapter_graph/graph_adjacency_list.js @@ -8,7 +8,7 @@ const { Vertex } = require('../modules/Vertex'); /* 基于邻接表实现的无向图类 */ class GraphAdjList { - // 邻接表,key: 顶点,value:该顶点的所有邻接顶点 + // 邻接表,key:顶点,value:该顶点的所有邻接顶点 adjList; /* 构造方法 */ diff --git a/codes/javascript/chapter_graph/graph_adjacency_matrix.js b/codes/javascript/chapter_graph/graph_adjacency_matrix.js index fb07086d5..d6ecb0859 100644 --- a/codes/javascript/chapter_graph/graph_adjacency_matrix.js +++ b/codes/javascript/chapter_graph/graph_adjacency_matrix.js @@ -69,7 +69,7 @@ class GraphAdjMat { if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) { throw new RangeError('Index Out Of Bounds Exception'); } - // 在无向图中,邻接矩阵沿主对角线对称,即满足 (i, j) === (j, i) + // 在无向图中,邻接矩阵关于主对角线对称,即满足 (i, j) === (j, i) this.adjMat[i][j] = 1; this.adjMat[j][i] = 1; } diff --git a/codes/javascript/chapter_graph/graph_bfs.js b/codes/javascript/chapter_graph/graph_bfs.js index 567b10483..1fa9b5210 100644 --- a/codes/javascript/chapter_graph/graph_bfs.js +++ b/codes/javascript/chapter_graph/graph_bfs.js @@ -24,7 +24,7 @@ function graphBFS(graph, startVet) { // 遍历该顶点的所有邻接顶点 for (const adjVet of graph.adjList.get(vet) ?? []) { if (visited.has(adjVet)) { - continue; // 跳过已被访问过的顶点 + continue; // 跳过已被访问的顶点 } que.push(adjVet); // 只入队未访问的顶点 visited.add(adjVet); // 标记该顶点已被访问 diff --git a/codes/javascript/chapter_graph/graph_dfs.js b/codes/javascript/chapter_graph/graph_dfs.js index 0657f70c2..6078819aa 100644 --- a/codes/javascript/chapter_graph/graph_dfs.js +++ b/codes/javascript/chapter_graph/graph_dfs.js @@ -15,7 +15,7 @@ function dfs(graph, visited, res, vet) { // 遍历该顶点的所有邻接顶点 for (const adjVet of graph.adjList.get(vet)) { if (visited.has(adjVet)) { - continue; // 跳过已被访问过的顶点 + continue; // 跳过已被访问的顶点 } // 递归访问邻接顶点 dfs(graph, visited, res, adjVet); diff --git a/codes/javascript/chapter_hashing/array_hash_map.js b/codes/javascript/chapter_hashing/array_hash_map.js index 9c4b1547b..324084789 100644 --- a/codes/javascript/chapter_hashing/array_hash_map.js +++ b/codes/javascript/chapter_hashing/array_hash_map.js @@ -12,7 +12,7 @@ class Pair { } } -/* 基于数组简易实现的哈希表 */ +/* 基于数组实现的哈希表 */ class ArrayHashMap { #buckets; constructor() { diff --git a/codes/javascript/chapter_heap/my_heap.js b/codes/javascript/chapter_heap/my_heap.js index 62699ffbd..644646eab 100644 --- a/codes/javascript/chapter_heap/my_heap.js +++ b/codes/javascript/chapter_heap/my_heap.js @@ -83,7 +83,7 @@ class MaxHeap { pop() { // 判空处理 if (this.isEmpty()) throw new Error('堆为空'); - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) this.#swap(0, this.size() - 1); // 删除节点 const val = this.#maxHeap.pop(); diff --git a/codes/javascript/chapter_searching/binary_search.js b/codes/javascript/chapter_searching/binary_search.js index 0146e2693..618a7c06f 100644 --- a/codes/javascript/chapter_searching/binary_search.js +++ b/codes/javascript/chapter_searching/binary_search.js @@ -25,9 +25,9 @@ function binarySearch(nums, target) { return -1; } -/* 二分查找(左闭右开) */ +/* 二分查找(左闭右开区间) */ function binarySearchLCRO(nums, target) { - // 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 + // 初始化左闭右开区间 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 let i = 0, j = nums.length; // 循环,当搜索区间为空时跳出(当 i = j 时为空) @@ -55,6 +55,6 @@ const nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; let index = binarySearch(nums, target); console.log('目标元素 6 的索引 = ' + index); -/* 二分查找(左闭右开) */ +/* 二分查找(左闭右开区间) */ index = binarySearchLCRO(nums, target); console.log('目标元素 6 的索引 = ' + index); diff --git a/codes/javascript/chapter_searching/two_sum.js b/codes/javascript/chapter_searching/two_sum.js index 6b60445f5..104775b74 100644 --- a/codes/javascript/chapter_searching/two_sum.js +++ b/codes/javascript/chapter_searching/two_sum.js @@ -7,7 +7,7 @@ /* 方法一:暴力枚举 */ function twoSumBruteForce(nums, target) { const n = nums.length; - // 两层循环,时间复杂度 O(n^2) + // 两层循环,时间复杂度为 O(n^2) for (let i = 0; i < n; i++) { for (let j = i + 1; j < n; j++) { if (nums[i] + nums[j] === target) { @@ -20,9 +20,9 @@ function twoSumBruteForce(nums, target) { /* 方法二:辅助哈希表 */ function twoSumHashTable(nums, target) { - // 辅助哈希表,空间复杂度 O(n) + // 辅助哈希表,空间复杂度为 O(n) let m = {}; - // 单层循环,时间复杂度 O(n) + // 单层循环,时间复杂度为 O(n) for (let i = 0; i < nums.length; i++) { if (m[target - nums[i]] !== undefined) { return [m[target - nums[i]], i]; diff --git a/codes/javascript/chapter_sorting/bucket_sort.js b/codes/javascript/chapter_sorting/bucket_sort.js index 12dcbc1d4..7b2c45bdf 100644 --- a/codes/javascript/chapter_sorting/bucket_sort.js +++ b/codes/javascript/chapter_sorting/bucket_sort.js @@ -14,7 +14,7 @@ function bucketSort(nums) { } // 1. 将数组元素分配到各个桶中 for (const num of nums) { - // 输入数据范围 [0, 1),使用 num * k 映射到索引范围 [0, k-1] + // 输入数据范围为 [0, 1),使用 num * k 映射到索引范围 [0, k-1] const i = Math.floor(num * k); // 将 num 添加进桶 i buckets[i].push(num); diff --git a/codes/javascript/chapter_sorting/heap_sort.js b/codes/javascript/chapter_sorting/heap_sort.js index 0e8dcb86d..03c5356b5 100644 --- a/codes/javascript/chapter_sorting/heap_sort.js +++ b/codes/javascript/chapter_sorting/heap_sort.js @@ -36,7 +36,7 @@ function heapSort(nums) { } // 从堆中提取最大元素,循环 n-1 轮 for (let i = nums.length - 1; i > 0; i--) { - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) [nums[0], nums[i]] = [nums[i], nums[0]]; // 以根节点为起点,从顶至底进行堆化 siftDown(nums, i, 0); diff --git a/codes/javascript/chapter_sorting/quick_sort.js b/codes/javascript/chapter_sorting/quick_sort.js index 717f487b8..6b383e6d6 100644 --- a/codes/javascript/chapter_sorting/quick_sort.js +++ b/codes/javascript/chapter_sorting/quick_sort.js @@ -15,7 +15,7 @@ class QuickSort { /* 哨兵划分 */ partition(nums, left, right) { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 let i = left, j = right; while (i < j) { @@ -74,7 +74,7 @@ class QuickSortMedian { ); // 将中位数交换至数组最左端 this.swap(nums, left, med); - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 let i = left, j = right; while (i < j) { @@ -109,7 +109,7 @@ class QuickSortTailCall { /* 哨兵划分 */ partition(nums, left, right) { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 let i = left, j = right; while (i < j) { @@ -127,7 +127,7 @@ class QuickSortTailCall { while (left < right) { // 哨兵划分操作 let pivot = this.partition(nums, left, right); - // 对两个子数组中较短的那个执行快排 + // 对两个子数组中较短的那个执行快速排序 if (pivot - left < right - pivot) { this.quickSort(nums, left, pivot - 1); // 递归排序左子数组 left = pivot + 1; // 剩余未排序区间为 [pivot + 1, right] diff --git a/codes/javascript/chapter_sorting/radix_sort.js b/codes/javascript/chapter_sorting/radix_sort.js index 5c923bc5c..7d9627db9 100644 --- a/codes/javascript/chapter_sorting/radix_sort.js +++ b/codes/javascript/chapter_sorting/radix_sort.js @@ -12,7 +12,7 @@ function digit(num, exp) { /* 计数排序(根据 nums 第 k 位排序) */ function countingSortDigit(nums, exp) { - // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶 + // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶数组 const counter = new Array(10).fill(0); const n = nums.length; // 统计 0~9 各数字的出现次数 diff --git a/codes/javascript/chapter_stack_and_queue/linkedlist_deque.js b/codes/javascript/chapter_stack_and_queue/linkedlist_deque.js index 0060ec7ee..884b2313b 100644 --- a/codes/javascript/chapter_stack_and_queue/linkedlist_deque.js +++ b/codes/javascript/chapter_stack_and_queue/linkedlist_deque.js @@ -32,7 +32,7 @@ class LinkedListDeque { /* 队尾入队操作 */ pushLast(val) { const node = new ListNode(val); - // 若链表为空,则令 front, rear 都指向 node + // 若链表为空,则令 front 和 rear 都指向 node if (this.#queSize === 0) { this.#front = node; this.#rear = node; @@ -48,7 +48,7 @@ class LinkedListDeque { /* 队首入队操作 */ pushFirst(val) { const node = new ListNode(val); - // 若链表为空,则令 front, rear 都指向 node + // 若链表为空,则令 front 和 rear 都指向 node if (this.#queSize === 0) { this.#front = node; this.#rear = node; diff --git a/codes/javascript/chapter_tree/array_binary_tree.js b/codes/javascript/chapter_tree/array_binary_tree.js index 920125034..094cab30b 100644 --- a/codes/javascript/chapter_tree/array_binary_tree.js +++ b/codes/javascript/chapter_tree/array_binary_tree.js @@ -40,7 +40,7 @@ class ArrayBinaryTree { /* 获取索引为 i 节点的父节点的索引 */ parent(i) { - return Math.floor((i - 1) / 2); // 向下取整 + return Math.floor((i - 1) / 2); // 向下整除 } /* 层序遍历 */ diff --git a/codes/javascript/chapter_tree/binary_tree.js b/codes/javascript/chapter_tree/binary_tree.js index 79e16bbaf..2a4ca7d41 100644 --- a/codes/javascript/chapter_tree/binary_tree.js +++ b/codes/javascript/chapter_tree/binary_tree.js @@ -14,7 +14,7 @@ let n1 = new TreeNode(1), n3 = new TreeNode(3), n4 = new TreeNode(4), n5 = new TreeNode(5); -// 构建引用指向(即指针) +// 构建节点之间的引用(指针) n1.left = n2; n1.right = n3; n2.left = n4; diff --git a/codes/python/chapter_array_and_linkedlist/array.py b/codes/python/chapter_array_and_linkedlist/array.py index a6b9c76c0..e5e529799 100644 --- a/codes/python/chapter_array_and_linkedlist/array.py +++ b/codes/python/chapter_array_and_linkedlist/array.py @@ -17,7 +17,7 @@ def random_access(nums: list[int]) -> int: # 请注意,Python 的 list 是动态数组,可以直接扩展 -# 为了方便学习,本函数将 list 看作是长度不可变的数组 +# 为了方便学习,本函数将 list 看作长度不可变的数组 def extend(nums: list[int], enlarge: int) -> list[int]: """扩展数组长度""" # 初始化一个扩展长度后的数组 @@ -34,12 +34,12 @@ def insert(nums: list[int], num: int, index: int): # 把索引 index 以及之后的所有元素向后移动一位 for i in range(len(nums) - 1, index, -1): nums[i] = nums[i - 1] - # 将 num 赋给 index 处元素 + # 将 num 赋给 index 处的元素 nums[index] = num def remove(nums: list[int], index: int): - """删除索引 index 处元素""" + """删除索引 index 处的元素""" # 把索引 index 之后的所有元素向前移动一位 for i in range(index, len(nums) - 1): nums[i] = nums[i + 1] diff --git a/codes/python/chapter_array_and_linkedlist/linked_list.py b/codes/python/chapter_array_and_linkedlist/linked_list.py index e51835d41..febcc8b7c 100644 --- a/codes/python/chapter_array_and_linkedlist/linked_list.py +++ b/codes/python/chapter_array_and_linkedlist/linked_list.py @@ -57,7 +57,7 @@ if __name__ == "__main__": n2 = ListNode(2) n3 = ListNode(5) n4 = ListNode(4) - # 构建引用指向 + # 构建节点之间的引用 n0.next = n1 n1.next = n2 n2.next = n3 diff --git a/codes/python/chapter_array_and_linkedlist/list.py b/codes/python/chapter_array_and_linkedlist/list.py index b2da5c194..77c58d2e9 100644 --- a/codes/python/chapter_array_and_linkedlist/list.py +++ b/codes/python/chapter_array_and_linkedlist/list.py @@ -22,7 +22,7 @@ if __name__ == "__main__": nums.clear() print("\n清空列表后 nums =", nums) - # 尾部添加元素 + # 在尾部添加元素 nums.append(1) nums.append(3) nums.append(2) @@ -30,7 +30,7 @@ if __name__ == "__main__": nums.append(4) print("\n添加元素后 nums =", nums) - # 中间插入元素 + # 在中间插入元素 nums.insert(3, 6) print("\n在索引 3 处插入数字 6 ,得到 nums =", nums) diff --git a/codes/python/chapter_array_and_linkedlist/my_list.py b/codes/python/chapter_array_and_linkedlist/my_list.py index c78ac43a0..b64dcd0e7 100644 --- a/codes/python/chapter_array_and_linkedlist/my_list.py +++ b/codes/python/chapter_array_and_linkedlist/my_list.py @@ -6,17 +6,17 @@ Author: Krahets (krahets@163.com) class MyList: - """列表类简易实现""" + """列表类""" def __init__(self): """构造方法""" self._capacity: int = 10 # 列表容量 self._arr: list[int] = [0] * self._capacity # 数组(存储列表元素) - self._size: int = 0 # 列表长度(即当前元素数量) + self._size: int = 0 # 列表长度(当前元素数量) self._extend_ratio: int = 2 # 每次列表扩容的倍数 def size(self) -> int: - """获取列表长度(即当前元素数量)""" + """获取列表长度(当前元素数量)""" return self._size def capacity(self) -> int: @@ -37,7 +37,7 @@ class MyList: self._arr[index] = num def add(self, num: int): - """尾部添加元素""" + """在尾部添加元素""" # 元素数量超出容量时,触发扩容机制 if self.size() == self.capacity(): self.extend_capacity() @@ -45,7 +45,7 @@ class MyList: self._size += 1 def insert(self, num: int, index: int): - """中间插入元素""" + """在中间插入元素""" if index < 0 or index >= self._size: raise IndexError("索引越界") # 元素数量超出容量时,触发扩容机制 @@ -87,7 +87,7 @@ class MyList: if __name__ == "__main__": # 初始化列表 nums = MyList() - # 尾部添加元素 + # 在尾部添加元素 nums.add(1) nums.add(3) nums.add(2) @@ -95,7 +95,7 @@ if __name__ == "__main__": nums.add(4) print(f"列表 nums = {nums.to_array()} ,容量 = {nums.capacity()} ,长度 = {nums.size()}") - # 中间插入元素 + # 在中间插入元素 nums.insert(6, index=3) print("在索引 3 处插入数字 6 ,得到 nums =", nums.to_array()) diff --git a/codes/python/chapter_backtracking/n_queens.py b/codes/python/chapter_backtracking/n_queens.py index 5d7e34d16..ab7fb3799 100644 --- a/codes/python/chapter_backtracking/n_queens.py +++ b/codes/python/chapter_backtracking/n_queens.py @@ -24,7 +24,7 @@ def backtrack( # 计算该格子对应的主对角线和副对角线 diag1 = row - col + n - 1 diag2 = row + col - # 剪枝:不允许该格子所在列、主对角线、副对角线存在皇后 + # 剪枝:不允许该格子所在列、主对角线、副对角线上存在皇后 if not cols[col] and not diags1[diag1] and not diags2[diag2]: # 尝试:将皇后放置在该格子 state[row][col] = "Q" @@ -41,8 +41,8 @@ def n_queens(n: int) -> list[list[list[str]]]: # 初始化 n*n 大小的棋盘,其中 'Q' 代表皇后,'#' 代表空位 state = [["#" for _ in range(n)] for _ in range(n)] cols = [False] * n # 记录列是否有皇后 - diags1 = [False] * (2 * n - 1) # 记录主对角线是否有皇后 - diags2 = [False] * (2 * n - 1) # 记录副对角线是否有皇后 + diags1 = [False] * (2 * n - 1) # 记录主对角线上是否有皇后 + diags2 = [False] * (2 * n - 1) # 记录副对角线上是否有皇后 res = [] backtrack(0, n, state, res, cols, diags1, diags2) diff --git a/codes/python/chapter_computational_complexity/iteration.py b/codes/python/chapter_computational_complexity/iteration.py index 2f8339841..07a8d24f6 100644 --- a/codes/python/chapter_computational_complexity/iteration.py +++ b/codes/python/chapter_computational_complexity/iteration.py @@ -29,7 +29,7 @@ def while_loop_ii(n: int) -> int: """while 循环(两次更新)""" res = 0 i = 1 # 初始化条件变量 - # 循环求和 1, 4, ... + # 循环求和 1, 4, 10, ... while i <= n: res += i # 更新条件变量 diff --git a/codes/python/chapter_divide_and_conquer/hanota.py b/codes/python/chapter_divide_and_conquer/hanota.py index 34cfd93d1..87cd398ea 100644 --- a/codes/python/chapter_divide_and_conquer/hanota.py +++ b/codes/python/chapter_divide_and_conquer/hanota.py @@ -14,7 +14,7 @@ def move(src: list[int], tar: list[int]): def dfs(i: int, src: list[int], buf: list[int], tar: list[int]): - """求解汉诺塔:问题 f(i)""" + """求解汉诺塔问题 f(i)""" # 若 src 只剩下一个圆盘,则直接将其移到 tar if i == 1: move(src, tar) @@ -28,7 +28,7 @@ def dfs(i: int, src: list[int], buf: list[int], tar: list[int]): def solve_hanota(A: list[int], B: list[int], C: list[int]): - """求解汉诺塔""" + """求解汉诺塔问题""" n = len(A) # 将 A 顶部 n 个圆盘借助 B 移到 C dfs(n, A, B, C) diff --git a/codes/python/chapter_dynamic_programming/climbing_stairs_backtrack.py b/codes/python/chapter_dynamic_programming/climbing_stairs_backtrack.py index 5b43e741a..e07a9d2f2 100644 --- a/codes/python/chapter_dynamic_programming/climbing_stairs_backtrack.py +++ b/codes/python/chapter_dynamic_programming/climbing_stairs_backtrack.py @@ -22,7 +22,7 @@ def backtrack(choices: list[int], state: int, n: int, res: list[int]) -> int: def climbing_stairs_backtrack(n: int) -> int: """爬楼梯:回溯""" - choices = [1, 2] # 可选择向上爬 1 或 2 阶 + choices = [1, 2] # 可选择向上爬 1 阶或 2 阶 state = 0 # 从第 0 阶开始爬 res = [0] # 使用 res[0] 记录方案数量 backtrack(choices, state, n, res) diff --git a/codes/python/chapter_dynamic_programming/coin_change.py b/codes/python/chapter_dynamic_programming/coin_change.py index 6c916dc44..e098da2b0 100644 --- a/codes/python/chapter_dynamic_programming/coin_change.py +++ b/codes/python/chapter_dynamic_programming/coin_change.py @@ -14,7 +14,7 @@ def coin_change_dp(coins: list[int], amt: int) -> int: # 状态转移:首行首列 for a in range(1, amt + 1): dp[0][a] = MAX - # 状态转移:其余行列 + # 状态转移:其余行和列 for i in range(1, n + 1): for a in range(1, amt + 1): if coins[i - 1] > a: diff --git a/codes/python/chapter_dynamic_programming/edit_distance.py b/codes/python/chapter_dynamic_programming/edit_distance.py index 1b405fed4..90998e52e 100644 --- a/codes/python/chapter_dynamic_programming/edit_distance.py +++ b/codes/python/chapter_dynamic_programming/edit_distance.py @@ -62,7 +62,7 @@ def edit_distance_dp(s: str, t: str) -> int: dp[i][0] = i for j in range(1, m + 1): dp[0][j] = j - # 状态转移:其余行列 + # 状态转移:其余行和列 for i in range(1, n + 1): for j in range(1, m + 1): if s[i - 1] == t[j - 1]: diff --git a/codes/python/chapter_dynamic_programming/knapsack.py b/codes/python/chapter_dynamic_programming/knapsack.py index 2d89db998..f9f780e44 100644 --- a/codes/python/chapter_dynamic_programming/knapsack.py +++ b/codes/python/chapter_dynamic_programming/knapsack.py @@ -7,10 +7,10 @@ Author: Krahets (krahets@163.com) def knapsack_dfs(wgt: list[int], val: list[int], i: int, c: int) -> int: """0-1 背包:暴力搜索""" - # 若已选完所有物品或背包无容量,则返回价值 0 + # 若已选完所有物品或背包无剩余容量,则返回价值 0 if i == 0 or c == 0: return 0 - # 若超过背包容量,则只能不放入背包 + # 若超过背包容量,则只能选择不放入背包 if wgt[i - 1] > c: return knapsack_dfs(wgt, val, i - 1, c) # 计算不放入和放入物品 i 的最大价值 @@ -24,13 +24,13 @@ def knapsack_dfs_mem( wgt: list[int], val: list[int], mem: list[list[int]], i: int, c: int ) -> int: """0-1 背包:记忆化搜索""" - # 若已选完所有物品或背包无容量,则返回价值 0 + # 若已选完所有物品或背包无剩余容量,则返回价值 0 if i == 0 or c == 0: return 0 # 若已有记录,则直接返回 if mem[i][c] != -1: return mem[i][c] - # 若超过背包容量,则只能不放入背包 + # 若超过背包容量,则只能选择不放入背包 if wgt[i - 1] > c: return knapsack_dfs_mem(wgt, val, mem, i - 1, c) # 计算不放入和放入物品 i 的最大价值 diff --git a/codes/python/chapter_dynamic_programming/min_path_sum.py b/codes/python/chapter_dynamic_programming/min_path_sum.py index 5b5cae4b2..da853df1f 100644 --- a/codes/python/chapter_dynamic_programming/min_path_sum.py +++ b/codes/python/chapter_dynamic_programming/min_path_sum.py @@ -55,7 +55,7 @@ def min_path_sum_dp(grid: list[list[int]]) -> int: # 状态转移:首列 for i in range(1, n): dp[i][0] = dp[i - 1][0] + grid[i][0] - # 状态转移:其余行列 + # 状态转移:其余行和列 for i in range(1, n): for j in range(1, m): dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j] diff --git a/codes/python/chapter_graph/graph_adjacency_list.py b/codes/python/chapter_graph/graph_adjacency_list.py index 3d44998d0..e38cb4b46 100644 --- a/codes/python/chapter_graph/graph_adjacency_list.py +++ b/codes/python/chapter_graph/graph_adjacency_list.py @@ -16,7 +16,7 @@ class GraphAdjList: def __init__(self, edges: list[list[Vertex]]): """构造方法""" - # 邻接表,key: 顶点,value:该顶点的所有邻接顶点 + # 邻接表,key:顶点,value:该顶点的所有邻接顶点 self.adj_list = dict[Vertex, list[Vertex]]() # 添加所有顶点和边 for edge in edges: diff --git a/codes/python/chapter_graph/graph_adjacency_matrix.py b/codes/python/chapter_graph/graph_adjacency_matrix.py index cc8d2656b..7bf19aaf6 100644 --- a/codes/python/chapter_graph/graph_adjacency_matrix.py +++ b/codes/python/chapter_graph/graph_adjacency_matrix.py @@ -62,7 +62,7 @@ class GraphAdjMat: # 索引越界与相等处理 if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j: raise IndexError() - # 在无向图中,邻接矩阵沿主对角线对称,即满足 (i, j) == (j, i) + # 在无向图中,邻接矩阵关于主对角线对称,即满足 (i, j) == (j, i) self.adj_mat[i][j] = 1 self.adj_mat[j][i] = 1 diff --git a/codes/python/chapter_graph/graph_bfs.py b/codes/python/chapter_graph/graph_bfs.py index a44a849ba..1109bc174 100644 --- a/codes/python/chapter_graph/graph_bfs.py +++ b/codes/python/chapter_graph/graph_bfs.py @@ -29,7 +29,7 @@ def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]: # 遍历该顶点的所有邻接顶点 for adj_vet in graph.adj_list[vet]: if adj_vet in visited: - continue # 跳过已被访问过的顶点 + continue # 跳过已被访问的顶点 que.append(adj_vet) # 只入队未访问的顶点 visited.add(adj_vet) # 标记该顶点已被访问 # 返回顶点遍历序列 diff --git a/codes/python/chapter_graph/graph_dfs.py b/codes/python/chapter_graph/graph_dfs.py index 2d8de8c3b..a065bf8fb 100644 --- a/codes/python/chapter_graph/graph_dfs.py +++ b/codes/python/chapter_graph/graph_dfs.py @@ -19,7 +19,7 @@ def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Verte # 遍历该顶点的所有邻接顶点 for adjVet in graph.adj_list[vet]: if adjVet in visited: - continue # 跳过已被访问过的顶点 + continue # 跳过已被访问的顶点 # 递归访问邻接顶点 dfs(graph, visited, res, adjVet) diff --git a/codes/python/chapter_hashing/array_hash_map.py b/codes/python/chapter_hashing/array_hash_map.py index f71f95cf6..d4217ee43 100644 --- a/codes/python/chapter_hashing/array_hash_map.py +++ b/codes/python/chapter_hashing/array_hash_map.py @@ -14,7 +14,7 @@ class Pair: class ArrayHashMap: - """基于数组简易实现的哈希表""" + """基于数组实现的哈希表""" def __init__(self): """构造方法""" diff --git a/codes/python/chapter_heap/my_heap.py b/codes/python/chapter_heap/my_heap.py index 2072a6cdd..2d7e3d92d 100644 --- a/codes/python/chapter_heap/my_heap.py +++ b/codes/python/chapter_heap/my_heap.py @@ -75,7 +75,7 @@ class MaxHeap: # 判空处理 if self.is_empty(): raise IndexError("堆为空") - # 交换根节点与最右叶节点(即交换首元素与尾元素) + # 交换根节点与最右叶节点(交换首元素与尾元素) self.swap(0, self.size() - 1) # 删除节点 val = self.max_heap.pop() diff --git a/codes/python/chapter_searching/binary_search.py b/codes/python/chapter_searching/binary_search.py index 26005ab2c..d215bb81e 100644 --- a/codes/python/chapter_searching/binary_search.py +++ b/codes/python/chapter_searching/binary_search.py @@ -23,8 +23,8 @@ def binary_search(nums: list[int], target: int) -> int: def binary_search_lcro(nums: list[int], target: int) -> int: - """二分查找(左闭右开)""" - # 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 + """二分查找(左闭右开区间)""" + # 初始化左闭右开区间 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 i, j = 0, len(nums) # 循环,当搜索区间为空时跳出(当 i = j 时为空) while i < j: @@ -47,6 +47,6 @@ if __name__ == "__main__": index: int = binary_search(nums, target) print("目标元素 6 的索引 = ", index) - # 二分查找(左闭右开) + # 二分查找(左闭右开区间) index: int = binary_search_lcro(nums, target) print("目标元素 6 的索引 = ", index) diff --git a/codes/python/chapter_searching/two_sum.py b/codes/python/chapter_searching/two_sum.py index 994e305e7..1e40114a1 100644 --- a/codes/python/chapter_searching/two_sum.py +++ b/codes/python/chapter_searching/two_sum.py @@ -7,7 +7,7 @@ Author: Krahets (krahets@163.com) def two_sum_brute_force(nums: list[int], target: int) -> list[int]: """方法一:暴力枚举""" - # 两层循环,时间复杂度 O(n^2) + # 两层循环,时间复杂度为 O(n^2) for i in range(len(nums) - 1): for j in range(i + 1, len(nums)): if nums[i] + nums[j] == target: @@ -17,9 +17,9 @@ def two_sum_brute_force(nums: list[int], target: int) -> list[int]: def two_sum_hash_table(nums: list[int], target: int) -> list[int]: """方法二:辅助哈希表""" - # 辅助哈希表,空间复杂度 O(n) + # 辅助哈希表,空间复杂度为 O(n) dic = {} - # 单层循环,时间复杂度 O(n) + # 单层循环,时间复杂度为 O(n) for i in range(len(nums)): if target - nums[i] in dic: return [dic[target - nums[i]], i] diff --git a/codes/python/chapter_sorting/bucket_sort.py b/codes/python/chapter_sorting/bucket_sort.py index 764a123bc..510c0931d 100644 --- a/codes/python/chapter_sorting/bucket_sort.py +++ b/codes/python/chapter_sorting/bucket_sort.py @@ -12,7 +12,7 @@ def bucket_sort(nums: list[float]): buckets = [[] for _ in range(k)] # 1. 将数组元素分配到各个桶中 for num in nums: - # 输入数据范围 [0, 1),使用 num * k 映射到索引范围 [0, k-1] + # 输入数据范围为 [0, 1),使用 num * k 映射到索引范围 [0, k-1] i = int(num * k) # 将 num 添加进桶 i buckets[i].append(num) diff --git a/codes/python/chapter_sorting/heap_sort.py b/codes/python/chapter_sorting/heap_sort.py index 405d75f87..3100bdfa4 100644 --- a/codes/python/chapter_sorting/heap_sort.py +++ b/codes/python/chapter_sorting/heap_sort.py @@ -32,7 +32,7 @@ def heap_sort(nums: list[int]): sift_down(nums, len(nums), i) # 从堆中提取最大元素,循环 n-1 轮 for i in range(len(nums) - 1, 0, -1): - # 交换根节点与最右叶节点(即交换首元素与尾元素) + # 交换根节点与最右叶节点(交换首元素与尾元素) nums[0], nums[i] = nums[i], nums[0] # 以根节点为起点,从顶至底进行堆化 sift_down(nums, i, 0) diff --git a/codes/python/chapter_sorting/quick_sort.py b/codes/python/chapter_sorting/quick_sort.py index 925723629..08be3936b 100644 --- a/codes/python/chapter_sorting/quick_sort.py +++ b/codes/python/chapter_sorting/quick_sort.py @@ -10,7 +10,7 @@ class QuickSort: def partition(self, nums: list[int], left: int, right: int) -> int: """哨兵划分""" - # 以 nums[left] 作为基准数 + # 以 nums[left] 为基准数 i, j = left, right while i < j: while i < j and nums[j] >= nums[left]: @@ -50,11 +50,11 @@ class QuickSortMedian: def partition(self, nums: list[int], left: int, right: int) -> int: """哨兵划分(三数取中值)""" - # 以 nums[left] 作为基准数 + # 以 nums[left] 为基准数 med = self.median_three(nums, left, (left + right) // 2, right) # 将中位数交换至数组最左端 nums[left], nums[med] = nums[med], nums[left] - # 以 nums[left] 作为基准数 + # 以 nums[left] 为基准数 i, j = left, right while i < j: while i < j and nums[j] >= nums[left]: @@ -84,7 +84,7 @@ class QuickSortTailCall: def partition(self, nums: list[int], left: int, right: int) -> int: """哨兵划分""" - # 以 nums[left] 作为基准数 + # 以 nums[left] 为基准数 i, j = left, right while i < j: while i < j and nums[j] >= nums[left]: @@ -103,7 +103,7 @@ class QuickSortTailCall: while left < right: # 哨兵划分操作 pivot = self.partition(nums, left, right) - # 对两个子数组中较短的那个执行快排 + # 对两个子数组中较短的那个执行快速排序 if pivot - left < right - pivot: self.quick_sort(nums, left, pivot - 1) # 递归排序左子数组 left = pivot + 1 # 剩余未排序区间为 [pivot + 1, right] diff --git a/codes/python/chapter_sorting/radix_sort.py b/codes/python/chapter_sorting/radix_sort.py index a3b534c10..17849112f 100644 --- a/codes/python/chapter_sorting/radix_sort.py +++ b/codes/python/chapter_sorting/radix_sort.py @@ -13,7 +13,7 @@ def digit(num: int, exp: int) -> int: def counting_sort_digit(nums: list[int], exp: int): """计数排序(根据 nums 第 k 位排序)""" - # 十进制的位范围为 0~9 ,因此需要长度为 10 的桶 + # 十进制的位范围为 0~9 ,因此需要长度为 10 的桶数组 counter = [0] * 10 n = len(nums) # 统计 0~9 各数字的出现次数 diff --git a/codes/python/chapter_stack_and_queue/linkedlist_deque.py b/codes/python/chapter_stack_and_queue/linkedlist_deque.py index e4e42fc73..250bb07be 100644 --- a/codes/python/chapter_stack_and_queue/linkedlist_deque.py +++ b/codes/python/chapter_stack_and_queue/linkedlist_deque.py @@ -35,7 +35,7 @@ class LinkedListDeque: def push(self, num: int, is_front: bool): """入队操作""" node = ListNode(num) - # 若链表为空,则令 front, rear 都指向 node + # 若链表为空,则令 front 和 rear 都指向 node if self.is_empty(): self._front = self._rear = node # 队首入队操作 diff --git a/codes/python/chapter_tree/binary_tree.py b/codes/python/chapter_tree/binary_tree.py index a007e419b..dbc2f582e 100644 --- a/codes/python/chapter_tree/binary_tree.py +++ b/codes/python/chapter_tree/binary_tree.py @@ -20,7 +20,7 @@ if __name__ == "__main__": n3 = TreeNode(val=3) n4 = TreeNode(val=4) n5 = TreeNode(val=5) - # 构建引用指向(即指针) + # 构建节点之间的引用(指针) n1.left = n2 n1.right = n3 n2.left = n4 diff --git a/codes/rust/chapter_array_and_linkedlist/array.rs b/codes/rust/chapter_array_and_linkedlist/array.rs index 76f0f3f52..4ed9f8a66 100644 --- a/codes/rust/chapter_array_and_linkedlist/array.rs +++ b/codes/rust/chapter_array_and_linkedlist/array.rs @@ -35,11 +35,11 @@ fn insert(nums: &mut Vec, num: i32, index: usize) { for i in (index + 1..nums.len()).rev() { nums[i] = nums[i - 1]; } - // 将 num 赋给 index 处元素 + // 将 num 赋给 index 处的元素 nums[index] = num; } -/* 删除索引 index 处元素 */ +/* 删除索引 index 处的元素 */ fn remove(nums: &mut Vec, index: usize) { // 把索引 index 之后的所有元素向前移动一位 for i in index..nums.len() - 1 { diff --git a/codes/rust/chapter_array_and_linkedlist/linked_list.rs b/codes/rust/chapter_array_and_linkedlist/linked_list.rs index 7a8dce70f..39f82c739 100644 --- a/codes/rust/chapter_array_and_linkedlist/linked_list.rs +++ b/codes/rust/chapter_array_and_linkedlist/linked_list.rs @@ -57,7 +57,7 @@ fn main() { let n2 = ListNode::new(2); let n3 = ListNode::new(5); let n4 = ListNode::new(4); - // 构建引用指向 + // 构建节点之间的引用 n0.borrow_mut().next = Some(n1.clone()); n1.borrow_mut().next = Some(n2.clone()); n2.borrow_mut().next = Some(n3.clone()); diff --git a/codes/rust/chapter_array_and_linkedlist/list.rs b/codes/rust/chapter_array_and_linkedlist/list.rs index e1f384777..e0a242286 100644 --- a/codes/rust/chapter_array_and_linkedlist/list.rs +++ b/codes/rust/chapter_array_and_linkedlist/list.rs @@ -27,7 +27,7 @@ fn main() { print!("\n清空列表后 nums = "); print_util::print_array(&nums); - // 尾部添加元素 + // 在尾部添加元素 nums.push(1); nums.push(3); nums.push(2); @@ -36,7 +36,7 @@ fn main() { print!("\n添加元素后 nums = "); print_util::print_array(&nums); - // 中间插入元素 + // 在中间插入元素 nums.insert(3, 6); print!("\n在索引 3 处插入数字 6 ,得到 nums = "); print_util::print_array(&nums); diff --git a/codes/rust/chapter_array_and_linkedlist/my_list.rs b/codes/rust/chapter_array_and_linkedlist/my_list.rs index efc6138ae..12097e172 100644 --- a/codes/rust/chapter_array_and_linkedlist/my_list.rs +++ b/codes/rust/chapter_array_and_linkedlist/my_list.rs @@ -6,12 +6,12 @@ include!("../include/include.rs"); -/* 列表类简易实现 */ +/* 列表类 */ #[allow(dead_code)] struct MyList { arr: Vec, // 数组(存储列表元素) capacity: usize, // 列表容量 - size: usize, // 列表长度(即当前元素数量) + size: usize, // 列表长度(当前元素数量) extend_ratio: usize, // 每次列表扩容的倍数 } @@ -29,7 +29,7 @@ impl MyList { } } - /* 获取列表长度(即当前元素数量)*/ + /* 获取列表长度(当前元素数量)*/ pub fn size(&self) -> usize { return self.size; } @@ -52,7 +52,7 @@ impl MyList { self.arr[index] = num; } - /* 尾部添加元素 */ + /* 在尾部添加元素 */ pub fn add(&mut self, num: i32) { // 元素数量超出容量时,触发扩容机制 if self.size == self.capacity() { @@ -63,7 +63,7 @@ impl MyList { self.size += 1; } - /* 中间插入元素 */ + /* 在中间插入元素 */ pub fn insert(&mut self, index: usize, num: i32) { if index >= self.size() {panic!("索引越界")}; // 元素数量超出容量时,触发扩容机制 @@ -117,7 +117,7 @@ impl MyList { fn main() { /* 初始化列表 */ let mut nums = MyList::new(10); - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.add(1); nums.add(3); nums.add(2); @@ -127,7 +127,7 @@ fn main() { print_util::print_array(&nums.to_array()); print!(" ,容量 = {} ,长度 = {}", nums.capacity(), nums.size()); - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.insert(3, 6); print!("\n在索引 3 处插入数字 6 ,得到 nums = "); print_util::print_array(&nums.to_array()); diff --git a/codes/rust/chapter_backtracking/n_queens.rs b/codes/rust/chapter_backtracking/n_queens.rs index ffa5b890f..7309838ab 100644 --- a/codes/rust/chapter_backtracking/n_queens.rs +++ b/codes/rust/chapter_backtracking/n_queens.rs @@ -21,7 +21,7 @@ fn backtrack(row: usize, n: usize, state: &mut Vec>, res: &mut Vec Vec>> { state.push(row); } let mut cols = vec![false; n]; // 记录列是否有皇后 - let mut diags1 = vec![false; 2 * n - 1]; // 记录主对角线是否有皇后 - let mut diags2 = vec![false; 2 * n - 1]; // 记录副对角线是否有皇后 + let mut diags1 = vec![false; 2 * n - 1]; // 记录主对角线上是否有皇后 + let mut diags2 = vec![false; 2 * n - 1]; // 记录副对角线上是否有皇后 let mut res: Vec>> = Vec::new(); backtrack(0, n, &mut state, &mut res, &mut cols, &mut diags1, &mut diags2); diff --git a/codes/rust/chapter_computational_complexity/iteration.rs b/codes/rust/chapter_computational_complexity/iteration.rs index 40326e681..8f2a175b1 100644 --- a/codes/rust/chapter_computational_complexity/iteration.rs +++ b/codes/rust/chapter_computational_complexity/iteration.rs @@ -31,7 +31,7 @@ fn while_loop(n: i32) -> i32 { fn while_loop_ii(n: i32) -> i32 { let mut res = 0; let mut i = 1; // 初始化条件变量 - // 循环求和 1, 4, ... + // 循环求和 1, 4, 10, ... while i <= n { res += i; // 更新条件变量 diff --git a/codes/rust/chapter_divide_and_conquer/hanota.rs b/codes/rust/chapter_divide_and_conquer/hanota.rs index 1c61e62a3..649e9c2f7 100644 --- a/codes/rust/chapter_divide_and_conquer/hanota.rs +++ b/codes/rust/chapter_divide_and_conquer/hanota.rs @@ -14,7 +14,7 @@ fn move_pan(src: &mut Vec, tar: &mut Vec) { tar.push(pan); } -/* 求解汉诺塔:问题 f(i) */ +/* 求解汉诺塔问题 f(i) */ fn dfs(i: i32, src: &mut Vec, buf: &mut Vec, tar: &mut Vec) { // 若 src 只剩下一个圆盘,则直接将其移到 tar if i == 1 { @@ -29,7 +29,7 @@ fn dfs(i: i32, src: &mut Vec, buf: &mut Vec, tar: &mut Vec) { dfs(i - 1, buf, src, tar); } -/* 求解汉诺塔 */ +/* 求解汉诺塔问题 */ fn solve_hanota(A: &mut Vec, B: &mut Vec, C: &mut Vec) { let n = A.len() as i32; // 将 A 顶部 n 个圆盘借助 B 移到 C diff --git a/codes/rust/chapter_dynamic_programming/climbing_stairs_backtrack.rs b/codes/rust/chapter_dynamic_programming/climbing_stairs_backtrack.rs index 726d516c2..bd4e2150f 100644 --- a/codes/rust/chapter_dynamic_programming/climbing_stairs_backtrack.rs +++ b/codes/rust/chapter_dynamic_programming/climbing_stairs_backtrack.rs @@ -20,7 +20,7 @@ fn backtrack(choices: &[i32], state: i32, n: i32, res: &mut [i32]) { /* 爬楼梯:回溯 */ fn climbing_stairs_backtrack(n: usize) -> i32 { - let choices = vec![ 1, 2 ]; // 可选择向上爬 1 或 2 阶 + let choices = vec![ 1, 2 ]; // 可选择向上爬 1 阶或 2 阶 let state = 0; // 从第 0 阶开始爬 let mut res = Vec::new(); res.push(0); // 使用 res[0] 记录方案数量 diff --git a/codes/rust/chapter_dynamic_programming/coin_change.rs b/codes/rust/chapter_dynamic_programming/coin_change.rs index 223b6cd35..91fc8f924 100644 --- a/codes/rust/chapter_dynamic_programming/coin_change.rs +++ b/codes/rust/chapter_dynamic_programming/coin_change.rs @@ -14,7 +14,7 @@ fn coin_change_dp(coins: &[i32], amt: usize) -> i32 { for a in 1..= amt { dp[0][a] = max; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for i in 1..=n { for a in 1..=amt { if coins[i - 1] > a as i32 { diff --git a/codes/rust/chapter_dynamic_programming/edit_distance.rs b/codes/rust/chapter_dynamic_programming/edit_distance.rs index 72d5cfc1e..981389b6c 100644 --- a/codes/rust/chapter_dynamic_programming/edit_distance.rs +++ b/codes/rust/chapter_dynamic_programming/edit_distance.rs @@ -58,7 +58,7 @@ fn edit_distance_dp(s: &str, t: &str) -> i32 { for j in 1..m { dp[0][j] = j as i32; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for i in 1..=n { for j in 1..=m { if s.chars().nth(i - 1) == t.chars().nth(j - 1) { diff --git a/codes/rust/chapter_dynamic_programming/knapsack.rs b/codes/rust/chapter_dynamic_programming/knapsack.rs index 2408306d0..f6df15a2f 100644 --- a/codes/rust/chapter_dynamic_programming/knapsack.rs +++ b/codes/rust/chapter_dynamic_programming/knapsack.rs @@ -6,11 +6,11 @@ /* 0-1 背包:暴力搜索 */ fn knapsack_dfs(wgt: &[i32], val: &[i32], i: usize, c: usize) -> i32 { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if i == 0 || c == 0 { return 0; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if wgt[i - 1] > c as i32 { return knapsack_dfs(wgt, val, i - 1, c); } @@ -23,7 +23,7 @@ fn knapsack_dfs(wgt: &[i32], val: &[i32], i: usize, c: usize) -> i32 { /* 0-1 背包:记忆化搜索 */ fn knapsack_dfs_mem(wgt: &[i32], val: &[i32], mem: &mut Vec>, i: usize, c: usize) -> i32 { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if i == 0 || c == 0 { return 0; } @@ -31,7 +31,7 @@ fn knapsack_dfs_mem(wgt: &[i32], val: &[i32], mem: &mut Vec>, i: usize, if mem[i][c] != -1 { return mem[i][c]; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if wgt[i - 1] > c as i32 { return knapsack_dfs_mem(wgt, val, mem, i - 1, c); } diff --git a/codes/rust/chapter_dynamic_programming/min_path_sum.rs b/codes/rust/chapter_dynamic_programming/min_path_sum.rs index 595f8d42e..abc1ed75b 100644 --- a/codes/rust/chapter_dynamic_programming/min_path_sum.rs +++ b/codes/rust/chapter_dynamic_programming/min_path_sum.rs @@ -57,7 +57,7 @@ fn min_path_sum_dp(grid: &Vec>) -> i32 { for i in 1..n { dp[i][0] = dp[i - 1][0] + grid[i][0]; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for i in 1..n { for j in 1..m { dp[i][j] = std::cmp::min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; diff --git a/codes/rust/chapter_graph/graph_adjacency_list.rs b/codes/rust/chapter_graph/graph_adjacency_list.rs index b453c4e5d..26b0692bc 100644 --- a/codes/rust/chapter_graph/graph_adjacency_list.rs +++ b/codes/rust/chapter_graph/graph_adjacency_list.rs @@ -10,7 +10,7 @@ use std::collections::HashMap; /* 基于邻接表实现的无向图类型 */ pub struct GraphAdjList { - // 邻接表,key: 顶点,value:该顶点的所有邻接顶点 + // 邻接表,key:顶点,value:该顶点的所有邻接顶点 pub adj_list: HashMap>, } diff --git a/codes/rust/chapter_graph/graph_adjacency_matrix.rs b/codes/rust/chapter_graph/graph_adjacency_matrix.rs index 1418bee05..ac02fa815 100644 --- a/codes/rust/chapter_graph/graph_adjacency_matrix.rs +++ b/codes/rust/chapter_graph/graph_adjacency_matrix.rs @@ -72,7 +72,7 @@ impl GraphAdjMat { if i >= self.size() || j >= self.size() || i == j { panic!("index error") } - // 在无向图中,邻接矩阵沿主对角线对称,即满足 (i, j) == (j, i) + // 在无向图中,邻接矩阵关于主对角线对称,即满足 (i, j) == (j, i) self.adj_mat[i][j] = 1; self.adj_mat[j][i] = 1; } diff --git a/codes/rust/chapter_graph/graph_bfs.rs b/codes/rust/chapter_graph/graph_bfs.rs index 91525facc..f9492c595 100644 --- a/codes/rust/chapter_graph/graph_bfs.rs +++ b/codes/rust/chapter_graph/graph_bfs.rs @@ -29,7 +29,7 @@ fn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec { if let Some(adj_vets) = graph.adj_list.get(&vet) { for &adj_vet in adj_vets { if visited.contains(&adj_vet) { - continue; // 跳过已被访问过的顶点 + continue; // 跳过已被访问的顶点 } que.push_back(adj_vet); // 只入队未访问的顶点 visited.insert(adj_vet); // 标记该顶点已被访问 diff --git a/codes/rust/chapter_graph/graph_dfs.rs b/codes/rust/chapter_graph/graph_dfs.rs index 374106669..bc8462b6a 100644 --- a/codes/rust/chapter_graph/graph_dfs.rs +++ b/codes/rust/chapter_graph/graph_dfs.rs @@ -18,7 +18,7 @@ fn dfs(graph: &GraphAdjList, visited: &mut HashSet, res: &mut Vec> } diff --git a/codes/rust/chapter_heap/my_heap.rs b/codes/rust/chapter_heap/my_heap.rs index aeca99f16..08d95fb4d 100644 --- a/codes/rust/chapter_heap/my_heap.rs +++ b/codes/rust/chapter_heap/my_heap.rs @@ -93,7 +93,7 @@ impl MaxHeap { if self.is_empty() { panic!("index out of bounds"); } - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) self.swap(0, self.size() - 1); // 删除节点 let val = self.max_heap.remove(self.size() - 1); diff --git a/codes/rust/chapter_searching/binary_search.rs b/codes/rust/chapter_searching/binary_search.rs index a4ae89306..345266e9f 100644 --- a/codes/rust/chapter_searching/binary_search.rs +++ b/codes/rust/chapter_searching/binary_search.rs @@ -24,9 +24,9 @@ fn binary_search(nums: &[i32], target: i32) -> i32 { return -1; } -/* 二分查找(左闭右开) */ +/* 二分查找(左闭右开区间) */ fn binary_search_lcro(nums: &[i32], target: i32) -> i32 { - // 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 + // 初始化左闭右开区间 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 let mut i = 0; let mut j = nums.len() as i32; // 循环,当搜索区间为空时跳出(当 i = j 时为空) @@ -53,7 +53,7 @@ pub fn main() { let mut index = binary_search(&nums, target); println!("目标元素 6 的索引 = {index}"); - // 二分查找(左闭右开) + // 二分查找(左闭右开区间) index = binary_search_lcro(&nums, target); println!("目标元素 6 的索引 = {index}"); } diff --git a/codes/rust/chapter_searching/two_sum.rs b/codes/rust/chapter_searching/two_sum.rs index c97467dd1..1c4fd455e 100644 --- a/codes/rust/chapter_searching/two_sum.rs +++ b/codes/rust/chapter_searching/two_sum.rs @@ -11,7 +11,7 @@ use std::collections::HashMap; /* 方法一:暴力枚举 */ pub fn two_sum_brute_force(nums: &Vec, target: i32) -> Option> { let size = nums.len(); - // 两层循环,时间复杂度 O(n^2) + // 两层循环,时间复杂度为 O(n^2) for i in 0..size - 1 { for j in i + 1..size { if nums[i] + nums[j] == target { @@ -24,9 +24,9 @@ pub fn two_sum_brute_force(nums: &Vec, target: i32) -> Option> { /* 方法二:辅助哈希表 */ pub fn two_sum_hash_table(nums: &Vec, target: i32) -> Option> { - // 辅助哈希表,空间复杂度 O(n) + // 辅助哈希表,空间复杂度为 O(n) let mut dic = HashMap::new(); - // 单层循环,时间复杂度 O(n) + // 单层循环,时间复杂度为 O(n) for (i, num) in nums.iter().enumerate() { match dic.get(&(target - num)) { Some(v) => return Some(vec![*v as i32, i as i32]), diff --git a/codes/rust/chapter_sorting/bucket_sort.rs b/codes/rust/chapter_sorting/bucket_sort.rs index ada804702..8a80394fa 100644 --- a/codes/rust/chapter_sorting/bucket_sort.rs +++ b/codes/rust/chapter_sorting/bucket_sort.rs @@ -13,7 +13,7 @@ fn bucket_sort(nums: &mut [f64]) { let mut buckets = vec![vec![]; k]; // 1. 将数组元素分配到各个桶中 for &mut num in &mut *nums { - // 输入数据范围 [0, 1),使用 num * k 映射到索引范围 [0, k-1] + // 输入数据范围为 [0, 1),使用 num * k 映射到索引范围 [0, k-1] let i = (num * k as f64) as usize; // 将 num 添加进桶 i buckets[i].push(num); diff --git a/codes/rust/chapter_sorting/heap_sort.rs b/codes/rust/chapter_sorting/heap_sort.rs index 254d08dfe..6e0c93837 100644 --- a/codes/rust/chapter_sorting/heap_sort.rs +++ b/codes/rust/chapter_sorting/heap_sort.rs @@ -40,7 +40,7 @@ fn heap_sort(nums: &mut [i32]) { } // 从堆中提取最大元素,循环 n-1 轮 for i in (1..=nums.len() - 1).rev() { - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) let tmp = nums[0]; nums[0] = nums[i]; nums[i] = tmp; diff --git a/codes/rust/chapter_sorting/quick_sort.rs b/codes/rust/chapter_sorting/quick_sort.rs index 314e0bac3..7989777ee 100644 --- a/codes/rust/chapter_sorting/quick_sort.rs +++ b/codes/rust/chapter_sorting/quick_sort.rs @@ -11,7 +11,7 @@ struct QuickSort; impl QuickSort { /* 哨兵划分 */ fn partition(nums: &mut [i32], left: usize, right: usize) -> usize { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 let (mut i, mut j) = (left, right); while i < j { while i < j && nums[j] >= nums[left] { @@ -62,7 +62,7 @@ impl QuickSortMedian { let med = Self::median_three(nums, left, (left + right) / 2, right); // 将中位数交换至数组最左端 nums.swap(left, med); - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 let (mut i, mut j) = (left, right); while i < j { while i < j && nums[j] >= nums[left] { @@ -97,7 +97,7 @@ struct QuickSortTailCall; impl QuickSortTailCall { /* 哨兵划分 */ fn partition(nums: &mut [i32], left: usize, right: usize) -> usize { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 let (mut i, mut j) = (left, right); while i < j { while i < j && nums[j] >= nums[left] { @@ -118,7 +118,7 @@ impl QuickSortTailCall { while left < right { // 哨兵划分操作 let pivot = Self::partition(nums, left as usize, right as usize) as i32; - // 对两个子数组中较短的那个执行快排 + // 对两个子数组中较短的那个执行快速排序 if pivot - left < right - pivot { Self::quick_sort(left, pivot - 1, nums); // 递归排序左子数组 left = pivot + 1; // 剩余未排序区间为 [pivot + 1, right] diff --git a/codes/rust/chapter_sorting/radix_sort.rs b/codes/rust/chapter_sorting/radix_sort.rs index 0508c52f3..f350e5d62 100644 --- a/codes/rust/chapter_sorting/radix_sort.rs +++ b/codes/rust/chapter_sorting/radix_sort.rs @@ -14,7 +14,7 @@ fn digit(num: i32, exp: i32) -> usize { /* 计数排序(根据 nums 第 k 位排序) */ fn counting_sort_digit(nums: &mut [i32], exp: i32) { - // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶 + // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶数组 let mut counter = [0; 10]; let n = nums.len(); // 统计 0~9 各数字的出现次数 diff --git a/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs b/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs index 1823c1218..13f0150aa 100644 --- a/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs +++ b/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs @@ -59,7 +59,7 @@ impl LinkedListDeque { // 队首入队操作 if is_front { match self.front.take() { - // 若链表为空,则令 front, rear 都指向 node + // 若链表为空,则令 front 和 rear 都指向 node None => { self.rear = Some(node.clone()); self.front = Some(node); @@ -75,7 +75,7 @@ impl LinkedListDeque { // 队尾入队操作 else { match self.rear.take() { - // 若链表为空,则令 front, rear 都指向 node + // 若链表为空,则令 front 和 rear 都指向 node None => { self.front = Some(node.clone()); self.rear = Some(node); diff --git a/codes/rust/chapter_tree/binary_tree.rs b/codes/rust/chapter_tree/binary_tree.rs index ec9ccedf2..c1e4ba903 100644 --- a/codes/rust/chapter_tree/binary_tree.rs +++ b/codes/rust/chapter_tree/binary_tree.rs @@ -17,7 +17,7 @@ fn main() { let n3 = TreeNode::new(3); let n4 = TreeNode::new(4); let n5 = TreeNode::new(5); - // 构建引用指向(即指针) + // 构建节点之间的引用(指针) n1.borrow_mut().left = Some(Rc::clone(&n2)); n1.borrow_mut().right = Some(Rc::clone(&n3)); n2.borrow_mut().left = Some(Rc::clone(&n4)); diff --git a/codes/swift/chapter_array_and_linkedlist/array.swift b/codes/swift/chapter_array_and_linkedlist/array.swift index 929a0e96f..bc96d1d8a 100644 --- a/codes/swift/chapter_array_and_linkedlist/array.swift +++ b/codes/swift/chapter_array_and_linkedlist/array.swift @@ -31,11 +31,11 @@ func insert(nums: inout [Int], num: Int, index: Int) { for i in nums.indices.dropFirst(index).reversed() { nums[i] = nums[i - 1] } - // 将 num 赋给 index 处元素 + // 将 num 赋给 index 处的元素 nums[index] = num } -/* 删除索引 index 处元素 */ +/* 删除索引 index 处的元素 */ func remove(nums: inout [Int], index: Int) { // 把索引 index 之后的所有元素向前移动一位 for i in nums.indices.dropFirst(index).dropLast() { diff --git a/codes/swift/chapter_array_and_linkedlist/linked_list.swift b/codes/swift/chapter_array_and_linkedlist/linked_list.swift index 62274de1b..dae3aa55c 100644 --- a/codes/swift/chapter_array_and_linkedlist/linked_list.swift +++ b/codes/swift/chapter_array_and_linkedlist/linked_list.swift @@ -62,7 +62,7 @@ enum LinkedList { let n2 = ListNode(x: 2) let n3 = ListNode(x: 5) let n4 = ListNode(x: 4) - // 构建引用指向 + // 构建节点之间的引用 n0.next = n1 n1.next = n2 n2.next = n3 diff --git a/codes/swift/chapter_array_and_linkedlist/list.swift b/codes/swift/chapter_array_and_linkedlist/list.swift index 4d64f5578..2b815e1a7 100644 --- a/codes/swift/chapter_array_and_linkedlist/list.swift +++ b/codes/swift/chapter_array_and_linkedlist/list.swift @@ -24,7 +24,7 @@ enum List { nums.removeAll() print("清空列表后 nums = \(nums)") - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.append(1) nums.append(3) nums.append(2) @@ -32,7 +32,7 @@ enum List { nums.append(4) print("添加元素后 nums = \(nums)") - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.insert(6, at: 3) print("在索引 3 处插入数字 6 ,得到 nums = \(nums)") diff --git a/codes/swift/chapter_array_and_linkedlist/my_list.swift b/codes/swift/chapter_array_and_linkedlist/my_list.swift index c34b72f2d..7d2700743 100644 --- a/codes/swift/chapter_array_and_linkedlist/my_list.swift +++ b/codes/swift/chapter_array_and_linkedlist/my_list.swift @@ -4,11 +4,11 @@ * Author: nuomi1 (nuomi1@qq.com) */ -/* 列表类简易实现 */ +/* 列表类 */ class MyList { private var arr: [Int] // 数组(存储列表元素) private var _capacity = 10 // 列表容量 - private var _size = 0 // 列表长度(即当前元素数量) + private var _size = 0 // 列表长度(当前元素数量) private let extendRatio = 2 // 每次列表扩容的倍数 /* 构造方法 */ @@ -16,7 +16,7 @@ class MyList { arr = Array(repeating: 0, count: _capacity) } - /* 获取列表长度(即当前元素数量)*/ + /* 获取列表长度(当前元素数量)*/ func size() -> Int { _size } @@ -43,7 +43,7 @@ class MyList { arr[index] = num } - /* 尾部添加元素 */ + /* 在尾部添加元素 */ func add(num: Int) { // 元素数量超出容量时,触发扩容机制 if _size == _capacity { @@ -54,7 +54,7 @@ class MyList { _size += 1 } - /* 中间插入元素 */ + /* 在中间插入元素 */ func insert(index: Int, num: Int) { if index < 0 || index >= _size { fatalError("索引越界") @@ -113,7 +113,7 @@ enum _MyList { static func main() { /* 初始化列表 */ let nums = MyList() - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.add(num: 1) nums.add(num: 3) nums.add(num: 2) @@ -121,7 +121,7 @@ enum _MyList { nums.add(num: 4) print("列表 nums = \(nums.toArray()) ,容量 = \(nums.capacity()) ,长度 = \(nums.size())") - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.insert(index: 3, num: 6) print("在索引 3 处插入数字 6 ,得到 nums = \(nums.toArray())") diff --git a/codes/swift/chapter_backtracking/n_queens.swift b/codes/swift/chapter_backtracking/n_queens.swift index 6e79373d0..5c395a975 100644 --- a/codes/swift/chapter_backtracking/n_queens.swift +++ b/codes/swift/chapter_backtracking/n_queens.swift @@ -16,7 +16,7 @@ func backtrack(row: Int, n: Int, state: inout [[String]], res: inout [[[String]] // 计算该格子对应的主对角线和副对角线 let diag1 = row - col + n - 1 let diag2 = row + col - // 剪枝:不允许该格子所在列、主对角线、副对角线存在皇后 + // 剪枝:不允许该格子所在列、主对角线、副对角线上存在皇后 if !cols[col] && !diags1[diag1] && !diags2[diag2] { // 尝试:将皇后放置在该格子 state[row][col] = "Q" @@ -39,8 +39,8 @@ func nQueens(n: Int) -> [[[String]]] { // 初始化 n*n 大小的棋盘,其中 'Q' 代表皇后,'#' 代表空位 var state = Array(repeating: Array(repeating: "#", count: n), count: n) var cols = Array(repeating: false, count: n) // 记录列是否有皇后 - var diags1 = Array(repeating: false, count: 2 * n - 1) // 记录主对角线是否有皇后 - var diags2 = Array(repeating: false, count: 2 * n - 1) // 记录副对角线是否有皇后 + var diags1 = Array(repeating: false, count: 2 * n - 1) // 记录主对角线上是否有皇后 + var diags2 = Array(repeating: false, count: 2 * n - 1) // 记录副对角线上是否有皇后 var res: [[[String]]] = [] backtrack(row: 0, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2) diff --git a/codes/swift/chapter_computational_complexity/iteration.swift b/codes/swift/chapter_computational_complexity/iteration.swift index 866896eac..8f331c0b0 100644 --- a/codes/swift/chapter_computational_complexity/iteration.swift +++ b/codes/swift/chapter_computational_complexity/iteration.swift @@ -30,7 +30,7 @@ func whileLoop(n: Int) -> Int { func whileLoopII(n: Int) -> Int { var res = 0 var i = 1 // 初始化条件变量 - // 循环求和 1, 4, ... + // 循环求和 1, 4, 10, ... while i <= n { res += i // 更新条件变量 diff --git a/codes/swift/chapter_divide_and_conquer/hanota.swift b/codes/swift/chapter_divide_and_conquer/hanota.swift index fde869b17..1ba70fcbb 100644 --- a/codes/swift/chapter_divide_and_conquer/hanota.swift +++ b/codes/swift/chapter_divide_and_conquer/hanota.swift @@ -12,7 +12,7 @@ func move(src: inout [Int], tar: inout [Int]) { tar.append(pan) } -/* 求解汉诺塔:问题 f(i) */ +/* 求解汉诺塔问题 f(i) */ func dfs(i: Int, src: inout [Int], buf: inout [Int], tar: inout [Int]) { // 若 src 只剩下一个圆盘,则直接将其移到 tar if i == 1 { @@ -27,7 +27,7 @@ func dfs(i: Int, src: inout [Int], buf: inout [Int], tar: inout [Int]) { dfs(i: i - 1, src: &buf, buf: &src, tar: &tar) } -/* 求解汉诺塔 */ +/* 求解汉诺塔问题 */ func solveHanota(A: inout [Int], B: inout [Int], C: inout [Int]) { let n = A.count // 列表尾部是柱子顶部 diff --git a/codes/swift/chapter_dynamic_programming/climbing_stairs_backtrack.swift b/codes/swift/chapter_dynamic_programming/climbing_stairs_backtrack.swift index 2fcd71ee7..d1e241bab 100644 --- a/codes/swift/chapter_dynamic_programming/climbing_stairs_backtrack.swift +++ b/codes/swift/chapter_dynamic_programming/climbing_stairs_backtrack.swift @@ -22,7 +22,7 @@ func backtrack(choices: [Int], state: Int, n: Int, res: inout [Int]) { /* 爬楼梯:回溯 */ func climbingStairsBacktrack(n: Int) -> Int { - let choices = [1, 2] // 可选择向上爬 1 或 2 阶 + let choices = [1, 2] // 可选择向上爬 1 阶或 2 阶 let state = 0 // 从第 0 阶开始爬 var res: [Int] = [] res.append(0) // 使用 res[0] 记录方案数量 diff --git a/codes/swift/chapter_dynamic_programming/coin_change.swift b/codes/swift/chapter_dynamic_programming/coin_change.swift index f6be53c1a..08906ec67 100644 --- a/codes/swift/chapter_dynamic_programming/coin_change.swift +++ b/codes/swift/chapter_dynamic_programming/coin_change.swift @@ -14,7 +14,7 @@ func coinChangeDP(coins: [Int], amt: Int) -> Int { for a in stride(from: 1, through: amt, by: 1) { dp[0][a] = MAX } - // 状态转移:其余行列 + // 状态转移:其余行和列 for i in stride(from: 1, through: n, by: 1) { for a in stride(from: 1, through: amt, by: 1) { if coins[i - 1] > a { diff --git a/codes/swift/chapter_dynamic_programming/edit_distance.swift b/codes/swift/chapter_dynamic_programming/edit_distance.swift index 5d790497f..51ea34a4d 100644 --- a/codes/swift/chapter_dynamic_programming/edit_distance.swift +++ b/codes/swift/chapter_dynamic_programming/edit_distance.swift @@ -73,7 +73,7 @@ func editDistanceDP(s: String, t: String) -> Int { for j in stride(from: 1, through: m, by: 1) { dp[0][j] = j } - // 状态转移:其余行列 + // 状态转移:其余行和列 for i in stride(from: 1, through: n, by: 1) { for j in stride(from: 1, through: m, by: 1) { if s.utf8CString[i - 1] == t.utf8CString[j - 1] { diff --git a/codes/swift/chapter_dynamic_programming/knapsack.swift b/codes/swift/chapter_dynamic_programming/knapsack.swift index 00dc5d8bc..cc9378cce 100644 --- a/codes/swift/chapter_dynamic_programming/knapsack.swift +++ b/codes/swift/chapter_dynamic_programming/knapsack.swift @@ -6,11 +6,11 @@ /* 0-1 背包:暴力搜索 */ func knapsackDFS(wgt: [Int], val: [Int], i: Int, c: Int) -> Int { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if i == 0 || c == 0 { return 0 } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if wgt[i - 1] > c { return knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c) } @@ -23,7 +23,7 @@ func knapsackDFS(wgt: [Int], val: [Int], i: Int, c: Int) -> Int { /* 0-1 背包:记忆化搜索 */ func knapsackDFSMem(wgt: [Int], val: [Int], mem: inout [[Int]], i: Int, c: Int) -> Int { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if i == 0 || c == 0 { return 0 } @@ -31,7 +31,7 @@ func knapsackDFSMem(wgt: [Int], val: [Int], mem: inout [[Int]], i: Int, c: Int) if mem[i][c] != -1 { return mem[i][c] } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if wgt[i - 1] > c { return knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c) } diff --git a/codes/swift/chapter_dynamic_programming/min_path_sum.swift b/codes/swift/chapter_dynamic_programming/min_path_sum.swift index 26d8220fa..014d08b5b 100644 --- a/codes/swift/chapter_dynamic_programming/min_path_sum.swift +++ b/codes/swift/chapter_dynamic_programming/min_path_sum.swift @@ -58,7 +58,7 @@ func minPathSumDP(grid: [[Int]]) -> Int { for i in stride(from: 1, to: n, by: 1) { dp[i][0] = dp[i - 1][0] + grid[i][0] } - // 状态转移:其余行列 + // 状态转移:其余行和列 for i in stride(from: 1, to: n, by: 1) { for j in stride(from: 1, to: m, by: 1) { dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j] diff --git a/codes/swift/chapter_graph/graph_adjacency_list.swift b/codes/swift/chapter_graph/graph_adjacency_list.swift index dac9869e1..ff88186c3 100644 --- a/codes/swift/chapter_graph/graph_adjacency_list.swift +++ b/codes/swift/chapter_graph/graph_adjacency_list.swift @@ -8,7 +8,7 @@ import utils /* 基于邻接表实现的无向图类 */ public class GraphAdjList { - // 邻接表,key: 顶点,value:该顶点的所有邻接顶点 + // 邻接表,key:顶点,value:该顶点的所有邻接顶点 public private(set) var adjList: [Vertex: [Vertex]] /* 构造方法 */ diff --git a/codes/swift/chapter_graph/graph_adjacency_matrix.swift b/codes/swift/chapter_graph/graph_adjacency_matrix.swift index 51d7ed94c..a600fb217 100644 --- a/codes/swift/chapter_graph/graph_adjacency_matrix.swift +++ b/codes/swift/chapter_graph/graph_adjacency_matrix.swift @@ -67,7 +67,7 @@ class GraphAdjMat { if i < 0 || j < 0 || i >= size() || j >= size() || i == j { fatalError("越界") } - // 在无向图中,邻接矩阵沿主对角线对称,即满足 (i, j) == (j, i) + // 在无向图中,邻接矩阵关于主对角线对称,即满足 (i, j) == (j, i) adjMat[i][j] = 1 adjMat[j][i] = 1 } diff --git a/codes/swift/chapter_graph/graph_bfs.swift b/codes/swift/chapter_graph/graph_bfs.swift index f367c80d5..ceb3789a6 100644 --- a/codes/swift/chapter_graph/graph_bfs.swift +++ b/codes/swift/chapter_graph/graph_bfs.swift @@ -23,7 +23,7 @@ func graphBFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] { // 遍历该顶点的所有邻接顶点 for adjVet in graph.adjList[vet] ?? [] { if visited.contains(adjVet) { - continue // 跳过已被访问过的顶点 + continue // 跳过已被访问的顶点 } que.append(adjVet) // 只入队未访问的顶点 visited.insert(adjVet) // 标记该顶点已被访问 diff --git a/codes/swift/chapter_graph/graph_dfs.swift b/codes/swift/chapter_graph/graph_dfs.swift index 53268c92e..d617254c7 100644 --- a/codes/swift/chapter_graph/graph_dfs.swift +++ b/codes/swift/chapter_graph/graph_dfs.swift @@ -14,7 +14,7 @@ func dfs(graph: GraphAdjList, visited: inout Set, res: inout [Vertex], v // 遍历该顶点的所有邻接顶点 for adjVet in graph.adjList[vet] ?? [] { if visited.contains(adjVet) { - continue // 跳过已被访问过的顶点 + continue // 跳过已被访问的顶点 } // 递归访问邻接顶点 dfs(graph: graph, visited: &visited, res: &res, vet: adjVet) diff --git a/codes/swift/chapter_hashing/array_hash_map.swift b/codes/swift/chapter_hashing/array_hash_map.swift index 82b7ff19a..735078933 100644 --- a/codes/swift/chapter_hashing/array_hash_map.swift +++ b/codes/swift/chapter_hashing/array_hash_map.swift @@ -6,7 +6,7 @@ import utils -/* 基于数组简易实现的哈希表 */ +/* 基于数组实现的哈希表 */ class ArrayHashMap { private var buckets: [Pair?] = [] diff --git a/codes/swift/chapter_heap/my_heap.swift b/codes/swift/chapter_heap/my_heap.swift index 9bca63100..d9e38f5c7 100644 --- a/codes/swift/chapter_heap/my_heap.swift +++ b/codes/swift/chapter_heap/my_heap.swift @@ -86,7 +86,7 @@ class MaxHeap { if isEmpty() { fatalError("堆为空") } - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) swap(i: 0, j: size() - 1) // 删除节点 let val = maxHeap.remove(at: size() - 1) diff --git a/codes/swift/chapter_searching/binary_search.swift b/codes/swift/chapter_searching/binary_search.swift index e9c56ad6d..28b8b7af2 100644 --- a/codes/swift/chapter_searching/binary_search.swift +++ b/codes/swift/chapter_searching/binary_search.swift @@ -24,9 +24,9 @@ func binarySearch(nums: [Int], target: Int) -> Int { return -1 } -/* 二分查找(左闭右开) */ +/* 二分查找(左闭右开区间) */ func binarySearchLCRO(nums: [Int], target: Int) -> Int { - // 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 + // 初始化左闭右开区间 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 var i = 0 var j = nums.count // 循环,当搜索区间为空时跳出(当 i = j 时为空) @@ -55,7 +55,7 @@ enum BinarySearch { var index = binarySearch(nums: nums, target: target) print("目标元素 6 的索引 = \(index)") - /* 二分查找(左闭右开) */ + /* 二分查找(左闭右开区间) */ index = binarySearchLCRO(nums: nums, target: target) print("目标元素 6 的索引 = \(index)") } diff --git a/codes/swift/chapter_searching/two_sum.swift b/codes/swift/chapter_searching/two_sum.swift index 659e4a89c..f0508854a 100644 --- a/codes/swift/chapter_searching/two_sum.swift +++ b/codes/swift/chapter_searching/two_sum.swift @@ -6,7 +6,7 @@ /* 方法一:暴力枚举 */ func twoSumBruteForce(nums: [Int], target: Int) -> [Int] { - // 两层循环,时间复杂度 O(n^2) + // 两层循环,时间复杂度为 O(n^2) for i in nums.indices.dropLast() { for j in nums.indices.dropFirst(i + 1) { if nums[i] + nums[j] == target { @@ -19,9 +19,9 @@ func twoSumBruteForce(nums: [Int], target: Int) -> [Int] { /* 方法二:辅助哈希表 */ func twoSumHashTable(nums: [Int], target: Int) -> [Int] { - // 辅助哈希表,空间复杂度 O(n) + // 辅助哈希表,空间复杂度为 O(n) var dic: [Int: Int] = [:] - // 单层循环,时间复杂度 O(n) + // 单层循环,时间复杂度为 O(n) for i in nums.indices { if let j = dic[target - nums[i]] { return [j, i] diff --git a/codes/swift/chapter_sorting/bucket_sort.swift b/codes/swift/chapter_sorting/bucket_sort.swift index 40266a872..037136b71 100644 --- a/codes/swift/chapter_sorting/bucket_sort.swift +++ b/codes/swift/chapter_sorting/bucket_sort.swift @@ -11,7 +11,7 @@ func bucketSort(nums: inout [Double]) { var buckets = (0 ..< k).map { _ in [Double]() } // 1. 将数组元素分配到各个桶中 for num in nums { - // 输入数据范围 [0, 1),使用 num * k 映射到索引范围 [0, k-1] + // 输入数据范围为 [0, 1),使用 num * k 映射到索引范围 [0, k-1] let i = Int(num * Double(k)) // 将 num 添加进桶 i buckets[i].append(num) diff --git a/codes/swift/chapter_sorting/heap_sort.swift b/codes/swift/chapter_sorting/heap_sort.swift index cd84f76e8..4e5ec1e6d 100644 --- a/codes/swift/chapter_sorting/heap_sort.swift +++ b/codes/swift/chapter_sorting/heap_sort.swift @@ -37,7 +37,7 @@ func heapSort(nums: inout [Int]) { } // 从堆中提取最大元素,循环 n-1 轮 for i in stride(from: nums.count - 1, to: 0, by: -1) { - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) nums.swapAt(0, i) // 以根节点为起点,从顶至底进行堆化 siftDown(nums: &nums, n: i, i: 0) diff --git a/codes/swift/chapter_sorting/quick_sort.swift b/codes/swift/chapter_sorting/quick_sort.swift index 8a94eef45..1427a7d8c 100644 --- a/codes/swift/chapter_sorting/quick_sort.swift +++ b/codes/swift/chapter_sorting/quick_sort.swift @@ -14,7 +14,7 @@ func swap(nums: inout [Int], i: Int, j: Int) { /* 快速排序类 */ /* 哨兵划分 */ func partition(nums: inout [Int], left: Int, right: Int) -> Int { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 var i = left var j = right while i < j { @@ -87,7 +87,7 @@ func quickSortTailCall(nums: inout [Int], left: Int, right: Int) { while left < right { // 哨兵划分操作 let pivot = partition(nums: &nums, left: left, right: right) - // 对两个子数组中较短的那个执行快排 + // 对两个子数组中较短的那个执行快速排序 if (pivot - left) < (right - pivot) { quickSortTailCall(nums: &nums, left: left, right: pivot - 1) // 递归排序左子数组 left = pivot + 1 // 剩余未排序区间为 [pivot + 1, right] diff --git a/codes/swift/chapter_sorting/radix_sort.swift b/codes/swift/chapter_sorting/radix_sort.swift index 1bbb85cea..8152e4d59 100644 --- a/codes/swift/chapter_sorting/radix_sort.swift +++ b/codes/swift/chapter_sorting/radix_sort.swift @@ -12,7 +12,7 @@ func digit(num: Int, exp: Int) -> Int { /* 计数排序(根据 nums 第 k 位排序) */ func countingSortDigit(nums: inout [Int], exp: Int) { - // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶 + // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶数组 var counter = Array(repeating: 0, count: 10) let n = nums.count // 统计 0~9 各数字的出现次数 diff --git a/codes/swift/chapter_stack_and_queue/linkedlist_deque.swift b/codes/swift/chapter_stack_and_queue/linkedlist_deque.swift index 213b6160d..edd9cd2f7 100644 --- a/codes/swift/chapter_stack_and_queue/linkedlist_deque.swift +++ b/codes/swift/chapter_stack_and_queue/linkedlist_deque.swift @@ -38,7 +38,7 @@ class LinkedListDeque { /* 入队操作 */ private func push(num: Int, isFront: Bool) { let node = ListNode(val: num) - // 若链表为空,则令 front, rear 都指向 node + // 若链表为空,则令 front 和 rear 都指向 node if isEmpty() { front = node rear = node diff --git a/codes/swift/chapter_tree/binary_tree.swift b/codes/swift/chapter_tree/binary_tree.swift index 2efc099f1..d9f71f0a3 100644 --- a/codes/swift/chapter_tree/binary_tree.swift +++ b/codes/swift/chapter_tree/binary_tree.swift @@ -17,7 +17,7 @@ enum BinaryTree { let n3 = TreeNode(x: 3) let n4 = TreeNode(x: 4) let n5 = TreeNode(x: 5) - // 构建引用指向(即指针) + // 构建节点之间的引用(指针) n1.left = n2 n1.right = n3 n2.left = n4 diff --git a/codes/typescript/chapter_array_and_linkedlist/array.ts b/codes/typescript/chapter_array_and_linkedlist/array.ts index 79f854fdd..c5f629fe9 100644 --- a/codes/typescript/chapter_array_and_linkedlist/array.ts +++ b/codes/typescript/chapter_array_and_linkedlist/array.ts @@ -15,7 +15,7 @@ function randomAccess(nums: number[]): number { /* 扩展数组长度 */ // 请注意,TypeScript 的 Array 是动态数组,可以直接扩展 -// 为了方便学习,本函数将 Array 看作是长度不可变的数组 +// 为了方便学习,本函数将 Array 看作长度不可变的数组 function extend(nums: number[], enlarge: number): number[] { // 初始化一个扩展长度后的数组 const res = new Array(nums.length + enlarge).fill(0); @@ -33,11 +33,11 @@ function insert(nums: number[], num: number, index: number): void { for (let i = nums.length - 1; i > index; i--) { nums[i] = nums[i - 1]; } - // 将 num 赋给 index 处元素 + // 将 num 赋给 index 处的元素 nums[index] = num; } -/* 删除索引 index 处元素 */ +/* 删除索引 index 处的元素 */ function remove(nums: number[], index: number): void { // 把索引 index 之后的所有元素向前移动一位 for (let i = index; i < nums.length - 1; i++) { diff --git a/codes/typescript/chapter_array_and_linkedlist/linked_list.ts b/codes/typescript/chapter_array_and_linkedlist/linked_list.ts index f1eff8552..48f588d22 100644 --- a/codes/typescript/chapter_array_and_linkedlist/linked_list.ts +++ b/codes/typescript/chapter_array_and_linkedlist/linked_list.ts @@ -57,7 +57,7 @@ const n1 = new ListNode(3); const n2 = new ListNode(2); const n3 = new ListNode(5); const n4 = new ListNode(4); -// 构建引用指向 +// 构建节点之间的引用 n0.next = n1; n1.next = n2; n2.next = n3; diff --git a/codes/typescript/chapter_array_and_linkedlist/list.ts b/codes/typescript/chapter_array_and_linkedlist/list.ts index af6bdb328..a88c30be0 100644 --- a/codes/typescript/chapter_array_and_linkedlist/list.ts +++ b/codes/typescript/chapter_array_and_linkedlist/list.ts @@ -20,7 +20,7 @@ console.log(`将索引 1 处的元素更新为 0 ,得到 nums = ${nums}`); nums.length = 0; console.log(`清空列表后 nums = ${nums}`); -/* 尾部添加元素 */ +/* 在尾部添加元素 */ nums.push(1); nums.push(3); nums.push(2); @@ -28,7 +28,7 @@ nums.push(5); nums.push(4); console.log(`添加元素后 nums = ${nums}`); -/* 中间插入元素 */ +/* 在中间插入元素 */ nums.splice(3, 0, 6); console.log(`在索引 3 处插入数字 6 ,得到 nums = ${nums}`); diff --git a/codes/typescript/chapter_array_and_linkedlist/my_list.ts b/codes/typescript/chapter_array_and_linkedlist/my_list.ts index 3f02cc417..a23d3c4cc 100644 --- a/codes/typescript/chapter_array_and_linkedlist/my_list.ts +++ b/codes/typescript/chapter_array_and_linkedlist/my_list.ts @@ -4,11 +4,11 @@ * Author: Justin (xiefahit@gmail.com) */ -/* 列表类简易实现 */ +/* 列表类 */ class MyList { private arr: Array; // 数组(存储列表元素) private _capacity: number = 10; // 列表容量 - private _size: number = 0; // 列表长度(即当前元素数量) + private _size: number = 0; // 列表长度(当前元素数量) private extendRatio: number = 2; // 每次列表扩容的倍数 /* 构造方法 */ @@ -16,7 +16,7 @@ class MyList { this.arr = new Array(this._capacity); } - /* 获取列表长度(即当前元素数量)*/ + /* 获取列表长度(当前元素数量)*/ public size(): number { return this._size; } @@ -39,7 +39,7 @@ class MyList { this.arr[index] = num; } - /* 尾部添加元素 */ + /* 在尾部添加元素 */ public add(num: number): void { // 如果长度等于容量,则需要扩容 if (this._size === this._capacity) this.extendCapacity(); @@ -48,7 +48,7 @@ class MyList { this._size++; } - /* 中间插入元素 */ + /* 在中间插入元素 */ public insert(index: number, num: number): void { if (index < 0 || index >= this._size) throw new Error('索引越界'); // 元素数量超出容量时,触发扩容机制 @@ -103,7 +103,7 @@ class MyList { /* Driver Code */ /* 初始化列表 */ const nums = new MyList(); -/* 尾部添加元素 */ +/* 在尾部添加元素 */ nums.add(1); nums.add(3); nums.add(2); @@ -113,7 +113,7 @@ console.log( `列表 nums = ${nums.toArray()} ,容量 = ${nums.capacity()} ,长度 = ${nums.size()}` ); -/* 中间插入元素 */ +/* 在中间插入元素 */ nums.insert(3, 6); console.log(`在索引 3 处插入数字 6 ,得到 nums = ${nums.toArray()}`); diff --git a/codes/typescript/chapter_backtracking/n_queens.ts b/codes/typescript/chapter_backtracking/n_queens.ts index acbe16198..c6bb5ee02 100644 --- a/codes/typescript/chapter_backtracking/n_queens.ts +++ b/codes/typescript/chapter_backtracking/n_queens.ts @@ -24,7 +24,7 @@ function backtrack( // 计算该格子对应的主对角线和副对角线 const diag1 = row - col + n - 1; const diag2 = row + col; - // 剪枝:不允许该格子所在列、主对角线、副对角线存在皇后 + // 剪枝:不允许该格子所在列、主对角线、副对角线上存在皇后 if (!cols[col] && !diags1[diag1] && !diags2[diag2]) { // 尝试:将皇后放置在该格子 state[row][col] = 'Q'; @@ -43,8 +43,8 @@ function nQueens(n: number): string[][][] { // 初始化 n*n 大小的棋盘,其中 'Q' 代表皇后,'#' 代表空位 const state = Array.from({ length: n }, () => Array(n).fill('#')); const cols = Array(n).fill(false); // 记录列是否有皇后 - const diags1 = Array(2 * n - 1).fill(false); // 记录主对角线是否有皇后 - const diags2 = Array(2 * n - 1).fill(false); // 记录副对角线是否有皇后 + const diags1 = Array(2 * n - 1).fill(false); // 记录主对角线上是否有皇后 + const diags2 = Array(2 * n - 1).fill(false); // 记录副对角线上是否有皇后 const res: string[][][] = []; backtrack(0, n, state, res, cols, diags1, diags2); diff --git a/codes/typescript/chapter_computational_complexity/iteration.ts b/codes/typescript/chapter_computational_complexity/iteration.ts index ee861fad7..ef1be9b15 100644 --- a/codes/typescript/chapter_computational_complexity/iteration.ts +++ b/codes/typescript/chapter_computational_complexity/iteration.ts @@ -30,7 +30,7 @@ function whileLoop(n: number): number { function whileLoopII(n: number): number { let res = 0; let i = 1; // 初始化条件变量 - // 循环求和 1, 4, ... + // 循环求和 1, 4, 10, ... while (i <= n) { res += i; // 更新条件变量 diff --git a/codes/typescript/chapter_divide_and_conquer/hanota.ts b/codes/typescript/chapter_divide_and_conquer/hanota.ts index e5f0c55fe..3cdec72c7 100644 --- a/codes/typescript/chapter_divide_and_conquer/hanota.ts +++ b/codes/typescript/chapter_divide_and_conquer/hanota.ts @@ -12,7 +12,7 @@ function move(src: number[], tar: number[]): void { tar.push(pan); } -/* 求解汉诺塔:问题 f(i) */ +/* 求解汉诺塔问题 f(i) */ function dfs(i: number, src: number[], buf: number[], tar: number[]): void { // 若 src 只剩下一个圆盘,则直接将其移到 tar if (i === 1) { @@ -27,7 +27,7 @@ function dfs(i: number, src: number[], buf: number[], tar: number[]): void { dfs(i - 1, buf, src, tar); } -/* 求解汉诺塔 */ +/* 求解汉诺塔问题 */ function solveHanota(A: number[], B: number[], C: number[]): void { const n = A.length; // 将 A 顶部 n 个圆盘借助 B 移到 C diff --git a/codes/typescript/chapter_dynamic_programming/climbing_stairs_backtrack.ts b/codes/typescript/chapter_dynamic_programming/climbing_stairs_backtrack.ts index ee370f298..0139a96cb 100644 --- a/codes/typescript/chapter_dynamic_programming/climbing_stairs_backtrack.ts +++ b/codes/typescript/chapter_dynamic_programming/climbing_stairs_backtrack.ts @@ -25,7 +25,7 @@ function backtrack( /* 爬楼梯:回溯 */ function climbingStairsBacktrack(n: number): number { - const choices = [1, 2]; // 可选择向上爬 1 或 2 阶 + const choices = [1, 2]; // 可选择向上爬 1 阶或 2 阶 const state = 0; // 从第 0 阶开始爬 const res = new Map(); res.set(0, 0); // 使用 res[0] 记录方案数量 diff --git a/codes/typescript/chapter_dynamic_programming/coin_change.ts b/codes/typescript/chapter_dynamic_programming/coin_change.ts index 8d5e0d26b..68de13845 100644 --- a/codes/typescript/chapter_dynamic_programming/coin_change.ts +++ b/codes/typescript/chapter_dynamic_programming/coin_change.ts @@ -16,7 +16,7 @@ function coinChangeDP(coins: Array, amt: number): number { for (let a = 1; a <= amt; a++) { dp[0][a] = MAX; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (let i = 1; i <= n; i++) { for (let a = 1; a <= amt; a++) { if (coins[i - 1] > a) { diff --git a/codes/typescript/chapter_dynamic_programming/edit_distance.ts b/codes/typescript/chapter_dynamic_programming/edit_distance.ts index d6fe28935..8cd4be86a 100644 --- a/codes/typescript/chapter_dynamic_programming/edit_distance.ts +++ b/codes/typescript/chapter_dynamic_programming/edit_distance.ts @@ -74,7 +74,7 @@ function editDistanceDP(s: string, t: string): number { for (let j = 1; j <= m; j++) { dp[0][j] = j; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (let i = 1; i <= n; i++) { for (let j = 1; j <= m; j++) { if (s.charAt(i - 1) === t.charAt(j - 1)) { diff --git a/codes/typescript/chapter_dynamic_programming/knapsack.ts b/codes/typescript/chapter_dynamic_programming/knapsack.ts index 7fcef31e3..da2f588c5 100644 --- a/codes/typescript/chapter_dynamic_programming/knapsack.ts +++ b/codes/typescript/chapter_dynamic_programming/knapsack.ts @@ -11,11 +11,11 @@ function knapsackDFS( i: number, c: number ): number { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i === 0 || c === 0) { return 0; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (wgt[i - 1] > c) { return knapsackDFS(wgt, val, i - 1, c); } @@ -34,7 +34,7 @@ function knapsackDFSMem( i: number, c: number ): number { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i === 0 || c === 0) { return 0; } @@ -42,7 +42,7 @@ function knapsackDFSMem( if (mem[i][c] !== -1) { return mem[i][c]; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (wgt[i - 1] > c) { return knapsackDFSMem(wgt, val, mem, i - 1, c); } diff --git a/codes/typescript/chapter_dynamic_programming/min_path_sum.ts b/codes/typescript/chapter_dynamic_programming/min_path_sum.ts index a3fa3e554..60e7aa81f 100644 --- a/codes/typescript/chapter_dynamic_programming/min_path_sum.ts +++ b/codes/typescript/chapter_dynamic_programming/min_path_sum.ts @@ -69,7 +69,7 @@ function minPathSumDP(grid: Array>): number { for (let i = 1; i < n; i++) { dp[i][0] = dp[i - 1][0] + grid[i][0]; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (let i = 1; i < n; i++) { for (let j: number = 1; j < m; j++) { dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; diff --git a/codes/typescript/chapter_graph/graph_adjacency_list.ts b/codes/typescript/chapter_graph/graph_adjacency_list.ts index de0d9be42..b1d079fe9 100644 --- a/codes/typescript/chapter_graph/graph_adjacency_list.ts +++ b/codes/typescript/chapter_graph/graph_adjacency_list.ts @@ -8,7 +8,7 @@ import { Vertex } from '../modules/Vertex'; /* 基于邻接表实现的无向图类 */ class GraphAdjList { - // 邻接表,key: 顶点,value:该顶点的所有邻接顶点 + // 邻接表,key:顶点,value:该顶点的所有邻接顶点 adjList: Map; /* 构造方法 */ diff --git a/codes/typescript/chapter_graph/graph_adjacency_matrix.ts b/codes/typescript/chapter_graph/graph_adjacency_matrix.ts index 418e9b000..e734bc2de 100644 --- a/codes/typescript/chapter_graph/graph_adjacency_matrix.ts +++ b/codes/typescript/chapter_graph/graph_adjacency_matrix.ts @@ -69,7 +69,7 @@ class GraphAdjMat { if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) { throw new RangeError('Index Out Of Bounds Exception'); } - // 在无向图中,邻接矩阵沿主对角线对称,即满足 (i, j) === (j, i) + // 在无向图中,邻接矩阵关于主对角线对称,即满足 (i, j) === (j, i) this.adjMat[i][j] = 1; this.adjMat[j][i] = 1; } diff --git a/codes/typescript/chapter_graph/graph_bfs.ts b/codes/typescript/chapter_graph/graph_bfs.ts index 0cea04e07..cba409d8d 100644 --- a/codes/typescript/chapter_graph/graph_bfs.ts +++ b/codes/typescript/chapter_graph/graph_bfs.ts @@ -24,7 +24,7 @@ function graphBFS(graph: GraphAdjList, startVet: Vertex): Vertex[] { // 遍历该顶点的所有邻接顶点 for (const adjVet of graph.adjList.get(vet) ?? []) { if (visited.has(adjVet)) { - continue; // 跳过已被访问过的顶点 + continue; // 跳过已被访问的顶点 } que.push(adjVet); // 只入队未访问 visited.add(adjVet); // 标记该顶点已被访问 diff --git a/codes/typescript/chapter_graph/graph_dfs.ts b/codes/typescript/chapter_graph/graph_dfs.ts index 0befb1ab9..8dbc872b7 100644 --- a/codes/typescript/chapter_graph/graph_dfs.ts +++ b/codes/typescript/chapter_graph/graph_dfs.ts @@ -19,7 +19,7 @@ function dfs( // 遍历该顶点的所有邻接顶点 for (const adjVet of graph.adjList.get(vet)) { if (visited.has(adjVet)) { - continue; // 跳过已被访问过的顶点 + continue; // 跳过已被访问的顶点 } // 递归访问邻接顶点 dfs(graph, visited, res, adjVet); diff --git a/codes/typescript/chapter_hashing/array_hash_map.ts b/codes/typescript/chapter_hashing/array_hash_map.ts index 0487f17ea..5276b028a 100644 --- a/codes/typescript/chapter_hashing/array_hash_map.ts +++ b/codes/typescript/chapter_hashing/array_hash_map.ts @@ -15,7 +15,7 @@ class Pair { } } -/* 基于数组简易实现的哈希表 */ +/* 基于数组实现的哈希表 */ class ArrayHashMap { private readonly buckets: (Pair | null)[]; diff --git a/codes/typescript/chapter_heap/my_heap.ts b/codes/typescript/chapter_heap/my_heap.ts index 873e5799d..4cdb3fad2 100644 --- a/codes/typescript/chapter_heap/my_heap.ts +++ b/codes/typescript/chapter_heap/my_heap.ts @@ -82,7 +82,7 @@ class MaxHeap { public pop(): number { // 判空处理 if (this.isEmpty()) throw new RangeError('Heap is empty.'); - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) this.swap(0, this.size() - 1); // 删除节点 const val = this.maxHeap.pop(); diff --git a/codes/typescript/chapter_searching/binary_search.ts b/codes/typescript/chapter_searching/binary_search.ts index 6c2a6e9f3..5e69960ca 100644 --- a/codes/typescript/chapter_searching/binary_search.ts +++ b/codes/typescript/chapter_searching/binary_search.ts @@ -27,9 +27,9 @@ function binarySearch(nums: number[], target: number): number { return -1; // 未找到目标元素,返回 -1 } -/* 二分查找(左闭右开) */ +/* 二分查找(左闭右开区间) */ function binarySearchLCRO(nums: number[], target: number): number { - // 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 + // 初始化左闭右开区间 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 let i = 0, j = nums.length; // 循环,当搜索区间为空时跳出(当 i = j 时为空) @@ -58,7 +58,7 @@ const nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; let index = binarySearch(nums, target); console.info('目标元素 6 的索引 = %d', index); -/* 二分查找(左闭右开) */ +/* 二分查找(左闭右开区间) */ index = binarySearchLCRO(nums, target); console.info('目标元素 6 的索引 = %d', index); diff --git a/codes/typescript/chapter_searching/two_sum.ts b/codes/typescript/chapter_searching/two_sum.ts index 128413d8f..eb55ea101 100644 --- a/codes/typescript/chapter_searching/two_sum.ts +++ b/codes/typescript/chapter_searching/two_sum.ts @@ -7,7 +7,7 @@ /* 方法一:暴力枚举 */ function twoSumBruteForce(nums: number[], target: number): number[] { const n = nums.length; - // 两层循环,时间复杂度 O(n^2) + // 两层循环,时间复杂度为 O(n^2) for (let i = 0; i < n; i++) { for (let j = i + 1; j < n; j++) { if (nums[i] + nums[j] === target) { @@ -20,9 +20,9 @@ function twoSumBruteForce(nums: number[], target: number): number[] { /* 方法二:辅助哈希表 */ function twoSumHashTable(nums: number[], target: number): number[] { - // 辅助哈希表,空间复杂度 O(n) + // 辅助哈希表,空间复杂度为 O(n) let m: Map = new Map(); - // 单层循环,时间复杂度 O(n) + // 单层循环,时间复杂度为 O(n) for (let i = 0; i < nums.length; i++) { let index = m.get(target - nums[i]); if (index !== undefined) { diff --git a/codes/typescript/chapter_sorting/bucket_sort.ts b/codes/typescript/chapter_sorting/bucket_sort.ts index 0d8d01d5a..78369cf82 100644 --- a/codes/typescript/chapter_sorting/bucket_sort.ts +++ b/codes/typescript/chapter_sorting/bucket_sort.ts @@ -14,7 +14,7 @@ function bucketSort(nums: number[]): void { } // 1. 将数组元素分配到各个桶中 for (const num of nums) { - // 输入数据范围 [0, 1),使用 num * k 映射到索引范围 [0, k-1] + // 输入数据范围为 [0, 1),使用 num * k 映射到索引范围 [0, k-1] const i = Math.floor(num * k); // 将 num 添加进桶 i buckets[i].push(num); diff --git a/codes/typescript/chapter_sorting/heap_sort.ts b/codes/typescript/chapter_sorting/heap_sort.ts index daeb78a7c..c082166d1 100644 --- a/codes/typescript/chapter_sorting/heap_sort.ts +++ b/codes/typescript/chapter_sorting/heap_sort.ts @@ -36,7 +36,7 @@ function heapSort(nums: number[]): void { } // 从堆中提取最大元素,循环 n-1 轮 for (let i = nums.length - 1; i > 0; i--) { - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) [nums[0], nums[i]] = [nums[i], nums[0]]; // 以根节点为起点,从顶至底进行堆化 siftDown(nums, i, 0); diff --git a/codes/typescript/chapter_sorting/quick_sort.ts b/codes/typescript/chapter_sorting/quick_sort.ts index d19d5f766..9352787d0 100644 --- a/codes/typescript/chapter_sorting/quick_sort.ts +++ b/codes/typescript/chapter_sorting/quick_sort.ts @@ -15,7 +15,7 @@ class QuickSort { /* 哨兵划分 */ partition(nums: number[], left: number, right: number): number { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 let i = left, j = right; while (i < j) { @@ -86,7 +86,7 @@ class QuickSortMedian { ); // 将中位数交换至数组最左端 this.swap(nums, left, med); - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 let i = left, j = right; while (i < j) { @@ -127,7 +127,7 @@ class QuickSortTailCall { /* 哨兵划分 */ partition(nums: number[], left: number, right: number): number { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 let i = left, j = right; while (i < j) { @@ -149,7 +149,7 @@ class QuickSortTailCall { while (left < right) { // 哨兵划分操作 let pivot = this.partition(nums, left, right); - // 对两个子数组中较短的那个执行快排 + // 对两个子数组中较短的那个执行快速排序 if (pivot - left < right - pivot) { this.quickSort(nums, left, pivot - 1); // 递归排序左子数组 left = pivot + 1; // 剩余未排序区间为 [pivot + 1, right] diff --git a/codes/typescript/chapter_sorting/radix_sort.ts b/codes/typescript/chapter_sorting/radix_sort.ts index 2b6073ca2..109a1e59f 100644 --- a/codes/typescript/chapter_sorting/radix_sort.ts +++ b/codes/typescript/chapter_sorting/radix_sort.ts @@ -12,7 +12,7 @@ function digit(num: number, exp: number): number { /* 计数排序(根据 nums 第 k 位排序) */ function countingSortDigit(nums: number[], exp: number): void { - // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶 + // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶数组 const counter = new Array(10).fill(0); const n = nums.length; // 统计 0~9 各数字的出现次数 diff --git a/codes/typescript/chapter_stack_and_queue/linkedlist_deque.ts b/codes/typescript/chapter_stack_and_queue/linkedlist_deque.ts index 2ce5c1d52..dd1c50bba 100644 --- a/codes/typescript/chapter_stack_and_queue/linkedlist_deque.ts +++ b/codes/typescript/chapter_stack_and_queue/linkedlist_deque.ts @@ -32,7 +32,7 @@ class LinkedListDeque { /* 队尾入队操作 */ pushLast(val: number): void { const node: ListNode = new ListNode(val); - // 若链表为空,则令 front, rear 都指向 node + // 若链表为空,则令 front 和 rear 都指向 node if (this.queSize === 0) { this.front = node; this.rear = node; @@ -48,7 +48,7 @@ class LinkedListDeque { /* 队首入队操作 */ pushFirst(val: number): void { const node: ListNode = new ListNode(val); - // 若链表为空,则令 front, rear 都指向 node + // 若链表为空,则令 front 和 rear 都指向 node if (this.queSize === 0) { this.front = node; this.rear = node; diff --git a/codes/typescript/chapter_tree/array_binary_tree.ts b/codes/typescript/chapter_tree/array_binary_tree.ts index a32c3a72f..45190ec2a 100644 --- a/codes/typescript/chapter_tree/array_binary_tree.ts +++ b/codes/typescript/chapter_tree/array_binary_tree.ts @@ -42,7 +42,7 @@ class ArrayBinaryTree { /* 获取索引为 i 节点的父节点的索引 */ parent(i: number): number { - return Math.floor((i - 1) / 2); // 向下取整 + return Math.floor((i - 1) / 2); // 向下整除 } /* 层序遍历 */ diff --git a/codes/typescript/chapter_tree/binary_tree.ts b/codes/typescript/chapter_tree/binary_tree.ts index c3a2f390a..2d1a485aa 100644 --- a/codes/typescript/chapter_tree/binary_tree.ts +++ b/codes/typescript/chapter_tree/binary_tree.ts @@ -14,7 +14,7 @@ let n1 = new TreeNode(1), n3 = new TreeNode(3), n4 = new TreeNode(4), n5 = new TreeNode(5); -// 构建引用指向(即指针) +// 构建节点之间的引用(指针) n1.left = n2; n1.right = n3; n2.left = n4; diff --git a/codes/zig/chapter_array_and_linkedlist/array.zig b/codes/zig/chapter_array_and_linkedlist/array.zig index b2814ed58..852f0851d 100644 --- a/codes/zig/chapter_array_and_linkedlist/array.zig +++ b/codes/zig/chapter_array_and_linkedlist/array.zig @@ -32,11 +32,11 @@ pub fn insert(nums: []i32, num: i32, index: usize) void { while (i > index) : (i -= 1) { nums[i] = nums[i - 1]; } - // 将 num 赋给 index 处元素 + // 将 num 赋给 index 处的元素 nums[index] = num; } -// 删除索引 index 处元素 +// 删除索引 index 处的元素 pub fn remove(nums: []i32, index: usize) void { // 把索引 index 之后的所有元素向前移动一位 var i = index; diff --git a/codes/zig/chapter_array_and_linkedlist/linked_list.zig b/codes/zig/chapter_array_and_linkedlist/linked_list.zig index 0ffef48e8..18d5ac1b5 100644 --- a/codes/zig/chapter_array_and_linkedlist/linked_list.zig +++ b/codes/zig/chapter_array_and_linkedlist/linked_list.zig @@ -53,7 +53,7 @@ pub fn main() !void { var n2 = inc.ListNode(i32){.val = 2}; var n3 = inc.ListNode(i32){.val = 5}; var n4 = inc.ListNode(i32){.val = 4}; - // 构建引用指向 + // 构建节点之间的引用 n0.next = &n1; n1.next = &n2; n2.next = &n3; diff --git a/codes/zig/chapter_array_and_linkedlist/list.zig b/codes/zig/chapter_array_and_linkedlist/list.zig index db8d7e664..d7746cf55 100644 --- a/codes/zig/chapter_array_and_linkedlist/list.zig +++ b/codes/zig/chapter_array_and_linkedlist/list.zig @@ -29,7 +29,7 @@ pub fn main() !void { std.debug.print("\n清空列表后 nums = ", .{}); inc.PrintUtil.printList(i32, nums); - // 尾部添加元素 + // 在尾部添加元素 try nums.append(1); try nums.append(3); try nums.append(2); @@ -38,7 +38,7 @@ pub fn main() !void { std.debug.print("\n添加元素后 nums = ", .{}); inc.PrintUtil.printList(i32, nums); - // 中间插入元素 + // 在中间插入元素 try nums.insert(3, 6); std.debug.print("\n在索引 3 处插入数字 6 ,得到 nums = ", .{}); inc.PrintUtil.printList(i32, nums); diff --git a/codes/zig/chapter_array_and_linkedlist/my_list.zig b/codes/zig/chapter_array_and_linkedlist/my_list.zig index 096c59356..41066fd65 100644 --- a/codes/zig/chapter_array_and_linkedlist/my_list.zig +++ b/codes/zig/chapter_array_and_linkedlist/my_list.zig @@ -5,14 +5,14 @@ const std = @import("std"); const inc = @import("include"); -// 列表类简易实现 +// 列表类 pub fn MyList(comptime T: type) type { return struct { const Self = @This(); arr: []T = undefined, // 数组(存储列表元素) arrCapacity: usize = 10, // 列表容量 - numSize: usize = 0, // 列表长度(即当前元素数量) + numSize: usize = 0, // 列表长度(当前元素数量) extendRatio: usize = 2, // 每次列表扩容的倍数 mem_arena: ?std.heap.ArenaAllocator = null, mem_allocator: std.mem.Allocator = undefined, // 内存分配器 @@ -33,7 +33,7 @@ pub fn MyList(comptime T: type) type { self.mem_arena.?.deinit(); } - // 获取列表长度(即当前元素数量) + // 获取列表长度(当前元素数量) pub fn size(self: *Self) usize { return self.numSize; } @@ -57,7 +57,7 @@ pub fn MyList(comptime T: type) type { self.arr[index] = num; } - // 尾部添加元素 + // 在尾部添加元素 pub fn add(self: *Self, num: T) !void { // 元素数量超出容量时,触发扩容机制 if (self.size() == self.capacity()) try self.extendCapacity(); @@ -66,7 +66,7 @@ pub fn MyList(comptime T: type) type { self.numSize += 1; } - // 中间插入元素 + // 在中间插入元素 pub fn insert(self: *Self, index: usize, num: T) !void { if (index < 0 or index >= self.size()) @panic("索引越界"); // 元素数量超出容量时,触发扩容机制 @@ -130,7 +130,7 @@ pub fn main() !void { // 延迟释放内存 defer nums.deinit(); - // 尾部添加元素 + // 在尾部添加元素 try nums.add(1); try nums.add(3); try nums.add(2); @@ -140,7 +140,7 @@ pub fn main() !void { inc.PrintUtil.printArray(i32, try nums.toArray()); std.debug.print(" ,容量 = {} ,长度 = {}", .{nums.capacity(), nums.size()}); - // 中间插入元素 + // 在中间插入元素 try nums.insert(3, 6); std.debug.print("\n在索引 3 处插入数字 6 ,得到 nums = ", .{}); inc.PrintUtil.printArray(i32, try nums.toArray()); diff --git a/codes/zig/chapter_computational_complexity/iteration.zig b/codes/zig/chapter_computational_complexity/iteration.zig index 23866c105..14e2426e4 100644 --- a/codes/zig/chapter_computational_complexity/iteration.zig +++ b/codes/zig/chapter_computational_complexity/iteration.zig @@ -31,7 +31,7 @@ fn whileLoop(n: i32) i32 { fn whileLoopII(n: i32) i32 { var res: i32 = 0; var i: i32 = 1; // 初始化条件变量 - // 循环求和 1, 4, ... + // 循环求和 1, 4, 10, ... while (i <= n) { res += @intCast(i); // 更新条件变量 diff --git a/codes/zig/chapter_dynamic_programming/climbing_stairs_backtrack.zig b/codes/zig/chapter_dynamic_programming/climbing_stairs_backtrack.zig index 356ae2750..b3dc0494b 100644 --- a/codes/zig/chapter_dynamic_programming/climbing_stairs_backtrack.zig +++ b/codes/zig/chapter_dynamic_programming/climbing_stairs_backtrack.zig @@ -24,7 +24,7 @@ fn backtrack(choices: []i32, state: i32, n: i32, res: std.ArrayList(i32)) void { // 爬楼梯:回溯 fn climbingStairsBacktrack(n: usize) !i32 { - var choices = [_]i32{ 1, 2 }; // 可选择向上爬 1 或 2 阶 + var choices = [_]i32{ 1, 2 }; // 可选择向上爬 1 阶或 2 阶 var state: i32 = 0; // 从第 0 阶开始爬 var res = std.ArrayList(i32).init(std.heap.page_allocator); defer res.deinit(); diff --git a/codes/zig/chapter_dynamic_programming/coin_change.zig b/codes/zig/chapter_dynamic_programming/coin_change.zig index 73ed0aefc..31d4581a2 100644 --- a/codes/zig/chapter_dynamic_programming/coin_change.zig +++ b/codes/zig/chapter_dynamic_programming/coin_change.zig @@ -14,7 +14,7 @@ fn coinChangeDP(comptime coins: []i32, comptime amt: usize) i32 { for (1..amt + 1) |a| { dp[0][a] = max; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (1..n + 1) |i| { for (1..amt + 1) |a| { if (coins[i - 1] > @as(i32, @intCast(a))) { diff --git a/codes/zig/chapter_dynamic_programming/edit_distance.zig b/codes/zig/chapter_dynamic_programming/edit_distance.zig index e8e4ca1f2..0a6a9712b 100644 --- a/codes/zig/chapter_dynamic_programming/edit_distance.zig +++ b/codes/zig/chapter_dynamic_programming/edit_distance.zig @@ -73,7 +73,7 @@ fn editDistanceDP(comptime s: []const u8, comptime t: []const u8) i32 { for (1..m + 1) |j| { dp[0][j] = @intCast(j); } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (1..n + 1) |i| { for (1..m + 1) |j| { if (s[i - 1] == t[j - 1]) { diff --git a/codes/zig/chapter_dynamic_programming/knapsack.zig b/codes/zig/chapter_dynamic_programming/knapsack.zig index 6d1a012f1..aa85705b3 100644 --- a/codes/zig/chapter_dynamic_programming/knapsack.zig +++ b/codes/zig/chapter_dynamic_programming/knapsack.zig @@ -6,11 +6,11 @@ const std = @import("std"); // 0-1 背包:暴力搜索 fn knapsackDFS(wgt: []i32, val: []i32, i: usize, c: usize) i32 { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i == 0 or c == 0) { return 0; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (wgt[i - 1] > c) { return knapsackDFS(wgt, val, i - 1, c); } @@ -23,7 +23,7 @@ fn knapsackDFS(wgt: []i32, val: []i32, i: usize, c: usize) i32 { // 0-1 背包:记忆化搜索 fn knapsackDFSMem(wgt: []i32, val: []i32, mem: anytype, i: usize, c: usize) i32 { - // 若已选完所有物品或背包无容量,则返回价值 0 + // 若已选完所有物品或背包无剩余容量,则返回价值 0 if (i == 0 or c == 0) { return 0; } @@ -31,7 +31,7 @@ fn knapsackDFSMem(wgt: []i32, val: []i32, mem: anytype, i: usize, c: usize) i32 if (mem[i][c] != -1) { return mem[i][c]; } - // 若超过背包容量,则只能不放入背包 + // 若超过背包容量,则只能选择不放入背包 if (wgt[i - 1] > c) { return knapsackDFSMem(wgt, val, mem, i - 1, c); } diff --git a/codes/zig/chapter_dynamic_programming/min_path_sum.zig b/codes/zig/chapter_dynamic_programming/min_path_sum.zig index f5d51a115..d46bce06f 100644 --- a/codes/zig/chapter_dynamic_programming/min_path_sum.zig +++ b/codes/zig/chapter_dynamic_programming/min_path_sum.zig @@ -59,7 +59,7 @@ fn minPathSumDP(comptime grid: anytype) i32 { for (1..n) |i| { dp[i][0] = dp[i - 1][0] + grid[i][0]; } - // 状态转移:其余行列 + // 状态转移:其余行和列 for (1..n) |i| { for (1..m) |j| { dp[i][j] = @min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; diff --git a/codes/zig/chapter_hashing/array_hash_map.zig b/codes/zig/chapter_hashing/array_hash_map.zig index be9c6ca3d..62f746389 100644 --- a/codes/zig/chapter_hashing/array_hash_map.zig +++ b/codes/zig/chapter_hashing/array_hash_map.zig @@ -18,7 +18,7 @@ const Pair = struct { } }; -// 基于数组简易实现的哈希表 +// 基于数组实现的哈希表 pub fn ArrayHashMap(comptime T: type) type { return struct { bucket: ?std.ArrayList(?T) = null, diff --git a/codes/zig/chapter_heap/my_heap.zig b/codes/zig/chapter_heap/my_heap.zig index af3b9550b..8732e106f 100644 --- a/codes/zig/chapter_heap/my_heap.zig +++ b/codes/zig/chapter_heap/my_heap.zig @@ -95,7 +95,7 @@ pub fn MaxHeap(comptime T: type) type { pub fn pop(self: *Self) !T { // 判断处理 if (self.isEmpty()) unreachable; - // 交换根节点与最右叶节点(即交换首元素与尾元素) + // 交换根节点与最右叶节点(交换首元素与尾元素) try self.swap(0, self.size() - 1); // 删除节点 var val = self.max_heap.?.pop(); diff --git a/codes/zig/chapter_searching/binary_search.zig b/codes/zig/chapter_searching/binary_search.zig index 64aa322a2..6114ad6d1 100644 --- a/codes/zig/chapter_searching/binary_search.zig +++ b/codes/zig/chapter_searching/binary_search.zig @@ -25,9 +25,9 @@ fn binarySearch(comptime T: type, nums: std.ArrayList(T), target: T) T { return -1; } -// 二分查找(左闭右开) +// 二分查找(左闭右开区间) fn binarySearchLCRO(comptime T: type, nums: std.ArrayList(T), target: T) T { - // 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 + // 初始化左闭右开区间 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 var i: usize = 0; var j: usize = nums.items.len; // 循环,当搜索区间为空时跳出(当 i = j 时为空) @@ -56,7 +56,7 @@ pub fn main() !void { var index = binarySearch(i32, nums, target); std.debug.print("目标元素 6 的索引 = {}\n", .{index}); - // 二分查找(左闭右开) + // 二分查找(左闭右开区间) index = binarySearchLCRO(i32, nums, target); std.debug.print("目标元素 6 的索引 = {}\n", .{index}); diff --git a/codes/zig/chapter_searching/two_sum.zig b/codes/zig/chapter_searching/two_sum.zig index aa037ddd9..b13cb0ef4 100644 --- a/codes/zig/chapter_searching/two_sum.zig +++ b/codes/zig/chapter_searching/two_sum.zig @@ -9,7 +9,7 @@ const inc = @import("include"); pub fn twoSumBruteForce(nums: []i32, target: i32) ?[2]i32 { var size: usize = nums.len; var i: usize = 0; - // 两层循环,时间复杂度 O(n^2) + // 两层循环,时间复杂度为 O(n^2) while (i < size - 1) : (i += 1) { var j = i + 1; while (j < size) : (j += 1) { @@ -24,11 +24,11 @@ pub fn twoSumBruteForce(nums: []i32, target: i32) ?[2]i32 { // 方法二:辅助哈希表 pub fn twoSumHashTable(nums: []i32, target: i32) !?[2]i32 { var size: usize = nums.len; - // 辅助哈希表,空间复杂度 O(n) + // 辅助哈希表,空间复杂度为 O(n) var dic = std.AutoHashMap(i32, i32).init(std.heap.page_allocator); defer dic.deinit(); var i: usize = 0; - // 单层循环,时间复杂度 O(n) + // 单层循环,时间复杂度为 O(n) while (i < size) : (i += 1) { if (dic.contains(target - nums[i])) { return [_]i32{dic.get(target - nums[i]).?, @intCast(i)}; diff --git a/codes/zig/chapter_sorting/quick_sort.zig b/codes/zig/chapter_sorting/quick_sort.zig index cb89a1ddd..7a0dd2add 100644 --- a/codes/zig/chapter_sorting/quick_sort.zig +++ b/codes/zig/chapter_sorting/quick_sort.zig @@ -17,7 +17,7 @@ const QuickSort = struct { // 哨兵划分 pub fn partition(nums: []i32, left: usize, right: usize) usize { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 var i = left; var j = right; while (i < j) { @@ -70,7 +70,7 @@ const QuickSortMedian = struct { var med = medianThree(nums, left, (left + right) / 2, right); // 将中位数交换至数组最左端 swap(nums, left, med); - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 var i = left; var j = right; while (i < j) { @@ -107,7 +107,7 @@ const QuickSortTailCall = struct { // 哨兵划分 pub fn partition(nums: []i32, left: usize, right: usize) usize { - // 以 nums[left] 作为基准数 + // 以 nums[left] 为基准数 var i = left; var j = right; while (i < j) { @@ -127,7 +127,7 @@ const QuickSortTailCall = struct { while (left < right) { // 哨兵划分操作 var pivot = partition(nums, left, right); - // 对两个子数组中较短的那个执行快排 + // 对两个子数组中较短的那个执行快速排序 if (pivot - left < right - pivot) { quickSort(nums, left, pivot - 1); // 递归排序左子数组 left = pivot + 1; // 剩余未排序区间为 [pivot + 1, right] diff --git a/codes/zig/chapter_sorting/radix_sort.zig b/codes/zig/chapter_sorting/radix_sort.zig index 7aa421b19..144195ed7 100644 --- a/codes/zig/chapter_sorting/radix_sort.zig +++ b/codes/zig/chapter_sorting/radix_sort.zig @@ -13,7 +13,7 @@ fn digit(num: i32, exp: i32) i32 { // 计数排序(根据 nums 第 k 位排序) fn countingSortDigit(nums: []i32, exp: i32) !void { - // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶 + // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶数组 var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); // defer mem_arena.deinit(); const mem_allocator = mem_arena.allocator(); diff --git a/codes/zig/chapter_stack_and_queue/linkedlist_deque.zig b/codes/zig/chapter_stack_and_queue/linkedlist_deque.zig index b9cc4382b..8c96ca5a0 100644 --- a/codes/zig/chapter_stack_and_queue/linkedlist_deque.zig +++ b/codes/zig/chapter_stack_and_queue/linkedlist_deque.zig @@ -65,7 +65,7 @@ pub fn LinkedListDeque(comptime T: type) type { pub fn push(self: *Self, num: T, is_front: bool) !void { var node = try self.mem_allocator.create(ListNode(T)); node.init(num); - // 若链表为空,则令 front, rear 都指向 node + // 若链表为空,则令 front 和 rear 都指向 node if (self.isEmpty()) { self.front = node; self.rear = node; diff --git a/codes/zig/chapter_tree/binary_tree.zig b/codes/zig/chapter_tree/binary_tree.zig index db799f3f2..2ae9d3866 100644 --- a/codes/zig/chapter_tree/binary_tree.zig +++ b/codes/zig/chapter_tree/binary_tree.zig @@ -14,7 +14,7 @@ pub fn main() !void { var n3 = inc.TreeNode(i32){ .val = 3 }; var n4 = inc.TreeNode(i32){ .val = 4 }; var n5 = inc.TreeNode(i32){ .val = 5 }; - // 构建引用指向(即指针) + // 构建节点之间的引用(指针) n1.left = &n2; n1.right = &n3; n2.left = &n4; diff --git a/docs/chapter_appendix/contribution.assets/edit_markdown.png b/docs/chapter_appendix/contribution.assets/edit_markdown.png index d1ac26fa6535cbcb156f90b53a477924517812a6..c11dce4fbecb4ba8d00443c13937a187d4c596b7 100644 GIT binary patch literal 87838 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 DZRH|3 literal 77268 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   数据结构与算法重要名词

+

  数据结构与算法的重要名词

-| 中文 | English | -| -------------- | ------------------------------ | -| 算法 | algorithm | -| 数据结构 | data structure | -| 渐近复杂度分析 | asymptotic complexity analysis | -| 时间复杂度 | time complexity | -| 空间复杂度 | space complexity | -| 迭代 | iteration | -| 递归 | recursion | -| 尾递归 | tail recursion | -| 递归树 | recursion tree | -| 大 $O$ 记号 | big-$O$ notation | -| 渐近上界 | asymptotic upper bound | -| 原码 | sign–magnitude | -| 反码 | 1's complement | -| 补码 | 2's complement | -| 数组 | array | -| 索引 | index | -| 链表 | linked list | -| 链表节点 | linked list node, list node | -| 列表 | list | -| 动态数组 | dynamic array | -| 栈 | stack | -| 队列 | queue | -| 双向队列 | double-ended queue | -| 哈希表 | hash table | -| 桶 | bucket | -| 哈希函数 | hash function | -| 哈希冲突 | hash collision | -| 负载因子 | load factor | -| 链式地址 | separate chaining | -| 开放寻址 | open addressing | -| 线性探测 | linear probing | -| 懒删除 | lazy deletion | -| 二叉树 | binary tree | -| 树节点 | tree node | -| 左子节点 | left-child node | -| 右子节点 | right-child node | -| 父节点 | parent node | -| 左子树 | left subtree | -| 右子树 | right subtree | -| 根节点 | root node | -| 叶节点 | leaf node | -| 边 | edge | -| 层 | level | -| 度 | degree | -| 高度 | height | -| 深度 | depth | -| 完美二叉树 | perfect binary tree | -| 完全二叉树 | complete binary tree | -| 完满二叉树 | full binary tree | -| 平衡二叉树 | balanced binary tree | -| AVL 树 | AVL tree | -| 红黑树 | red-black tree | -| 层序遍历 | level-order traversal | -| 广度优先遍历 | breadth-first traversal | -| 深度优先遍历 | depth-first traversal | -| 二叉搜索树 | binary search tree | -| 平衡二叉搜索树 | balanced binary search tree | -| 平衡因子 | balance factor | -| 堆 | heap | -| 大顶堆 | max heap | -| 小顶堆 | min heap | -| 优先队列 | priority queue | -| 堆化 | heapify | -| 图 | graph | -| 顶点 | vertex | -| 无向图 | undirected graph | -| 有向图 | directed graph | -| 连通图 | connected graph | -| 非连通图 | disconnected graph | -| 有权图 | weighted graph | -| 邻接 | adjacency | -| 路径 | path | -| 入度 | in-degree | -| 出度 | out-degree | -| 邻接矩阵 | adjacency matrix | -| 邻接表 | adjacency list | -| 广度优先搜索 | breadth-first search | -| 深度优先搜索 | depth-first search | -| 二分查找 | binary search | -| 搜索算法 | searching algorithm | -| 排序算法 | sorting algorithm | -| 选择排序 | selection sort | -| 冒泡排序 | bubble sort | -| 插入排序 | insertion sort | -| 快速排序 | quick sort | -| 归并排序 | merge sort | -| 堆排序 | heap sort | -| 桶排序 | bucket sort | -| 计数排序 | counting sort | -| 基数排序 | radix sort | -| 分治 | divide and conquer | -| 汉诺塔问题 | hanota problem | -| 回溯算法 | backtracking algorithm | -| 约束 | constraint | -| 解 | solution | -| 状态 | state | -| 剪枝 | pruning | -| 全排列问题 | permutations problem | -| 子集和问题 | subset-sum problem | -| N 皇后问题 | N-queens problem | -| 动态规划 | dynamic programming | -| 初始状态 | initial state | -| 状态转移方程 | state-trasition equation | -| 背包问题 | knapsack problem | -| 编辑距离问题 | edit distance problem | -| 贪心算法 | greedy algorithm | +| 中文 | English | 中文 | English | +| -------------- | ------------------------------ | -------------- | --------------------------- | +| 算法 | algorithm | 层序遍历 | level-order traversal | +| 数据结构 | data structure | 广度优先遍历 | breadth-first traversal | +| 渐近复杂度分析 | asymptotic complexity analysis | 深度优先遍历 | depth-first traversal | +| 时间复杂度 | time complexity | 二叉搜索树 | binary search tree | +| 空间复杂度 | space complexity | 平衡二叉搜索树 | balanced binary search tree | +| 迭代 | iteration | 平衡因子 | balance factor | +| 递归 | recursion | 堆 | heap | +| 尾递归 | tail recursion | 大顶堆 | max heap | +| 递归树 | recursion tree | 小顶堆 | min heap | +| 大 | big- | 优先队列 | priority queue | +| 记号 | notation | | | +| 渐近上界 | asymptotic upper bound | 堆化 | heapify | +| 原码 | sign–magnitude | 图 | graph | +| 反码 | 1’s complement | 顶点 | vertex | +| 补码 | 2’s complement | 无向图 | undirected graph | +| 数组 | array | 有向图 | directed graph | +| 索引 | index | 连通图 | connected graph | +| 链表 | linked list | 非连通图 | disconnected graph | +| 链表节点 | linked list node, list node | 有权图 | weighted graph | +| 列表 | list | 邻接 | adjacency | +| 动态数组 | dynamic array | 路径 | path | +| 硬盘 | hard disk | 入度 | in-degree | +| 内存 | random-access memory (RAM) | 出度 | out-degree | +| 缓存 | cache memory | 邻接矩阵 | adjacency matrix | +| 缓存未命中 | cache miss | 邻接表 | adjacency list | +| 缓存命中率 | cache hit rate | 广度优先搜索 | breadth-first search | +| 栈 | stack | 深度优先搜索 | depth-first search | +| 队列 | queue | 二分查找 | binary search | +| 双向队列 | double-ended queue | 搜索算法 | searching algorithm | +| 哈希表 | hash table | 排序算法 | sorting algorithm | +| 桶 | bucket | 选择排序 | selection sort | +| 哈希函数 | hash function | 冒泡排序 | bubble sort | +| 哈希冲突 | hash collision | 插入排序 | insertion sort | +| 负载因子 | load factor | 快速排序 | quick sort | +| 链式地址 | separate chaining | 归并排序 | merge sort | +| 开放寻址 | open addressing | 堆排序 | heap sort | +| 线性探测 | linear probing | 桶排序 | bucket sort | +| 懒删除 | lazy deletion | 计数排序 | counting sort | +| 二叉树 | binary tree | 基数排序 | radix sort | +| 树节点 | tree node | 分治 | divide and conquer | +| 左子节点 | left-child node | 汉诺塔问题 | hanota problem | +| 右子节点 | right-child node | 回溯算法 | backtracking algorithm | +| 父节点 | parent node | 约束 | constraint | +| 左子树 | left subtree | 解 | solution | +| 右子树 | right subtree | 状态 | state | +| 根节点 | root node | 剪枝 | pruning | +| 叶节点 | leaf node | 全排列问题 | permutations problem | +| 边 | edge | 子集和问题 | subset-sum problem | +| 层 | level | N 皇后问题 | N-queens problem | +| 度 | degree | 动态规划 | dynamic programming | +| 高度 | height | 初始状态 | initial state | +| 深度 | depth | 状态转移方程 | state-trasition equation | +| 完美二叉树 | perfect binary tree | 背包问题 | knapsack problem | +| 完全二叉树 | complete binary tree | 编辑距离问题 | edit distance problem | +| 完满二叉树 | full binary tree | 贪心算法 | greedy algorithm | +| 平衡二叉树 | balanced binary tree | | | +| AVL 树 | AVL tree | | | +| 红黑树 | red-black tree | | | diff --git a/docs/chapter_array_and_linkedlist/array.assets/array_remove_element.png b/docs/chapter_array_and_linkedlist/array.assets/array_remove_element.png index 75d5195b5fef1cd5eef2d751533995442a8d6a39..0fbadb533d941c7f8ce6b776aedfacd8f892fbbf 100644 GIT binary patch literal 27642 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 literal 28152 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 R%1vLZsj8z=p=9;^e*pkhs2unext = n1; n1->next = n2; n2->next = n3; @@ -229,7 +229,7 @@ ListNode n2 = new ListNode(2); ListNode n3 = new ListNode(5); ListNode n4 = new ListNode(4); - // 构建引用指向 + // 构建节点之间的引用 n0.next = n1; n1.next = n2; n2.next = n3; @@ -246,7 +246,7 @@ ListNode n2 = new(2); ListNode n3 = new(5); ListNode n4 = new(4); - // 构建引用指向 + // 构建节点之间的引用 n0.next = n1; n1.next = n2; n2.next = n3; @@ -263,7 +263,7 @@ n2 := NewListNode(2) n3 := NewListNode(5) n4 := NewListNode(4) - // 构建引用指向 + // 构建节点之间的引用 n0.Next = n1 n1.Next = n2 n2.Next = n3 @@ -280,7 +280,7 @@ let n2 = ListNode(x: 2) let n3 = ListNode(x: 5) let n4 = ListNode(x: 4) - // 构建引用指向 + // 构建节点之间的引用 n0.next = n1 n1.next = n2 n2.next = n3 @@ -297,7 +297,7 @@ const n2 = new ListNode(2); const n3 = new ListNode(5); const n4 = new ListNode(4); - // 构建引用指向 + // 构建节点之间的引用 n0.next = n1; n1.next = n2; n2.next = n3; @@ -314,7 +314,7 @@ const n2 = new ListNode(2); const n3 = new ListNode(5); const n4 = new ListNode(4); - // 构建引用指向 + // 构建节点之间的引用 n0.next = n1; n1.next = n2; n2.next = n3; @@ -331,7 +331,7 @@ ListNode n2 = ListNode(2); ListNode n3 = ListNode(5); ListNode n4 = ListNode(4); - // 构建引用指向 + // 构建节点之间的引用 n0.next = n1; n1.next = n2; n2.next = n3; @@ -349,7 +349,7 @@ let n3 = Rc::new(RefCell::new(ListNode { val: 5, next: None })); let n4 = Rc::new(RefCell::new(ListNode { val: 4, next: None })); - // 构建引用指向 + // 构建节点之间的引用 n0.borrow_mut().next = Some(n1.clone()); n1.borrow_mut().next = Some(n2.clone()); n2.borrow_mut().next = Some(n3.clone()); @@ -366,7 +366,7 @@ ListNode* n2 = newListNode(2); ListNode* n3 = newListNode(5); ListNode* n4 = newListNode(4); - // 构建引用指向 + // 构建节点之间的引用 n0->next = n1; n1->next = n2; n2->next = n3; @@ -383,18 +383,18 @@ var n2 = inc.ListNode(i32){.val = 2}; var n3 = inc.ListNode(i32){.val = 5}; var n4 = inc.ListNode(i32){.val = 4}; - // 构建引用指向 + // 构建节点之间的引用 n0.next = &n1; n1.next = &n2; n2.next = &n3; n3.next = &n4; ``` -数组整体是一个变量,比如数组 `nums` 包含元素 `nums[0]` 和 `nums[1]` 等,而链表是由多个独立的节点对象组成的。**我们通常将头节点当作链表的代称**,比如以上代码中的链表可被记做链表 `n0` 。 +数组整体是一个变量,比如数组 `nums` 包含元素 `nums[0]` 和 `nums[1]` 等,而链表是由多个独立的节点对象组成的。**我们通常将头节点当作链表的代称**,比如以上代码中的链表可记作链表 `n0` 。 ### 插入节点 -在链表中插入节点非常容易。如下图所示,假设我们想在相邻的两个节点 `n0` 和 `n1` 之间插入一个新节点 `P` ,**则只需要改变两个节点引用(指针)即可**,时间复杂度为 $O(1)$ 。 +在链表中插入节点非常容易。如下图所示,假设我们想在相邻的两个节点 `n0` 和 `n1` 之间插入一个新节点 `P` ,**则只需改变两个节点引用(指针)即可**,时间复杂度为 $O(1)$ 。 相比之下,在数组中插入元素的时间复杂度为 $O(n)$ ,在大数据量下的效率较低。 @@ -418,7 +418,7 @@ ### 访问节点 -**在链表访问节点的效率较低**。如上节所述,我们可以在 $O(1)$ 时间下访问数组中的任意元素。链表则不然,程序需要从头节点出发,逐个向后遍历,直至找到目标节点。也就是说,访问链表的第 $i$ 个节点需要循环 $i - 1$ 轮,时间复杂度为 $O(n)$ 。 +**在链表中访问节点的效率较低**。如上一节所述,我们可以在 $O(1)$ 时间下访问数组中的任意元素。链表则不然,程序需要从头节点出发,逐个向后遍历,直至找到目标节点。也就是说,访问链表的第 $i$ 个节点需要循环 $i - 1$ 轮,时间复杂度为 $O(n)$ 。 ```src [file]{linked_list}-[class]{}-[func]{access} @@ -426,15 +426,15 @@ ### 查找节点 -遍历链表,查找链表内值为 `target` 的节点,输出节点在链表中的索引。此过程也属于线性查找。 +遍历链表,查找其中值为 `target` 的节点,输出该节点在链表中的索引。此过程也属于线性查找。代码如下所示: ```src [file]{linked_list}-[class]{}-[func]{find} ``` -## 数组 VS 链表 +## 数组 vs. 链表 -下表总结对比了数组和链表的各项特点与操作效率。由于它们采用两种相反的存储策略,因此各种性质和操作效率也呈现对立的特点。 +下表总结了数组和链表的各项特点并对比了操作效率。由于它们采用两种相反的存储策略,因此各种性质和操作效率也呈现对立的特点。

  数组与链表的效率对比

@@ -451,8 +451,8 @@ 如下图所示,常见的链表类型包括三种。 -- **单向链表**:即上述介绍的普通链表。单向链表的节点包含值和指向下一节点的引用两项数据。我们将首个节点称为头节点,将最后一个节点称为尾节点,尾节点指向空 $\text{None}$ 。 -- **环形链表**:如果我们令单向链表的尾节点指向头节点(即首尾相接),则得到一个环形链表。在环形链表中,任意节点都可以视作头节点。 +- **单向链表**:即前面介绍的普通链表。单向链表的节点包含值和指向下一节点的引用两项数据。我们将首个节点称为头节点,将最后一个节点称为尾节点,尾节点指向空 $\text{None}$ 。 +- **环形链表**:如果我们令单向链表的尾节点指向头节点(首尾相接),则得到一个环形链表。在环形链表中,任意节点都可以视作头节点。 - **双向链表**:与单向链表相比,双向链表记录了两个方向的引用。双向链表的节点定义同时包含指向后继节点(下一个节点)和前驱节点(上一个节点)的引用(指针)。相较于单向链表,双向链表更具灵活性,可以朝两个方向遍历链表,但相应地也需要占用更多的内存空间。 === "Python" @@ -652,17 +652,17 @@ 单向链表通常用于实现栈、队列、哈希表和图等数据结构。 -- **栈与队列**:当插入和删除操作都在链表的一端进行时,它表现出先进后出的的特性,对应栈;当插入操作在链表的一端进行,删除操作在链表的另一端进行,它表现出先进先出的特性,对应队列。 -- **哈希表**:链地址法是解决哈希冲突的主流方案之一,在该方案中,所有冲突的元素都会被放到一个链表中。 -- **图**:邻接表是表示图的一种常用方式,在其中,图的每个顶点都与一个链表相关联,链表中的每个元素都代表与该顶点相连的其他顶点。 +- **栈与队列**:当插入和删除操作都在链表的一端进行时,它表现出先进后出的特性,对应栈;当插入操作在链表的一端进行,删除操作在链表的另一端进行,它表现出先进先出的特性,对应队列。 +- **哈希表**:链式地址是解决哈希冲突的主流方案之一,在该方案中,所有冲突的元素都会被放到一个链表中。 +- **图**:邻接表是表示图的一种常用方式,其中图的每个顶点都与一个链表相关联,链表中的每个元素都代表与该顶点相连的其他顶点。 -双向链表常被用于需要快速查找前一个和下一个元素的场景。 +双向链表常用于需要快速查找前一个和后一个元素的场景。 - **高级数据结构**:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指向父节点的引用来实现,类似于双向链表。 - **浏览器历史**:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和后一个网页。双向链表的特性使得这种操作变得简单。 -- **LRU 算法**:在缓存淘汰算法(LRU)中,我们需要快速找到最近最少使用的数据,以及支持快速地添加和删除节点。这时候使用双向链表就非常合适。 +- **LRU 算法**:在缓存淘汰(LRU)算法中,我们需要快速找到最近最少使用的数据,以及支持快速添加和删除节点。这时候使用双向链表就非常合适。 -循环链表常被用于需要周期性操作的场景,比如操作系统的资源调度。 +环形链表常用于需要周期性操作的场景,比如操作系统的资源调度。 -- **时间片轮转调度算法**:在操作系统中,时间片轮转调度算法是一种常见的 CPU 调度算法,它需要对一组进程进行循环。每个进程被赋予一个时间片,当时间片用完时,CPU 将切换到下一个进程。这种循环的操作就可以通过循环链表来实现。 -- **数据缓冲区**:在某些数据缓冲区的实现中,也可能会使用到循环链表。比如在音频、视频播放器中,数据流可能会被分成多个缓冲块并放入一个循环链表,以便实现无缝播放。 +- **时间片轮转调度算法**:在操作系统中,时间片轮转调度算法是一种常见的 CPU 调度算法,它需要对一组进程进行循环。每个进程被赋予一个时间片,当时间片用完时,CPU 将切换到下一个进程。这种循环操作可以通过环形链表来实现。 +- **数据缓冲区**:在某些数据缓冲区的实现中,也可能会使用环形链表。比如在音频、视频播放器中,数据流可能会被分成多个缓冲块并放入一个环形链表,以便实现无缝播放。 diff --git a/docs/chapter_array_and_linkedlist/list.md b/docs/chapter_array_and_linkedlist/list.md index fe1645595..5962ae489 100755 --- a/docs/chapter_array_and_linkedlist/list.md +++ b/docs/chapter_array_and_linkedlist/list.md @@ -1,9 +1,9 @@ # 列表 -「列表 list」是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历等操作,无需使用者考虑容量限制的问题。列表可以基于链表或数组实现。 +「列表 list」是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历等操作,无须使用者考虑容量限制的问题。列表可以基于链表或数组实现。 -- 链表天然可以被看作是一个列表,其支持元素增删查改操作,并且可以灵活动态扩容。 -- 数组也支持元素增删查改,但由于其长度不可变,因此只能被看作是一个具有长度限制的列表。 +- 链表天然可以被看作一个列表,其支持元素增删查改操作,并且可以灵活动态扩容。 +- 数组也支持元素增删查改,但由于其长度不可变,因此只能被看作一个具有长度限制的列表。 当使用数组实现列表时,**长度不可变的性质会导致列表的实用性降低**。这是因为我们通常无法事先确定需要存储多少数据,从而难以选择合适的列表长度。若长度过小,则很可能无法满足使用需求;若长度过大,则会造成内存空间的浪费。 @@ -15,7 +15,7 @@ ### 初始化列表 -我们通常使用“无初始值”和“有初始值”这两种初始化方法。 +我们通常使用“无初始值”和“有初始值”这两种初始化方法: === "Python" @@ -264,14 +264,14 @@ # 清空列表 nums.clear() - # 尾部添加元素 + # 在尾部添加元素 nums.append(1) nums.append(3) nums.append(2) nums.append(5) nums.append(4) - # 中间插入元素 + # 在中间插入元素 nums.insert(3, 6) # 在索引 3 处插入数字 6 # 删除元素 @@ -284,14 +284,14 @@ /* 清空列表 */ nums.clear(); - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.push_back(1); nums.push_back(3); nums.push_back(2); nums.push_back(5); nums.push_back(4); - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.insert(nums.begin() + 3, 6); // 在索引 3 处插入数字 6 /* 删除元素 */ @@ -304,14 +304,14 @@ /* 清空列表 */ nums.clear(); - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.add(1); nums.add(3); nums.add(2); nums.add(5); nums.add(4); - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.add(3, 6); // 在索引 3 处插入数字 6 /* 删除元素 */ @@ -324,14 +324,14 @@ /* 清空列表 */ nums.Clear(); - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.Add(1); nums.Add(3); nums.Add(2); nums.Add(5); nums.Add(4); - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.Insert(3, 6); /* 删除元素 */ @@ -344,14 +344,14 @@ /* 清空列表 */ nums = nil - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums = append(nums, 1) nums = append(nums, 3) nums = append(nums, 2) nums = append(nums, 5) nums = append(nums, 4) - /* 中间插入元素 */ + /* 在中间插入元素 */ nums = append(nums[:3], append([]int{6}, nums[3:]...)...) // 在索引 3 处插入数字 6 /* 删除元素 */ @@ -364,14 +364,14 @@ /* 清空列表 */ nums.removeAll() - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.append(1) nums.append(3) nums.append(2) nums.append(5) nums.append(4) - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.insert(6, at: 3) // 在索引 3 处插入数字 6 /* 删除元素 */ @@ -384,14 +384,14 @@ /* 清空列表 */ nums.length = 0; - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.push(1); nums.push(3); nums.push(2); nums.push(5); nums.push(4); - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.splice(3, 0, 6); /* 删除元素 */ @@ -404,14 +404,14 @@ /* 清空列表 */ nums.length = 0; - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.push(1); nums.push(3); nums.push(2); nums.push(5); nums.push(4); - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.splice(3, 0, 6); /* 删除元素 */ @@ -424,14 +424,14 @@ /* 清空列表 */ nums.clear(); - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.add(1); nums.add(3); nums.add(2); nums.add(5); nums.add(4); - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.insert(3, 6); // 在索引 3 处插入数字 6 /* 删除元素 */ @@ -444,14 +444,14 @@ /* 清空列表 */ nums.clear(); - /* 尾部添加元素 */ + /* 在尾部添加元素 */ nums.push(1); nums.push(3); nums.push(2); nums.push(5); nums.push(4); - /* 中间插入元素 */ + /* 在中间插入元素 */ nums.insert(3, 6); // 在索引 3 处插入数字 6 /* 删除元素 */ @@ -470,14 +470,14 @@ // 清空列表 nums.clearRetainingCapacity(); - // 尾部添加元素 + // 在尾部添加元素 try nums.append(1); try nums.append(3); try nums.append(2); try nums.append(5); try nums.append(4); - // 中间插入元素 + // 在中间插入元素 try nums.insert(3, 6); // 在索引 3 处插入数字 6 // 删除元素 @@ -669,7 +669,7 @@ ### 拼接列表 -给定一个新列表 `nums1` ,我们可以将该列表拼接到原列表的尾部。 +给定一个新列表 `nums1` ,我们可以将其拼接到原列表的尾部。 === "Python" @@ -770,7 +770,7 @@ ### 排序列表 -完成列表排序后,我们便可以使用在数组类算法题中经常考察的“二分查找”和“双指针”算法。 +完成列表排序后,我们便可以使用在数组类算法题中经常考查的“二分查找”和“双指针”算法。 === "Python" @@ -857,13 +857,13 @@ ## 列表实现 -许多编程语言都提供内置的列表,例如 Java、C++、Python 等。它们的实现比较复杂,各个参数的设定也非常有考究,例如初始容量、扩容倍数等。感兴趣的读者可以查阅源码进行学习。 +许多编程语言内置了列表,例如 Java、C++、Python 等。它们的实现比较复杂,各个参数的设定也非常考究,例如初始容量、扩容倍数等。感兴趣的读者可以查阅源码进行学习。 为了加深对列表工作原理的理解,我们尝试实现一个简易版列表,包括以下三个重点设计。 - **初始容量**:选取一个合理的数组初始容量。在本示例中,我们选择 10 作为初始容量。 - **数量记录**:声明一个变量 `size` ,用于记录列表当前元素数量,并随着元素插入和删除实时更新。根据此变量,我们可以定位列表尾部,以及判断是否需要扩容。 -- **扩容机制**:若插入元素时列表容量已满,则需要进行扩容。首先根据扩容倍数创建一个更大的数组,再将当前数组的所有元素依次移动至新数组。在本示例中,我们规定每次将数组扩容至之前的 2 倍。 +- **扩容机制**:若插入元素时列表容量已满,则需要进行扩容。先根据扩容倍数创建一个更大的数组,再将当前数组的所有元素依次移动至新数组。在本示例中,我们规定每次将数组扩容至之前的 2 倍。 ```src [file]{my_list}-[class]{my_list}-[func]{} diff --git a/docs/chapter_array_and_linkedlist/ram_and_cache.assets/computer_storage_devices.png b/docs/chapter_array_and_linkedlist/ram_and_cache.assets/computer_storage_devices.png index 85005ab950a1edef439d1bcf9caf781d5d1e799e..0f2af92eec42c19b30c14e3d734d1f5218c39abc 100644 GIT binary patch literal 12981 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 Q8}QS+Zg{Qqiv92Z2Mw8Y6aWAK diff --git a/docs/chapter_array_and_linkedlist/ram_and_cache.assets/storage_pyramid.png b/docs/chapter_array_and_linkedlist/ram_and_cache.assets/storage_pyramid.png index 0fdd39a76e736139106d3d689e3a49a79e4af3ba..4a14715f6523ce09065c5f0257807d7d4ee27b13 100644 GIT binary patch literal 19155 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