From 856dfabdd7ceccdcb98b9900bcaad42cc9e84bb8 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 1 Oct 2017 07:22:30 -0500 Subject: [PATCH 001/473] add solutions --- .DS_Store | Bin 0 -> 6148 bytes 001._two_sum.md | 43 ++++ 002._add_two_numbers.md | 37 +++ ..._substring_without_repeating_characters.md | 56 +++++ 004._median_of_two_sorted_arrays.md | 151 +++++++++++ 005._longest_palindromic_substring.md | 193 ++++++++++++++ 008._string_to_integer_(atoi).md | 47 ++++ 010._regular_expression_matching.md | 141 +++++++++++ 011._container_with_most_water.md | 109 ++++++++ 012. Integer to Roman.md | 89 +++++++ 013.Roman to Integer.md | 80 ++++++ 014._longest_common_prefix.md | 76 ++++++ 015._3sum.md | 104 ++++++++ 016._3sum_closest.md | 52 ++++ 017._letter_combinations_of_a_phone_number.md | 55 ++++ 018._4sum.md | 94 +++++++ 019._remove_nth_node_from_end_of_list.md | 41 +++ 020._valid_parentheses.md | 53 ++++ 021._merge_two_sorted_lists.md | 48 ++++ 022._generate_parentheses.md | 88 +++++++ 023._merge_k_sorted_lists.md | 49 ++++ 024._swap_nodes_in_pairs.md | 35 +++ 028._implement_strstr().md | 36 +++ 031._next_permutation.md | 57 +++++ 033._search_in_rotated_sorted_array.md | 53 ++++ 034. Search for a Range.md | 82 ++++++ 035._search_insert_position.md | 32 +++ 039._combination_sum.md | 66 +++++ 040._combination_sum_ii.md | 82 ++++++ 042._trapping_rain_water.md | 50 ++++ 043._multiply_strings.md | 81 ++++++ 044._wildcard_matching.md | 44 ++++ 046._permutations.md | 138 ++++++++++ 047._permutations_ii.md | 42 ++++ 048._rotate_image.md | 118 +++++++++ 049._group_anagrams_python.md | 38 +++ 050._pow(x,_n).md | 36 +++ 051._n-queens.md | 48 ++++ 052._n-queens_ii.md | 52 ++++ 053._maximum_subarray.md | 146 +++++++++++ 054._spiral_matrix.md | 120 +++++++++ 055._jump_game.md | 67 +++++ 058._length_of_last_word.md | 24 ++ 059._spiral_matrix_ii.md | 51 ++++ 060._permutation_sequence.md | 93 +++++++ 061._rotate_list.md | 58 +++++ 064._minimum_path_sum.md | 58 +++++ 065.unique_paths_ii.md | 84 +++++++ 066._plus_one.md | 63 +++++ 067._add_binary.md | 33 +++ 069._sqrt(x).md | 78 ++++++ 072._edit_distance.md | 116 +++++++++ 073. Set Matrix Zeroes.md | 55 ++++ 074._search_a_2d_matrix.md | 51 ++++ 075._sort_colors.md | 54 ++++ 077._combinations.md | 123 +++++++++ 078.Subsets .md | 67 +++++ 079._word_search.md | 63 +++++ 082._remove_duplicates_from_sorted_list_ii.md | 49 ++++ 083._remove_duplicates_from_sorted_list.md | 33 +++ 086._partition_list.md | 56 +++++ 088._merge_sorted_array.md | 56 +++++ 089._gray_code.md | 101 ++++++++ 090._subsets_ii.md | 47 ++++ 091._decode_ways.md | 71 ++++++ 092._reverse_linked_list_ii.md | 66 +++++ 093._restore_ip_addresses.md | 66 +++++ 094._binary_tree_inorder_traversal.md | 70 ++++++ 096._unique_binary_search_trees.md | 43 ++++ 098._validate_binary_search_tree.md | 74 ++++++ 100._same_tree.md | 32 +++ 101._symmetric_tree.md | 48 ++++ 102._binary_tree_level_order_traversal.md | 63 +++++ ...inary_tree_zigzag_level_order_traversal.md | 48 ++++ 104._maximum_depth_of_binary_tree.md | 27 ++ ...ree_from_preorder_and_inorder_traversal.md | 100 ++++++++ ...ee_from_inorder_and_postorder_traversal.md | 68 +++++ 107._binary_tree_level_order_traversal_ii.md | 48 ++++ ...vert_sorted_array_to_binary_search_tree.md | 41 +++ ...nvert_sorted_list_to_binary_search_tree.md | 47 ++++ 110._balanced_binary_tree.md | 37 +++ 111._minimum_depth_of_binary_tree.md | 44 ++++ 112._path_sum.md | 30 +++ 113._path_sum_ii.md | 48 ++++ 114._flatten_binary_tree_to_linked_list.md | 42 ++++ ...lating_next_right_pointers_in_each_node.md | 36 +++ 118._pascal's_triangle.md | 36 +++ 119. Pascal's Triangle II.md | 59 +++++ 120. Triangle.md | 72 ++++++ 125._valid_palindrome.md | 63 +++++ 126. Word Ladder II.md | 101 ++++++++ 127._word_ladder.md | 85 +++++++ 129._sum_root_to_leaf_numbers.md | 37 +++ 130._surrounded_regions.md | 147 +++++++++++ 131._palindrome_partitioning.md | 48 ++++ 133._clone_graph.md | 66 +++++ 136._single_number.md | 43 ++++ 139._word_break.md | 61 +++++ 140._word_break_ii.md | 119 +++++++++ 141._linked_list_cycle.md | 81 ++++++ 143._reorder_list.md | 112 +++++++++ 144._binary_tree_preorder_traversal.md | 63 +++++ 145._binary_tree_postorder_traversal.md | 67 +++++ 147._insertion_sort_list.md | 59 +++++ 148._sort_list.md | 138 ++++++++++ 150._evaluate_reverse_polish_notation.md | 83 ++++++ 151._reverse_words_in_a_string.md | 25 ++ 152._maximum_product_subarray.md | 44 ++++ 153._find_minimum_in_rotated_sorted_array.md | 85 +++++++ 155._min_stack.md | 169 +++++++++++++ 160._intersection_of_two_linked_lists.md | 85 +++++++ 162._find_peak_element.md | 69 +++++ 165._compare_version_numbers.md | 47 ++++ 167._two_sum_ii_-_input_array_is_sorted.md | 39 +++ 168._excel_sheet_column_title.md | 28 +++ 169._majority_element.md | 74 ++++++ 171._excel_sheet_column_number.md | 34 +++ 173._binary_search_tree_iterator.md | 95 +++++++ 189._rotate_array.md | 23 ++ 191._number_of_1_bits.md | 70 ++++++ 198._house_robber.md | 41 +++ 199._binary_tree_right_side_view.md | 37 +++ 200._number_of_islands.md | 113 +++++++++ 203._remove_linked_list_elements.md | 38 +++ 204._count_primes.md | 57 +++++ 205._isomorphic_strings.md | 39 +++ 206._reverse_linked_list.md | 52 ++++ 207._course_schedule.md | 93 +++++++ 208._implement_trie_(prefix_tree).md | 87 +++++++ 210._course_schedule_ii.md | 55 ++++ ...and Search Word - Data structure design.md | 77 ++++++ 213._house_robber_ii.md | 61 +++++ 216._combination_sum_iii.md | 40 +++ 217._contains_duplicate.md | 62 +++++ 219._contains_duplicate_ii.md | 35 +++ 221._maximal_square.md | 78 ++++++ 222._count_complete_tree_nodes.md | 67 +++++ 223._rectangle_area.md | 50 ++++ 224. Basic Calculator .md | 108 ++++++++ 225._implement_stack_using_queues.md | 53 ++++ 226._invert_binary_tree.md | 33 +++ 227._basic_calculator_ii.md | 108 ++++++++ 228._summary_ranges.md | 59 +++++ 229._majority_element_ii.md | 62 +++++ 230._kth_smallest_element_in_a_bst.md | 48 ++++ 231. Power of Two.md | 93 +++++++ 232._implement_queue_using_stacks.md | 51 ++++ 234._palindrome_linked_list.md | 124 +++++++++ ...common_ancestor_of_a_binary_search_tree.md | 33 +++ ...lowest_common_ancestor_of_a_binary_tree.md | 104 ++++++++ 237._delete_node_in_a_linked_list.md | 32 +++ 238._product_of_array_except_self.md | 100 ++++++++ 240._search_a_2d_matrix_ii.md | 65 +++++ 242._valid_anagram.md | 54 ++++ 252. Meeting Rooms.md | 47 ++++ 256. Paint House.md | 57 +++++ 257._binary_tree_paths.md | 45 ++++ 261. Graph Valid Tree.md | 69 +++++ 263._ugly_number.md | 38 +++ 264._ugly_number_ii.md | 140 +++++++++++ 265. Paint House II.md | 60 +++++ 266. Palindrome Permutation.md | 46 ++++ 267. Palindrome Permutation II.md | 77 ++++++ 268._missing_number.md | 37 +++ 270. Closest Binary Search Tree Value.md | 66 +++++ 276. Paint Fence.md | 65 +++++ 277. Find the Celebrity.md | 65 +++++ 278. First Bad Version.md | 44 ++++ 279._perfect_squares.md | 45 ++++ 280. Wiggle Sort.md | 78 ++++++ 283._move_zeroes.md | 93 +++++++ 285._inorder_successor_in_bst.md | 81 ++++++ 286. Walls and Gates.md | 90 +++++++ 289._game_of_life.md | 111 ++++++++ 290._word_pattern.md | 42 ++++ 292._nim_game.md | 55 ++++ 296. Best Meeting Point.md | 67 +++++ ...inary Tree Longest Consecutive Sequence.md | 123 +++++++++ 299._bulls_and_cows.md | 119 +++++++++ 300._longest_increasing_subsequence.md | 42 ++++ 303._range_sum_query_-_immutable.md | 47 ++++ 322. Coin Change.md | 52 ++++ ...ected Components in an Undirected Graph.md | 103 ++++++++ 326._power_of_three.md | 50 ++++ 328._odd_even_linked_list.md | 112 +++++++++ 334._increasing_triplet_subsequence.md | 71 ++++++ 337._house_robber_iii.md | 47 ++++ 338. Counting Bits.md | 46 ++++ 339. Nested List Weight Sum.md | 58 +++++ 341. Flatten Nested List Iterator.md | 51 ++++ 342. Power of Four.md | 33 +++ 344._reverse_string.md | 47 ++++ 349._intersection_of_two_arrays.md | 25 ++ 350._intersection_of_two_arrays_ii.md | 46 ++++ 353. Design Snake Game.md | 89 +++++++ 364. Nested List Weight Sum II.md | 47 ++++ 366. Find Leaves of Binary Tree.md | 54 ++++ 367._valid_perfect_square.md | 42 ++++ 369.Plus One Linked List.md | 46 ++++ 371._sum_of_two_integers.md | 95 +++++++ 377._combination_sum_iv.md | 77 ++++++ ...kth_smallest_element_in_a_sorted_matrix.md | 61 +++++ 380. Insert Delete GetRandom O(1).md | 159 ++++++++++++ ...ete GetRandom O(1) - Duplicates allowed.md | 83 ++++++ 382._linked_list_random_node.md | 79 ++++++ 383._ransom_note.md | 37 +++ 384. Shuffle an Array.md | 105 ++++++++ 387._first_unique_character_in_a_string.md | 59 +++++ 389._find_the_difference.md | 47 ++++ 392._is_subsequence.md | 69 +++++ 394._decode_string.md | 70 ++++++ 400. Nth Digit.md | 46 ++++ 401._binary_watch.md | 60 +++++ 404._sum_of_left_leaves.md | 45 ++++ 405. Convert a Number to Hexadecimal.md | 114 +++++++++ 412._fizz_buzz.md | 35 +++ 413. Arithmetic Slices.md | 84 +++++++ 414._third_maximum_number.md | 46 ++++ 415._add_strings.md | 61 +++++ 416. Partition Equal Subset Sum.md | 87 +++++++ 422. Valid Word Square.md | 48 ++++ 434._number_of_segments_in_a_string.md | 27 ++ 437._path_sum_iii.md | 51 ++++ 439. Ternary Expression Parser.md | 58 +++++ 441._arranging_coins.md | 29 +++ 450. Delete Node in a BST.md | 62 +++++ 453. Minimum Moves to Equal Array Elements.md | 72 ++++++ 461. Hamming Distance.md | 53 ++++ 469. Convex Polygon.md | 88 +++++++ 70. Climbing Stairs.md | 67 +++++ ...h \344\270\215\346\230\223\345\206\231.md" | 91 +++++++ Data Structure and Algorthim Review.md | 101 ++++++++ Dynamic Programming.md | 48 ++++ ...hing Algorithms \342\200\223 topcoder.pdf" | Bin 0 -> 117543 bytes "LinkedList\346\212\200\345\267\247.md" | 116 +++++++++ Maximal Square.pdf | Bin 0 -> 185749 bytes ...00\345\267\247\347\254\224\350\256\260.md" | 227 +++++++++++++++++ Range Sum Query 2D - Immutable.pdf | Bin 0 -> 167781 bytes Readme.md | 16 ++ Recusrion & BackTracking.md | 237 ++++++++++++++++++ "backtracking\346\200\235\350\267\257.md" | 68 +++++ ..._a_linked_list\351\227\256\351\242\230.md" | 69 +++++ ...60\347\232\204\346\200\235\350\267\257.md" | 14 ++ ...47\232\204\345\220\204\347\247\215pass.md" | 123 +++++++++ ...\214_graph_search\357\274\214_dfs,_bfs.md" | 183 ++++++++++++++ "\344\275\215\350\277\220\347\256\227.md" | 38 +++ ...22\345\210\227\347\256\227\346\263\225.md" | 194 ++++++++++++++ ...06\345\220\210\351\227\256\351\242\230.md" | 114 +++++++++ ...04\345\220\210\351\227\256\351\242\230.md" | 84 +++++++ "\351\200\222\345\275\222_recursion.md" | 39 +++ 250 files changed, 16931 insertions(+) create mode 100644 .DS_Store create mode 100644 001._two_sum.md create mode 100644 002._add_two_numbers.md create mode 100644 003._longest_substring_without_repeating_characters.md create mode 100644 004._median_of_two_sorted_arrays.md create mode 100644 005._longest_palindromic_substring.md create mode 100644 008._string_to_integer_(atoi).md create mode 100644 010._regular_expression_matching.md create mode 100644 011._container_with_most_water.md create mode 100644 012. Integer to Roman.md create mode 100644 013.Roman to Integer.md create mode 100644 014._longest_common_prefix.md create mode 100644 015._3sum.md create mode 100644 016._3sum_closest.md create mode 100644 017._letter_combinations_of_a_phone_number.md create mode 100644 018._4sum.md create mode 100644 019._remove_nth_node_from_end_of_list.md create mode 100644 020._valid_parentheses.md create mode 100644 021._merge_two_sorted_lists.md create mode 100644 022._generate_parentheses.md create mode 100644 023._merge_k_sorted_lists.md create mode 100644 024._swap_nodes_in_pairs.md create mode 100644 028._implement_strstr().md create mode 100644 031._next_permutation.md create mode 100644 033._search_in_rotated_sorted_array.md create mode 100644 034. Search for a Range.md create mode 100644 035._search_insert_position.md create mode 100644 039._combination_sum.md create mode 100644 040._combination_sum_ii.md create mode 100644 042._trapping_rain_water.md create mode 100644 043._multiply_strings.md create mode 100644 044._wildcard_matching.md create mode 100644 046._permutations.md create mode 100644 047._permutations_ii.md create mode 100644 048._rotate_image.md create mode 100644 049._group_anagrams_python.md create mode 100644 050._pow(x,_n).md create mode 100644 051._n-queens.md create mode 100644 052._n-queens_ii.md create mode 100644 053._maximum_subarray.md create mode 100644 054._spiral_matrix.md create mode 100644 055._jump_game.md create mode 100644 058._length_of_last_word.md create mode 100644 059._spiral_matrix_ii.md create mode 100644 060._permutation_sequence.md create mode 100644 061._rotate_list.md create mode 100644 064._minimum_path_sum.md create mode 100644 065.unique_paths_ii.md create mode 100644 066._plus_one.md create mode 100644 067._add_binary.md create mode 100644 069._sqrt(x).md create mode 100644 072._edit_distance.md create mode 100644 073. Set Matrix Zeroes.md create mode 100644 074._search_a_2d_matrix.md create mode 100644 075._sort_colors.md create mode 100644 077._combinations.md create mode 100644 078.Subsets .md create mode 100644 079._word_search.md create mode 100644 082._remove_duplicates_from_sorted_list_ii.md create mode 100644 083._remove_duplicates_from_sorted_list.md create mode 100644 086._partition_list.md create mode 100644 088._merge_sorted_array.md create mode 100644 089._gray_code.md create mode 100644 090._subsets_ii.md create mode 100644 091._decode_ways.md create mode 100644 092._reverse_linked_list_ii.md create mode 100644 093._restore_ip_addresses.md create mode 100644 094._binary_tree_inorder_traversal.md create mode 100644 096._unique_binary_search_trees.md create mode 100644 098._validate_binary_search_tree.md create mode 100644 100._same_tree.md create mode 100644 101._symmetric_tree.md create mode 100644 102._binary_tree_level_order_traversal.md create mode 100644 103._binary_tree_zigzag_level_order_traversal.md create mode 100644 104._maximum_depth_of_binary_tree.md create mode 100644 105._construct_binary_tree_from_preorder_and_inorder_traversal.md create mode 100644 106._construct_binary_tree_from_inorder_and_postorder_traversal.md create mode 100644 107._binary_tree_level_order_traversal_ii.md create mode 100644 108._convert_sorted_array_to_binary_search_tree.md create mode 100644 109._convert_sorted_list_to_binary_search_tree.md create mode 100644 110._balanced_binary_tree.md create mode 100644 111._minimum_depth_of_binary_tree.md create mode 100644 112._path_sum.md create mode 100644 113._path_sum_ii.md create mode 100644 114._flatten_binary_tree_to_linked_list.md create mode 100644 116._populating_next_right_pointers_in_each_node.md create mode 100644 118._pascal's_triangle.md create mode 100644 119. Pascal's Triangle II.md create mode 100644 120. Triangle.md create mode 100644 125._valid_palindrome.md create mode 100644 126. Word Ladder II.md create mode 100644 127._word_ladder.md create mode 100644 129._sum_root_to_leaf_numbers.md create mode 100644 130._surrounded_regions.md create mode 100644 131._palindrome_partitioning.md create mode 100644 133._clone_graph.md create mode 100644 136._single_number.md create mode 100644 139._word_break.md create mode 100644 140._word_break_ii.md create mode 100644 141._linked_list_cycle.md create mode 100644 143._reorder_list.md create mode 100644 144._binary_tree_preorder_traversal.md create mode 100644 145._binary_tree_postorder_traversal.md create mode 100644 147._insertion_sort_list.md create mode 100644 148._sort_list.md create mode 100644 150._evaluate_reverse_polish_notation.md create mode 100644 151._reverse_words_in_a_string.md create mode 100644 152._maximum_product_subarray.md create mode 100644 153._find_minimum_in_rotated_sorted_array.md create mode 100644 155._min_stack.md create mode 100644 160._intersection_of_two_linked_lists.md create mode 100644 162._find_peak_element.md create mode 100644 165._compare_version_numbers.md create mode 100644 167._two_sum_ii_-_input_array_is_sorted.md create mode 100644 168._excel_sheet_column_title.md create mode 100644 169._majority_element.md create mode 100644 171._excel_sheet_column_number.md create mode 100644 173._binary_search_tree_iterator.md create mode 100644 189._rotate_array.md create mode 100644 191._number_of_1_bits.md create mode 100644 198._house_robber.md create mode 100644 199._binary_tree_right_side_view.md create mode 100644 200._number_of_islands.md create mode 100644 203._remove_linked_list_elements.md create mode 100644 204._count_primes.md create mode 100644 205._isomorphic_strings.md create mode 100644 206._reverse_linked_list.md create mode 100644 207._course_schedule.md create mode 100644 208._implement_trie_(prefix_tree).md create mode 100644 210._course_schedule_ii.md create mode 100644 211. Add and Search Word - Data structure design.md create mode 100644 213._house_robber_ii.md create mode 100644 216._combination_sum_iii.md create mode 100644 217._contains_duplicate.md create mode 100644 219._contains_duplicate_ii.md create mode 100644 221._maximal_square.md create mode 100644 222._count_complete_tree_nodes.md create mode 100644 223._rectangle_area.md create mode 100644 224. Basic Calculator .md create mode 100644 225._implement_stack_using_queues.md create mode 100644 226._invert_binary_tree.md create mode 100644 227._basic_calculator_ii.md create mode 100644 228._summary_ranges.md create mode 100644 229._majority_element_ii.md create mode 100644 230._kth_smallest_element_in_a_bst.md create mode 100644 231. Power of Two.md create mode 100644 232._implement_queue_using_stacks.md create mode 100644 234._palindrome_linked_list.md create mode 100644 235._lowest_common_ancestor_of_a_binary_search_tree.md create mode 100644 236._lowest_common_ancestor_of_a_binary_tree.md create mode 100644 237._delete_node_in_a_linked_list.md create mode 100644 238._product_of_array_except_self.md create mode 100644 240._search_a_2d_matrix_ii.md create mode 100644 242._valid_anagram.md create mode 100644 252. Meeting Rooms.md create mode 100644 256. Paint House.md create mode 100644 257._binary_tree_paths.md create mode 100644 261. Graph Valid Tree.md create mode 100644 263._ugly_number.md create mode 100644 264._ugly_number_ii.md create mode 100644 265. Paint House II.md create mode 100644 266. Palindrome Permutation.md create mode 100644 267. Palindrome Permutation II.md create mode 100644 268._missing_number.md create mode 100644 270. Closest Binary Search Tree Value.md create mode 100644 276. Paint Fence.md create mode 100644 277. Find the Celebrity.md create mode 100644 278. First Bad Version.md create mode 100644 279._perfect_squares.md create mode 100644 280. Wiggle Sort.md create mode 100644 283._move_zeroes.md create mode 100644 285._inorder_successor_in_bst.md create mode 100644 286. Walls and Gates.md create mode 100644 289._game_of_life.md create mode 100644 290._word_pattern.md create mode 100644 292._nim_game.md create mode 100644 296. Best Meeting Point.md create mode 100644 298. Binary Tree Longest Consecutive Sequence.md create mode 100644 299._bulls_and_cows.md create mode 100644 300._longest_increasing_subsequence.md create mode 100644 303._range_sum_query_-_immutable.md create mode 100644 322. Coin Change.md create mode 100644 323. Number of Connected Components in an Undirected Graph.md create mode 100644 326._power_of_three.md create mode 100644 328._odd_even_linked_list.md create mode 100644 334._increasing_triplet_subsequence.md create mode 100644 337._house_robber_iii.md create mode 100644 338. Counting Bits.md create mode 100644 339. Nested List Weight Sum.md create mode 100644 341. Flatten Nested List Iterator.md create mode 100644 342. Power of Four.md create mode 100644 344._reverse_string.md create mode 100644 349._intersection_of_two_arrays.md create mode 100644 350._intersection_of_two_arrays_ii.md create mode 100644 353. Design Snake Game.md create mode 100644 364. Nested List Weight Sum II.md create mode 100644 366. Find Leaves of Binary Tree.md create mode 100644 367._valid_perfect_square.md create mode 100644 369.Plus One Linked List.md create mode 100644 371._sum_of_two_integers.md create mode 100644 377._combination_sum_iv.md create mode 100644 378._kth_smallest_element_in_a_sorted_matrix.md create mode 100644 380. Insert Delete GetRandom O(1).md create mode 100644 381. Insert Delete GetRandom O(1) - Duplicates allowed.md create mode 100644 382._linked_list_random_node.md create mode 100644 383._ransom_note.md create mode 100644 384. Shuffle an Array.md create mode 100644 387._first_unique_character_in_a_string.md create mode 100644 389._find_the_difference.md create mode 100644 392._is_subsequence.md create mode 100644 394._decode_string.md create mode 100644 400. Nth Digit.md create mode 100644 401._binary_watch.md create mode 100644 404._sum_of_left_leaves.md create mode 100644 405. Convert a Number to Hexadecimal.md create mode 100644 412._fizz_buzz.md create mode 100644 413. Arithmetic Slices.md create mode 100644 414._third_maximum_number.md create mode 100644 415._add_strings.md create mode 100644 416. Partition Equal Subset Sum.md create mode 100644 422. Valid Word Square.md create mode 100644 434._number_of_segments_in_a_string.md create mode 100644 437._path_sum_iii.md create mode 100644 439. Ternary Expression Parser.md create mode 100644 441._arranging_coins.md create mode 100644 450. Delete Node in a BST.md create mode 100644 453. Minimum Moves to Equal Array Elements.md create mode 100644 461. Hamming Distance.md create mode 100644 469. Convex Polygon.md create mode 100644 70. Climbing Stairs.md create mode 100644 "Binary Search \344\270\215\346\230\223\345\206\231.md" create mode 100644 Data Structure and Algorthim Review.md create mode 100644 Dynamic Programming.md create mode 100644 "Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" create mode 100644 "LinkedList\346\212\200\345\267\247.md" create mode 100644 Maximal Square.pdf create mode 100644 "Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.md" create mode 100644 Range Sum Query 2D - Immutable.pdf create mode 100644 Readme.md create mode 100644 Recusrion & BackTracking.md create mode 100644 "backtracking\346\200\235\350\267\257.md" create mode 100644 "delete_node_in_a_linked_list\351\227\256\351\242\230.md" create mode 100644 "local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" create mode 100644 "python\347\232\204\345\220\204\347\247\215pass.md" create mode 100644 "tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" create mode 100644 "\344\275\215\350\277\220\347\256\227.md" create mode 100644 "\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" create mode 100644 "\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" create mode 100644 "\347\273\204\345\220\210\351\227\256\351\242\230.md" create mode 100644 "\351\200\222\345\275\222_recursion.md" diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b9081167bec57b03803a6eb35b4bd974f4f5755a GIT binary patch literal 6148 zcmeHK&1%~~5T141MkbW{5J--DDdgaSOiJBS0>VxXfgD0q+Cx(kDH63n)dpLRNgM~g zM)F2^f<8|B?T_6Sx6oWnTV`PP8_mwlqHo2nhKNLWl(dPOMC3s=)*2XoA$nfxg4CR6 z1t?679w|yFrRUUJh-Sy%$bjCvbvnSFrBq_qzVF`w9Z`s#Jfus^^f6QH=jtrZRg4_{ z!MuTPeKi8>0d?Z>@Z8n8kI(aLSo;1KQCq1$dc5j28eZdx_c83Naacy>XxNPgAIwvh zq_MN#DwWUeD1MivKsO8AGv0slji1R((zxl ze0epwp5EM=S0sTC-N;jiGq{8C$3$L)gCbYO zC*;iP&FU~R1Iz$3umlF&(c`TxVJ%*Q8DIwfEe7=YAfXxqhm}QhbYL(o0I&|X5!m|I zQ0GX8fy2roW+1|*0&S{rErzh^@JkmLIIJw%bP}%l5N>7RIuv16M}29+Ndy*oWCoal zpBd1-AEc@8|GnS$|0akBW`G&^KN%49-Eg;ycXM~^!dvRQRzgpqT6A1xah?LhT*Zjh dSMes)2>enTz`$W;5grKt2pAf8U + + +难度: + +Easy + + +思路 + +可以用O(n^2) loop + +但是也可以牺牲空间换取时间,异常聪明的AC解法 + +``` + 2 7 11 15 + 不存在 存在之中 +lookup {2:0} [0,1] +``` + +一点字典有了这个 `target - 当前数字`,找到它的index和当前index一起返回。 + + +``` +class Solution(object): + def twoSum(self, nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: List[int] + """ + lookup = {} + for i, num in enumerate(nums): + if target - num in lookup: + return [lookup[target - num],i] + lookup[num] = i + return [] +``` + + diff --git a/002._add_two_numbers.md b/002._add_two_numbers.md new file mode 100644 index 000000000..828fd7610 --- /dev/null +++ b/002._add_two_numbers.md @@ -0,0 +1,37 @@ +###2. Add Two Numbers + +题目: + + + +难度 : Medium + + +跟plus One, add Binary 玩的同一种花样 + + +``` +class Solution(object): + def addTwoNumbers(self, l1, l2): + """ + :type l1: ListNode + :type l2: ListNode + :rtype: ListNode + """ + #easiest case + if l1 == None: + return l2 + if l2 == None: + return l1 + + if l1.val + l2.val < 10: + l3 = ListNode(l1.val + l2.val) + l3.next = self.addTwoNumbers(l1.next, l2.next) + + elif l1.val + l2.val >= 10: + l3 = ListNode(l1.val + l2.val - 10) + tmp = ListNode(1) + tmp.next = None + l3.next = self.addTwoNumbers(l1.next, self.addTwoNumbers(l2.next ,tmp)) + return l3 +``` diff --git a/003._longest_substring_without_repeating_characters.md b/003._longest_substring_without_repeating_characters.md new file mode 100644 index 000000000..74e95c8ce --- /dev/null +++ b/003._longest_substring_without_repeating_characters.md @@ -0,0 +1,56 @@ +###3. Longest Substring Without Repeating Characters + + +题目: + + + +难度: + +Medium + + + +思路 + +粗一看是dp,细一看是greedy + + + idx 0 1 2 3 4 5 6 7 + a b c a b c b b + rnd ↑ stop↑ + ↑ stop↑ + ↑ stop↑ + + +因为其实只要每次记录下重复开始的位置,就可以解决问题。 + + +注意最后还有一个 n - start 和 l 来比较,这相当于是最后一个round + + +如果当前重复的这个s[i]取值是限定大于start,就是在start之后再出现重复 + + +``` +class Solution(object): + def lengthOfLongestSubstring(self, s): + """ + :type s: str + :rtype: int + """ + n = len(s) + l = 0 + maps = {} + start = 0 + + for i in range(n): + if maps.get(s[i],-1) >= start: + l = max(i - start, l) + start = maps.get(s[i]) + 1 + print start + maps[s[i]] = i + return max(n - start, l) +``` + + diff --git a/004._median_of_two_sorted_arrays.md b/004._median_of_two_sorted_arrays.md new file mode 100644 index 000000000..32f419e3a --- /dev/null +++ b/004._median_of_two_sorted_arrays.md @@ -0,0 +1,151 @@ +###4. Median of Two Sorted Arrays + +题目: + + + +难度: + +Hard + + +一看到的时候,觉得跟CLRS书上的一道习题类似 +求X[1....n] Y[1....n] 的 median + +习题 9.3-8 + + +Let X[1..n] and Y [1..n] be two arrays, each containing n numbers already in sorted order. Give an O(lg n)-time algorithn to find the median of all 2n elements in arrays X and Y . + + +> The median can be obtained recursively as follows. Pick the median of the sorted array A. This is just O(1) time as median is the n/2th element in the sorted array. Now compare the median of A, call is a∗ with median of B, b∗. We have two cases. + - a∗ < b∗ : In this case, the elements in B[n/2 ···n] are also greater than a . So the median cannot lie in either A[1 · · · n/2 ] or B[n/2 · · · n]. So we can just throw these away and recursively + - a∗ > b∗ : In this case, we can still throw away B[1··· n/2] and also A[ n/ · · · n] and solve a smaller subproblem recursively. + In either case, our subproblem size reduces by a factor of half and we spend only constant time to compare the medians of A and B. So the recurrence relation would be T (n) = T (n/2) + O(1) which has a solution T (n) = O(log n). +divide and conquer + +- 如果X[n/2] == Y[n/2],则找到,return +- 如果X[n/2] < Y[n/2],找X[n/2+1….n]和Y[1,2…n/2]之间 +- 否则找X[1..n/2]和Y[n/2…n] + + + + +但是实际上不同,这里需要考虑的问题更多: + +- 两个数组长度不一样 +- 并不是只找一个median,如果median有两个,需要算平均 + +思路 + +把它转化成经典的findKth问题 + +参考: + + +首先转成求A和B数组中第k小的数的问题, 然后用k/2在A和B中分别找。 + + +比如k = 6, 分别看A和B中的第3个数, 已知 A1 < A2 < A3 < A4 < A5... 和 B1 < B2 < B3 < B4 < B5..., 如果A3 <= B3, 那么第6小的数肯定不会是A1, A2, A3, 因为最多有两个数小于A1, 三个数小于A2, 四个数小于A3。 关键点是从 k/2 开始来找。 + + + +B3至少大于5个数, 所以第6小的数有可能是B1 (A1 < A2 < A3 < A4 < A5 < B1), 有可能是B2 (A1 < A2 < A3 < B1 < A4 < B2), 有可能是B3 (A1 < A2 < A3 < B1 < B2 < B3)。那就可以排除掉A1, A2, A3, 转成求A4, A5, ... B1, B2, B3, ...这些数中第3小的数的问题, k就被减半了。每次都假设A的元素个数少, pa = min(k/2, lenA)的结果可能导致k == 1或A空, 这两种情况都是终止条件。 + + +发问,为什么要从k/2开始寻找,依旧k = 6, 我可以比较A1 和 B5的关系么,可以这样做,但是明显的问题出现在如果A1 > B5,那么这个第6小的数应该存在于B6和A1中。 + +如果A1 < B5,这个时间可能性就很多了,比如A1 < A2 < A3 < A4 < B1 < B2,各种可能,无法排除元素,所以还是要从k/2开始寻找。 + +这个跟习题算法的区别是每次扔的东西明显少一些,但是k也在不断变小。 + + +``` +class Solution(object): + def findMedianSortedArrays(self, nums1, nums2): + """ + :type nums1: List[int] + :type nums2: List[int] + :rtype: float + """ + n = len(nums1) + len(nums2) + if n % 2 == 1: + return self.findKth(nums1, nums2, n / 2 + 1) + else: + smaller = self.findKth(nums1, nums2, n / 2) + bigger = self.findKth(nums1, nums2, n / 2 + 1) + return (smaller + bigger) / 2.0 + + + def findKth(self, A, B, k): + if len(A) == 0: + return B[k-1] + if len(B) == 0: + return A[k-1] + if k == 1 : + return min(A[0],B[0]) + + + a = A[ k / 2 - 1 ] if len(A) >= k / 2 else None + b = B[ k / 2 - 1 ] if len(B) >= k / 2 else None + + if b is None or (a is not None and a < b): + return self.findKth(A[k/2:], B, k - k/2) + return self.findKth(A, B[k/2:],k - k/2) + +``` + +这个findKth的算法单独抽出来也是题目。 + +给定两个已经排序好的数组,求第k大的,算法有O(m+n).类似merge sort的原理。否则利用的就是之上提到的,利用已经有序的原理,然后每次丢。 + +之所以这里还有一个丢弃条件是b is None 丢A的一部分,是因为B的数组长度是有限的,这个时候很明显丢A的k/2是不影响的,因为无论B[-1]是如何大或者小,因为整个B的长度没有达到k/2,所以丢掉的这部分最大的A[k/2-1]也不可能是第k个,因为即使整个B都比A[k/2-1],拼起来也不能使A[k/2-1]第k大,所以可以放心丢弃。 + + +这里是两个sorted list/array findKth,想到了类似的题目,如果给一个n个linked list,findKth,能想到的办法也只能是用heap吧,类似merge k sorted lists. + + +再写一个O(m+n)类似merge sort的也可以AC的代码 + +``` +class Solution(object): + def findMedianSortedArrays(self, nums1, nums2): + """ + :type nums1: List[int] + :type nums2: List[int] + :rtype: float + """ + def findKth(A, pa, B, pb, k): + res = 0 + m = 0 + while pa < len(A) and pb < len(B) and m < k: + if A[pa] < B[pb]: + res = A[pa] + m += 1 + pa += 1 + else: + res = B[pb] + m += 1 + pb += 1 + + while pa < len(A) and m < k: + res = A[pa] + pa += 1 + m += 1 + + + while pb < len(B) and m < k: + res = B[pb] + pb += 1 + m += 1 + return res + + n = len(nums1) + len(nums2) + if n % 2 == 1: + return findKth(nums1,0, nums2,0, n / 2 + 1) + else: + smaller = findKth(nums1,0, nums2,0, n / 2) + bigger = findKth(nums1,0, nums2,0, n / 2 + 1) + return (smaller + bigger) / 2.0 + +``` \ No newline at end of file diff --git a/005._longest_palindromic_substring.md b/005._longest_palindromic_substring.md new file mode 100644 index 000000000..b09aad051 --- /dev/null +++ b/005._longest_palindromic_substring.md @@ -0,0 +1,193 @@ +###5. Longest Palindromic Substring + + +题目: + + + +难度: + +Medium + + + +思路0: + +暴力解法绝对不行 + + +思路1: + +所以一个好的想法是 s 和 reverse(s) 共有的最长的 substring就是longest palindromic substring -> 问题转成求Longest common substring problem +参见[wikipedia](https://en.wikipedia.org/wiki/Longest_common_substring_problem) +,典型动归 + +LCSuff(S1...p, T1...q) = LCS(S1...p1, T1...q-1) if S[p] = T[q] else 0 + + + +伪码也有了,代码也有: + + + + +这样也超时? + + +``` +class Solution(object): + def longestPalindrome(self, s): + """ + :type s: str + :rtype: str + """ + def lcs(s1, s2): + m = [[0] * (1 + len(s2)) for i in xrange(1 + len(s1))] + longest, x_longest = 0, 0 + for x in xrange(1, 1 + len(s1)): + for y in xrange(1, 1 + len(s2)): + if s1[x - 1] == s2[y - 1]: + m[x][y] = m[x - 1][y - 1] + 1 + if m[x][y] > longest: + longest = m[x][y] + x_longest = x + else: + m[x][y] = 0 + return s1[x_longest - longest: x_longest] + + return lcs(s, s[::-1]) +``` + +因为以为这样s[::-1]已经很快了. + + +这个方法是buggy的,看字符串`abcxgcba`,它reverse之后是`abcgxcba`,它们有公共字符串,但是这里面没有回文,修复方式是: + +> we check if the substring’s indices are the same as the reversed substring’s original indices. If it is, then we attempt to update the longest palindrome found so far; if not, we skip this and find the next candidate. + +我觉得的修复方式这样么: + +``` +原本 翻转 +ABXYBA ABYXBA + +求出来的substring indices是 0:2 但是这个s1[0:2] 和 s2[0:2]一样,所以不行 +同理common substring indices还是s[4:6] 和s2[4:6]一样,不行 + +而比如ABAD和 DABA + +substring indice 一个是0:3, 一个是1:4,这样就没问题 + + +``` + + + +思路2: + + + +> 依次把每一个字符当做回文字符串的中间字符,找到以该字符为中间字符的回文串的最大长度。分别对奇偶的情况进行讨论,接下来的关键就是对边界的把握,确保下标不要越界。当子串已经包含首字符或最后一个字符且此时还是回文串的时候,下标分别会向两边多移一位,需要补回来。 + +参考 + + +``` +class Solution(object): + def longestPalindrome(self, s): + """ + :type s: str + :rtype: str + """ + n = len(s) + + # empty or one char + if n < 2: + return s + + # left index of the target substring + l = 0 + # right index of the target substring + r = 0 + # length of the longest palindromic substring for now + m = 0 + # length of the current substring + c = 0 + + # Whether the substring contains the first character or last character and is palindromic + b = True + for i in range(n): + # Odd situation + for j in range(min(n-i,i+1)): + if s[i-j] != s [i+j]: + b = False + break + else: + c = 2 * j + 1 + + if c > m : + l = i - j + 1 - b + r = i + j + b + m = c + b = True + + # Even situation + for j in range(min(n - i - 1, i + 1)): + if (s[i - j] != s[i + j + 1]): + b = False + break + else: + c = 2 * j + 2 + if (c > m): + l = i - j + 1 - b + r = i + j + 1 + b + m = c + b = True + return s[l:r] +``` + +以上是参考版本,自己写的版本: + + +``` +class Solution(object): + def longestPalindrome(self, s): + """ + :type s: str + :rtype: str + """ + n = len(s) + + m,l,r = 0,0,0 + + for i in range(n): + # odd case + for j in range(min(i+1,n-i)): + if s[i-j] != s[i+j]: + break + if 2*j + 1 > m : + m = 2 * j + 1 + l = i-j + r = i+j + + + if i+1 < n and s[i] == s[i+1]: + for j in range(min(i+1,n-i-1)): + if s[i-j] != s[i+j+1]: + break + if 2 * j + 2 > m : + m = 2*j +2 + l = i-j + r = i+j+1 + + + return s[l:r+1] +``` + + + + +思路3: + +在查看wikipedia,有一个[Longest palindromic substring](https://en.wikipedia.org/wiki/Longest_palindromic_substring), 有一个Manacher算法,to be 学 + diff --git a/008._string_to_integer_(atoi).md b/008._string_to_integer_(atoi).md new file mode 100644 index 000000000..c8a9ce4fd --- /dev/null +++ b/008._string_to_integer_(atoi).md @@ -0,0 +1,47 @@ +###8. String to Integer (atoi) + +题目: + + + +难度: +Easy + + +需要考虑比较多的边界条件&特殊情况 + + +``` +class Solution(object): + def myAtoi(self, str): + """ + :type str: str + :rtype: int + """ + str = str.strip() + strNum = 0 + if len(str) == 0: + return strNum + + positive = True + if str[0] == '+' or str[0] == '-': + if str[0] == '-': + positive = False + str = str[1:] + + for char in str: + if char >='0' and char <='9': + strNum = strNum * 10 + ord(char) - ord('0') + if char < '0' or char > '9': + break + + if strNum > 2147483647: + if positive == False: + return -2147483648 + else: + return 2147483647 + if not positive: + strNum = 0 - strNum + return strNum + +``` \ No newline at end of file diff --git a/010._regular_expression_matching.md b/010._regular_expression_matching.md new file mode 100644 index 000000000..a2ef0a109 --- /dev/null +++ b/010._regular_expression_matching.md @@ -0,0 +1,141 @@ +###010. Regular Expression Matching + +题目: + + + +难度: + +Hard + + + + +先尝试暴力解法,难点就在 * 身上, * 不会单独出现,它一定是和前面一个字母或"."配成一对。看成一对后"X*",它的性质就是:要不匹配0个,要不匹配连续的“X”.所以尝试暴力解法的时候一个trick是从后往前匹配. + + + +暴力解法居然也能AC? + + +``` +class Solution(object): + def isMatch(self, s, p): + """ + :type s: str + :type p: str + :rtype: bool + """ + FRONT = -1 + def helper(s, i, p, j): + if(j == FRONT): + return (i == FRONT) + if(i == FRONT): + if p[j] != '*': + return False + return helper(s,i,p,j-2) + if(p[j] == '*'): + if(p[j-1] == '.' or p[j-1] == s[i]): + if helper(s, i-1, p, j): + return True + return helper(s,i,p,j-2) + if(p[j] == '.' or p[j] == s[i]): + return helper(s,i-1,p,j-1) + return False + + return helper(s, len(s)-1, p, len(p)-1) + +``` + + +是这样来分情况看得: + +- 如果s[i] = p[j] 或者 p[j]= . : 往前匹配一位 +- 如果p[j] = ' * ', 检查一下,如果这个时候p[j-1] = . 或者p[j-1] = s[i] ,那么就往前匹配,如果这样能匹配过,就return True, 否者我们忽略 ' X* ',这里注意里面的递推关系 +- 再处理一下边界状况: + - s已经匹配完了, 如果此时p还有,那么如果剩下的是 X* 这种可以过,所以检查 + - p匹配完毕,如果s还有那么报错 + + + +dp优化,感觉和edit distance很像。 DP优化待代码化,感觉学DP的一个重点除了递归学好以外,另一点是一定要会画表格。 + + +画一个表格来看一下状况 + +``` + c * a * b + 0 1 2 3 4 5 + 0 1 0 1 0 1 0 +a 1 0 0 0 1 1 0 +a 2 0 0 0 0 1 0 +b 3 0 0 0 0 0 1 + +``` + +这里有几个取巧/容易出问题的敌方,这里画的表用的是1-based string。一上来,做的事包括: + +- 初始化,空字符匹配:dp[0][0] =1 +- 第一行,c* 可以匹配空字符,c* a* 可以匹配空字符,p[j-1] != s[i],匹配空字符 +- 然后进入第二行再来看,实际上我们可以看到,如果没有碰到 * 匹配还是很朴素的,但是碰到 * : + - 1这个匹配可以从左侧传来,dp[i][j] = dp[i][j-1],that is 匹配 1个 + - 1 也可以有上方传来,这种情况是p[j-1] = s[i],匹配多个 dp[i][j] = dp[i-1][j] + - 1 这个匹配也可以从间隔一个的左侧传来,that is也可以有个性的匹配0个,如同匹配空字符一样dp[i][j] = dp[i][j-2],但是注意匹配0个实际上有两种状况,如果p[j-1]!=s[i],强制匹配0个,即使p[j-1] == s[i],我们也可以傲娇的用它来匹配0个。 + +再代码化一点: + +- s[i] == p[j] 或者 p[j] == '.' : dp[i][j] = dp[i-1][j-1] +- p[j] == '*': 然后分几种情况 + - p[j-1] != s[i] : dp[i][j] = dp[i][j-2] 匹配0个的状况 + - p[j-1] == s[i] or p[i-1] == '.': + - dp[i][j] = dp[i-1][j] 匹配多个s[i] + - dp[i][j] = dp[i][j-1] 匹配一个 + - dp[i][j] = dp[i][j-2] 匹配0个 + +AC代码,注意一下,因为上表为了表达方便,用的是1-based string系统,实际写代码的时候我们心里还是清楚这个string还是从0开始的,不过也可以尝试往前面添东西来方便。 + + +AC代码 + +``` +class Solution(object): + def isMatch(self, s, p): + """ + :type s: str + :type p: str + :rtype: bool + """ + m, n = len(s), len(p) + dp = [ [0 for i in range(n+1)] for j in range(m+1)] + + dp[0][0] = 1 + + # init the first line + for i in range(2,n+1): + if p[i-1] == '*': + dp[0][i] = dp[0][i-2] + + for i in range(1,m+1): + for j in range(1,n+1): + if p[j-1] == '*': + if p[j-2] != s[i-1] and p[j-2] != '.': + dp[i][j] = dp[i][j-2] + elif p[j-2] == s[i-1] or p[j-2] == '.': + dp[i][j] = dp[i-1][j] or dp[i][j-1] or dp[i][j-2] + + elif s[i-1] == p[j-1] or p[j-1] == '.': + dp[i][j] = dp[i-1][j-1] + + return dp[m][n] == 1 + +``` + + + +参考: + + + + + +发现自己喜欢这道题目 \ No newline at end of file diff --git a/011._container_with_most_water.md b/011._container_with_most_water.md new file mode 100644 index 000000000..ef6efbc71 --- /dev/null +++ b/011._container_with_most_water.md @@ -0,0 +1,109 @@ +###11. Container With Most Water + + + +题目: + + + +难度: +Medium + +思路: + + +首先理解花了我一点时间,因为一开始写出来,给了一个例子: + +``` + +height = [3,2,1,3] +解是 9 + + + | | + | | | + | | | | + 1 2 3 4 + + 一开始我的理解走偏的地方是这个9是如何得到的,因为根据最短板原理,明显不可能得到9啊,后来发现是·Find two lines, which together with x-axis forms a container, such that the container contains the most water. +``` + +所以代码写起来就简单了,AC无能,超时,时间复杂度O(N^2) + + +``` +class Solution(object): + def maxArea(self, height): + """ + :type height: List[int] + :rtype: int + """ + n = len(height) + mostWater = 0 + + for i in range(n-1): + for j in range(i,n): + lowest = min(height[i], height[j]) + water = (j - i) * lowest + if water > mostWater: + mostWater = water + return mostWater + +``` + +题目给的tag是 two pointer,所以上边的策略肯定可以改进,改进的地方就不能是这个一次走一边,而可能是两边都要走。 + + + +参考 + + +思路: + +由于ai和aj (i=i, j'<=j) >= S(i,j),由于j'-i' <= j-i,必然要有min(ai',aj')>=min(ai,aj)才行。同样可以采用头尾双指针向中间移动: + +当a(left) < a(right)时,对任何j S(left, j a(right)时,需要左移right`。`而当a(left) = a(right)时,需要同时移动left和right。` + +思路整理: +left = 0, right = n-1 +(1) a[left] < a[right], left++ +(2) a[left] > a[right], right-- +(3) a[left] = a[right], left++, right-- +终止条件:left >= right + +这个证明大快人心 + + +这样写也能过: + + +``` +class Solution(object): + def maxArea(self, height): + """ + :type height: List[int] + :rtype: int + """ + n = len(height) + left, right = 0, n - 1 + + mostWater = 0 + while left < right: + water = min(height[left], height[right]) * (right - left) + mostWater = max(water, mostWater) + + if height[left] < height[right]: + left += 1 + else: + right -= 1 + + + return mostWater +``` \ No newline at end of file diff --git a/012. Integer to Roman.md b/012. Integer to Roman.md new file mode 100644 index 000000000..617f287ea --- /dev/null +++ b/012. Integer to Roman.md @@ -0,0 +1,89 @@ +###12. Integer to Roman + + +题目: + + + +难度: +Medium + +思路: + +首先我学习了一下罗马字母是如何表示的。然后感慨,这个阿拉伯数字是多么好的发明 + + + +上图 + + + +基于的是这些个Symbol: + +``` +1 5 10 50 100 500 1000 +I V X L C D M +``` + +组合是这种方式 + +``` +1 2 3 4 5 6 7 8 9 +I II III IV V VI VII VIII IX +10 20 30 40 50 60 70 80 90 +X XX XXX XL L LX LXX LXXX XC +100 200 300 400 500 600 700 800 900 +C CC CCC CD D DC DCC DCCC CM +``` + + + +可以看出来,这个进位或者组合是4和9的地方进位的,比如4是加上了I然后到V,9是加上了I到X。所以题目要限制数字在1-3999之间。 + +然后就去谷歌罗马数字最大能表示多少,看到了一个更好的总结,不过是可以更大的,数字上面加bar. + + + +via + +下面是几个通常的规则来构成罗马数字: + +- 大部分时候用字符相叠加来表示数字。I是1, II是2, III是3。VI是6(挨个看来,是“5 和 1”的组合),VII是7,VIII是8。 +- 含有10的字符(I,X,C和M)最多可以重复出现三个。为了表示4,必须用同一位数的下一个更大的数字5来减去一。不能用IIII来表示4,而应该是IV(意思是比5小1)。40写做XL(比50小10),41写做XLI,42写做XLII,43写做XLIII,44写做XLIV(比50小10并且比5小1)。 +- 有些时候表示方法恰恰相反。为了表示一个中间的数字,需要从一个最终的值来减。比如:9需要从10来减:8是VIII,但9确是IX(比10小1),并不是VIII(I字符不能重复4次)。90是XC,900是CM。 +- 表示5的字符不能在一个数字中重复出现。10只能用X表示,不能用VV表示。100只能用C表示,而不是LL。 +- 罗马数字是从左到右来计算,因此字符的顺序非常重要。DC表示600,而CD完全是另一个数字400(比500小100)。CI是101,IC不是一个罗马数字(因为你不能从100减1,你只能写成XCIX,表示比100小10,且比10小1)。 + +**规则总结:  左减右加    加减时位数和被加减数相差位数最大为一(两位数可加减一位数 三位数只能加减两位数)  从左向右计数** + + + +所以想着4,9这块需要特殊处理一下,但是看到了一个很棒的[算法](https://gist.github.com/imilu/00f32c61e50b7ca296f91e9d96d8e976) + + + +AC代码 + +``` + +class Solution(object): + def intToRoman(self, num): + """ + :type num: int + :rtype: str + """ + lookup = {'M':1000, 'CM':900, 'D':500, 'CD':400, 'C':100, 'XC':90, 'L':50, 'XL':40, 'X':10, 'IX':9, 'V':5, 'IV':4, 'I':1} + romanSt = '' + + for symbol, val in sorted(lookup.items(), key = lambda t: t[1], reverse = True): + while num >= val: + romanSt += symbol + num -= val + return romanSt +``` + + + + + +因为dict本身是无序的,这里做了一个排序的操作,否则可能会出现IIII这种状况。 \ No newline at end of file diff --git a/013.Roman to Integer.md b/013.Roman to Integer.md new file mode 100644 index 000000000..f8ddb8667 --- /dev/null +++ b/013.Roman to Integer.md @@ -0,0 +1,80 @@ +### 13.Roman to Integer + + + +题目: + + +难度: +Easy + +思路: + +integer to Roman 是 Medium,这个roman to integer是easy + +所以用的傻方法,特殊处理4,9,40,90,400,900,再加上剩下的数字 + + + +AC代码 + +``` +class Solution(object): + def romanToInt(self, s): + """ + :type s: str + :rtype: int + """ + lookup1 = {'CM':900,'CD':400,'XC':90,'XL':40,'IX':9,'IV':4} + lookup2 = {'M':1000, 'D':500, 'C':100, 'L':50, 'X':10, 'V':5, 'I':1} + + num = 0 + for i in lookup1.keys(): + if i in s: + num += lookup1[i] + s = s.replace(i,'') + + for char in s: + num += lookup2[char] + + return num +``` + + + + + +然后可以有更好的方法: + +> 从前往后扫描,用一个临时变量记录分段数字。 +> +> 如果当前比前一个大,说明这一段的值应当是这个值减去上一个值。比如IV = 5-1 =4; 否则,将当前值加入到结果中,然后开始下一段记录,比如VI = 5 + 1, II = 1 +1 + + + +所以这也就是罗马数字的基础,感觉?这样才不会读串? + + + +AC代码 + +``` +class Solution(object): + def romanToInt(self, s): + """ + :type s: str + :rtype: int + """ + lookup = {'M':1000, 'D':500, 'C':100, 'L':50, 'X':10, 'V':5, 'I':1} + + num = 0 + + for i in range(len(s)): + if i > 0 and lookup[s[i]] > lookup[s[i-1]]: + num += lookup[s[i]] - 2 * lookup[s[i-1]] + else: + num += lookup[s[i]] + + return num +``` + diff --git a/014._longest_common_prefix.md b/014._longest_common_prefix.md new file mode 100644 index 000000000..14e6247dd --- /dev/null +++ b/014._longest_common_prefix.md @@ -0,0 +1,76 @@ +###14. Longest Common Prefix + + +题目: + + + +难度: + +Easy + + +思路: + +找出最短的string,然后一个一个对比,缺点是时间复杂度会比较高,AC代码,这代码优雅程度也是负数啊 + +``` + +class Solution(object): + def longestCommonPrefix(self, strs): + """ + :type strs: List[str] + :rtype: str + """ + if strs == []: return '' + + shortStr = '' + shortLen = float('inf') + + for s in strs: + if len(s) < shortLen: + shortLen = len(s) + shortStr = s + + # print shortStr, shortLen + + n = len(strs) + i = 0 + same = True + while i < shortLen and same: + j = 0 + while j < n : + if strs[j][i] != shortStr[i]: + same = False + break + j += 1 + if same: + i += 1 + else: + break + return shortStr[:i] +``` + + +看一下别人写的优雅程度 佳 + + +``` +class Solution(object): + def longestCommonPrefix(self, strs): + """ + :type strs: List[str] + :rtype: str + """ + if not strs: + return "" + longest = strs[0] + for i in range(len(strs[0])): + for str in strs: + if len(str) <= i or strs[0][i] != str[i]: + return strs[0][:i] + return strs[0] + +``` + +这个题解锁之后可以看到各种各样的解法,to be 读 diff --git a/015._3sum.md b/015._3sum.md new file mode 100644 index 000000000..c7ac15c01 --- /dev/null +++ b/015._3sum.md @@ -0,0 +1,104 @@ +###15. 3Sum + +题目: + + + +难度: + +Medium + + +第一想法,先把nums排序,用三个loop,无法AC + +``` +class Solution(object): + def threeSum(self, nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + n = len(nums) + res = [] + nums.sort() + for i in range(n): + for j in range(i,n): + for k in range(j,n): + if nums[i] + nums[j] + nums[k] == 0 and j != i and k != j and k != i: + curRes = [nums[i],nums[j],nums[k]] + if curRes not in res: + res.append(curRes) + + return res +``` + + +然后查了一下2sum,用2sum的花样,因为要排除重复以及输出是按照从小到大的输出: + + +``` +class Solution(object): + def threeSum(self, nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + def twoSum(nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: List[int] + """ + lookup = {} + for num in nums: + if target - num in lookup: + if (-target ,target - num, num) not in res: + res.append((-target ,target - num, num)) + lookup[num] = target - num + + n = len(nums) + nums.sort() + res = [] + for i in range(n): + twoSum(nums[i+1:], 0-nums[i]) + return [list(i) for i in res] +``` + + +谷歌看别人的代码,思路非常清晰的,运行起来比直接调用 Two Sum快. + +清晰的思路: + +- 排序 +- 固定左边,如果左边重复,继续 +- 左右弄边界,去重,针对不同的左右边界情况处理 + + +``` +class Solution(object): + def threeSum(self, nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + n = len(nums) + nums.sort() + ans = [] + for i in range(n): + if i > 0 and nums[i] == nums[i-1] : continue + l, r = i+1, n -1 + while l < r: + temp = nums[i] + nums[l] + nums[r] + if temp == 0: + ans.append([nums[i],nums[l],nums[r]]) + l += 1 + r -= 1 + while l < r and nums[l] == nums[l-1]: l += 1 + while l < r and nums[r] == nums[r+1]: r -= 1 + elif temp > 0: + r -= 1 + else: + l += 1 + return ans +``` + diff --git a/016._3sum_closest.md b/016._3sum_closest.md new file mode 100644 index 000000000..75304fb4c --- /dev/null +++ b/016._3sum_closest.md @@ -0,0 +1,52 @@ +###16. 3Sum Closest + +题目: + + + +难度: + +Medium + + +思路: +跟3 Sum一样,固定一个元素 + +用两个指针来循环 + + +``` + +class Solution(object): + def threeSumClosest(self, nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: int + """ + n = len(nums) + nums.sort() + ans = None + diff = float('inf') # infinity + for i in range(n): + if i > 0 and nums[i] == nums[i-1] : continue + l, r = i+1, n -1 + while l < r: + temp = nums[i] + nums[l] + nums[r] + if temp == target: + return target + if temp < target: + l += 1 + if abs(temp - target) < diff: + diff = abs(temp - target) + ans = temp + while l < r and nums[l] == nums[l-1]: l += 1 + elif temp > target : + r -= 1 + if abs(temp - target) < diff: + diff = abs(temp - target) + ans = temp + while l < r and nums[r] == nums[r+1]: r -= 1 + return ans + +``` \ No newline at end of file diff --git a/017._letter_combinations_of_a_phone_number.md b/017._letter_combinations_of_a_phone_number.md new file mode 100644 index 000000000..5f61a7e96 --- /dev/null +++ b/017._letter_combinations_of_a_phone_number.md @@ -0,0 +1,55 @@ +###17. Letter Combinations of a Phone Number + +题目: + + + + +难度: + +Medium + + +思路: + + - hash table一个,用来对应digit -> letter + - s用来记录结果,每次从digits里面去一个,然后寻找其可能的char,加到s中,digits长度减小 + - digits长度为0时候,把它加入结果 + + + +``` +class Solution(object): + def letterCombinations(self, digits): + """ + :type digits: str + :rtype: List[str] + """ + if digits == "": + return [] + + self.res = [] + self.singleResult('',digits) + return self.res + + def singleResult(self, s, digits): + if len(digits) == 0: + self.res.append(s) + else: + mapx = {'2':['a','b','c'], + '3':['d','e','f'], + '4':['g','h','i'], + '5':['j','k','l'], + '6':['m','n','o'], + '7':['p','q','r','s'], + '8':['t','u','v'], + '9':['w','x','y','z']} + + curDigit = digits[0] + for alpha in mapx[curDigit]: + self.singleResult(s + alpha, digits[1:]) + + +``` + + diff --git a/018._4sum.md b/018._4sum.md new file mode 100644 index 000000000..10a3c4dff --- /dev/null +++ b/018._4sum.md @@ -0,0 +1,94 @@ +###18. 4Sum + +题目: + + + +难度: + +Medium + + +思路: + +用3sum改 + +固定两个数,活动别的 + + +``` +class Solution(object): + def fourSum(self, nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: List[List[int]] + """ + n = len(nums) + nums.sort() + ans = [] + for i in range(n): + for j in range(i+1,n): + l, r = j+1, n-1 + while l < r: + temp = nums[i] + nums[j] + nums[l] + nums[r] + if temp == target: + # print nums[i],nums[j],nums[l],nums[r] + if [nums[i],nums[j],nums[l],nums[r]] not in ans: + ans.append([nums[i],nums[j],nums[l],nums[r]]) + l += 1 + r -= 1 + elif temp > target: + r -= 1 + else: + l+=1 + return ans +``` + +然后这里如果要continue则要这么写 + + +``` +class Solution(object): + def fourSum(self, nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: List[List[int]] + """ + n = len(nums) + nums.sort() + ans = [] + for i in range(n): + if i > 0 and nums[i] == nums[i-1]: continue + for j in range(i+1,n): + if j > i+1 and nums[j] == nums[j-1]: continue + l, r = j+1, n-1 + while l < r: + temp = nums[i] + nums[j] + nums[l] + nums[r] + if temp == target: + # print nums[i],nums[j],nums[l],nums[r] + # if [nums[i],nums[j],nums[l],nums[r]] not in ans: + ans.append([nums[i],nums[j],nums[l],nums[r]]) + l += 1 + r -= 1 + while l < r and nums[l] == nums[l-1]: l += 1 + while l < r and nums[r] == nums[r+1]: r -= 1 + elif temp > target: + r -= 1 + else: + l+=1 + return ans + +``` + +可以用一些判断来加速,比如枚举第一个数的时候 + +- nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target: break +这是当前能凑齐的最小的4个数,比target后面都不用做了 +- nums[i] + nums[n – 3] + nums[n – 2] + nums[n – 1] < target: continue +这是当前凑齐的最大的4个数,比target小,说明第一个数不够大 + +参考 + + \ No newline at end of file diff --git a/019._remove_nth_node_from_end_of_list.md b/019._remove_nth_node_from_end_of_list.md new file mode 100644 index 000000000..eca0f9ac5 --- /dev/null +++ b/019._remove_nth_node_from_end_of_list.md @@ -0,0 +1,41 @@ +###19. Remove Nth Node From End of List + +题目: + + + + +难度: Easy + + +AC击败了95.80%的Python用户,技巧 dummy head 和双指针。 + + +``` +class Solution(object): + def removeNthFromEnd(self, head, n): + """ + :type head: ListNode + :type n: int + :rtype: ListNode + """ + dummy = ListNode(-1) + dummy.next = head + p = dummy + q = dummy + + for i in range(n): + q = q.next + + while q.next: + p = p.next + q = q.next + + p.next = p.next.next + return dummy.next + +``` + + + + diff --git a/020._valid_parentheses.md b/020._valid_parentheses.md new file mode 100644 index 000000000..3e41265df --- /dev/null +++ b/020._valid_parentheses.md @@ -0,0 +1,53 @@ +###20. Valid Parentheses + +题目: + + + + +难度: + +Easy + + +虽然知道肯定是用stack来解决,但是我是看了hint才自己解答的,因为可能想复杂了。 + +因为一共只有三种状况"(" -> ")", "[" -> "]", "{" -> "}". + +一遇到左括号就入栈,右括号出栈,这样来寻找对应 + +需要检查几件事: + +- 右括号时stack里还有没有东西 +- 出stack的是否对应 +- 最终stack是否为空 + + + +``` +class Solution(object): + def isValid(self, s): + """ + :type s: str + :rtype: bool + """ + leftP = "([{" + rightP = ")]}" + + stack = [] + for char in s: + if char in leftP: + stack.append(char) + elif char in rightP: + if stack == []: + return False + item = stack.pop() + if char == "]" and item != "[": + return False + elif char == ")" and item != "(": + return False + elif char == "}" and item != "{": + return False + return stack == [] +``` + diff --git a/021._merge_two_sorted_lists.md b/021._merge_two_sorted_lists.md new file mode 100644 index 000000000..79619e9d7 --- /dev/null +++ b/021._merge_two_sorted_lists.md @@ -0,0 +1,48 @@ +###21. Merge Two Sorted Lists + +题目: + + + + +难度: Easy + + +同样适用dummy head + +``` +class Solution(object): + def mergeTwoLists(self, l1, l2): + """ + :type l1: ListNode + :type l2: ListNode + :rtype: ListNode + """ + if l1 == None: + return l2 + if l2 == None: + return l1 + + dummy = ListNode(-1) + cur = dummy + + while l1 and l2: + if l1.val < l2.val: + cur.next = l1 + l1 = l1.next + else: + cur.next = l2 + l2 = l2.next + cur = cur.next + + if l1: + cur.next = l1 + else: + cur.next = l2 + return dummy.next + +``` + + + + diff --git a/022._generate_parentheses.md b/022._generate_parentheses.md new file mode 100644 index 000000000..17bac762b --- /dev/null +++ b/022._generate_parentheses.md @@ -0,0 +1,88 @@ +###22. Generate Parentheses + +题目: + + + +难度: + +Medium + + + + + +``` +class Solution(object): + def generateParenthesis(self,n): + """ + :type n: int + :rtype: List[str] + """ + self.res = [] + self.singleStr('', 0, 0, n) + return self.res + + def singleStr(self, s, left, right, n): + if left == n and right == n: + self.res.append(s) + if left < n: + self.singleStr(s + '(',left + 1, right,n) + if right < left: + self.singleStr(s + ')',left, right + 1, n) + +``` + + +非常牛逼的讲解,需要这样的人来给我们讲算法 + +####以Generate Parentheses为例,backtrack的题到底该怎么去思考? + + +所谓Backtracking都是这样的思路:在当前局面下,你有若干种选择。那么尝试每一种选择。如果已经发现某种选择肯定不行(因为违反了某些限定条件),就返回;如果某种选择试到最后发现是正确解,就将其加入解集 + +所以你思考递归题时,只要明确三点就行:选择 (Options),限制 (Restraints),结束条件 (Termination)。即“ORT原则”(这个是我自己编的) + + + + +对于这道题,在任何时刻,你都有两种选择: +1. 加左括号。 +2. 加右括号。 + +同时有以下限制: +1. 如果左括号已经用完了,则不能再加左括号了。 +2. 如果已经出现的右括号和左括号一样多,则不能再加右括号了。因为那样的话新加入的右括号一定无法匹配。 + +结束条件是: +左右括号都已经用完。 + +结束后的正确性: +左右括号用完以后,一定是正确解。因为1. 左右括号一样多,2. 每个右括号都一定有与之配对的左括号。因此一旦结束就可以加入解集(有时也可能出现结束以后不一定是正确解的情况,这时要多一步判断)。 + +递归函数传入参数: +限制和结束条件中有“用完”和“一样多”字样,因此你需要知道左右括号的数目。 +当然你还需要知道当前局面sublist和解集res。 + +因此,把上面的思路拼起来就是代码: + + if (左右括号都已用完) { + 加入解集,返回 + } + //否则开始试各种选择 + if (还有左括号可以用) { + 加一个左括号,继续递归 + } + if (右括号小于左括号) { + 加一个右括号,继续递归 + } + + + +你帖的那段代码逻辑中加了一条限制:“3. 是否还有右括号剩余。如有才加右括号”。这是合理的。不过对于这道题,如果满足限制1、2时,3一定自动满足,所以可以不判断3。 + +这题其实是最好的backtracking初学练习之一,因为ORT三者都非常简单明显。你不妨按上述思路再梳理一遍,还有问题的话再说。 + + + +以上文字来自 1point3arces的牛人解答 \ No newline at end of file diff --git a/023._merge_k_sorted_lists.md b/023._merge_k_sorted_lists.md new file mode 100644 index 000000000..10fd0a3b8 --- /dev/null +++ b/023._merge_k_sorted_lists.md @@ -0,0 +1,49 @@ +###23. Merge k Sorted Lists + + + +题目: + + + +难度: +Hard + +思路: + +看到思路有heap,similar question有ugly number|| -》 这个是用heapq来解决的 + +那么就用heap吧? heapsort + +最简单的做法是只要每个list里面还有node,就把他们扔到minheap里面去,然后再把minheap pop,一个一个node连起来,听起来时间复杂度和空间复杂度都蛮高的。 +直接merge必然是不好的,因为没有利用有序这个点,应该做的是每次取来一个,然后再把应该的下一个放入 + +写到这里瞬间明白和ugly number ii像的点了,甚至感觉跟find in sorted matrix ii也像 + +``` +class Solution(object): + def mergeKLists(self, lists): + """ + :type lists: List[ListNode] + :rtype: ListNode + """ + import heapq + h = [] + + for listhead in lists: + if listhead: + heapq.heappush(h, (listhead.val,listhead)) + + cur = ListNode(-1) + dummy = cur + + while h: + smallestNode = heapq.heappop(h)[1] + cur.next = smallestNode + cur = cur.next + if smallestNode.next: + heapq.heappush(h, (smallestNode.next.val,smallestNode.next)) + return dummy.next +``` + +当然还像merge two sorted list \ No newline at end of file diff --git a/024._swap_nodes_in_pairs.md b/024._swap_nodes_in_pairs.md new file mode 100644 index 000000000..907744af1 --- /dev/null +++ b/024._swap_nodes_in_pairs.md @@ -0,0 +1,35 @@ +###24. Swap Nodes in Pairs + +题目: + + + +难度 : Easy + +看了hint,用loop做,每个node关系要弄清楚 + + +``` + +class Solution(object): + def swapPairs(self, head): + """ + :type head: ListNode + :rtype: ListNode + """ + if head == None or head.next == None: + return head + + dummy = ListNode(-1) + dummy.next = head + + cur = dummy + + while cur.next and cur.next.next: + next_one, next_two, next_three = cur.next, cur.next.next, cur.next.next.next + cur.next = next_two + next_two.next = next_one + next_one.next = next_three + cur = next_one + return dummy.next +``` \ No newline at end of file diff --git a/028._implement_strstr().md b/028._implement_strstr().md new file mode 100644 index 000000000..d1470c30b --- /dev/null +++ b/028._implement_strstr().md @@ -0,0 +1,36 @@ +###28. Implement strStr() + +题目: + + + + +难度: + +Easy + + +这个题目其实可以引来一大类,那就是关于string的算法,但是此处先用暴力算法来AC,然后再来细读/品味别的string相关算法吧。 + +虽然是暴力算法,但是也不容易写对啊 + + +``` +class Solution(object): + def strStr(self, haystack, needle): + """ + :type haystack: str + :type needle: str + :rtype: int + """ + if not needle: + return 0 + for i in xrange(len(haystack) - len(needle) + 1): + if haystack[i] == needle[0]: + j = 1 + while j < len(needle) and haystack[i+j] == needle[j]: + j += 1 + if j == len(needle): + return i + return -1 +``` \ No newline at end of file diff --git a/031._next_permutation.md b/031._next_permutation.md new file mode 100644 index 000000000..7d33a3470 --- /dev/null +++ b/031._next_permutation.md @@ -0,0 +1,57 @@ + +###31. Next Permutation + + +题目: + + + +难度: + +Medium + +参照wikipedia: + + + + + +看一个permutation,比如 + +125430 + + +- 从末尾开始,找到decreasing subsequence,5430,因为来调5330无论怎么调,都不可能有比它更小的,数也被自然的分成两部分(1,2) 和 (5,4,3,0) +- 下一步是找这个sequence里面第一个比前面部分,比2大的,3,也很容易理解,因为下一个必定是(1,3)打头 +- 交换 3和2 ,变成 (1,3,5,4,2,0),再把后面的部分reverse,得到后面部分可得到的最小的 + +这个时候,得到下一个sequence 130245 + +AC 代码 + +``` +class Solution(object): + def nextPermutation(self, nums): + """ + :type nums: List[int] + :rtype: void Do not return anything, modify nums in-place instead. + """ + m, n = 0, 0 + for i in range(len(nums) - 2, 0 , -1): + if nums[i] < nums[i+1]: + m = i + break + + for i in range(len(nums) - 1, 0 , -1): + if nums[i] > nums[m]: + n = i + break + + if m < n : + nums[m], nums[n] = nums[n], nums[m] + nums[m+1:] = nums[len(nums):m:-1] + else: + nums = nums.reverse() +``` + + diff --git a/033._search_in_rotated_sorted_array.md b/033._search_in_rotated_sorted_array.md new file mode 100644 index 000000000..c3e076259 --- /dev/null +++ b/033._search_in_rotated_sorted_array.md @@ -0,0 +1,53 @@ +###33. Search in Rotated Sorted Array + +题目: + + + +难度: +Medium + + +思路: + + +最直观的是O(N)解法 + +but tag是binary search,应该和find min in rotated array类似。 +判断是否有序,然后做二分。 +最容易理解的写法 + +- 如果是mid,return mid +- 左边有序,判断是否在左边,否则在右边中寻找 +- 右边有序,判断是否在右边,否则在左边寻找 +- 都没找到,return -1 + + +``` +class Solution(object): + def search(self, nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: int + """ + l,r = 0, len(nums) - 1 + + while l <= r : + mid = (l+r)/2 + if target == nums[mid]: + return mid + if nums[mid] < nums[r]: + if nums[mid] < target <= nums[r]: + l = mid + 1 + else: + r = mid - 1 + else: + if nums[l] <= target < nums[mid]: + r = mid - 1 + else: + l = mid + 1 + return -1 +``` + + diff --git a/034. Search for a Range.md b/034. Search for a Range.md new file mode 100644 index 000000000..99685e45d --- /dev/null +++ b/034. Search for a Range.md @@ -0,0 +1,82 @@ +### 34. Search for a Range + + + +题目: + + https://leetcode.com/problems/search-for-a-range/ + + + +难度 : Medium + + + +思路: + +一开始想啊想,觉得虽然用到了二分,但都不是O(logN) + +后来看到hint: + +> 采用两次二分查找。首先二分找到第一个该值出现的位置,譬如m,然后在[m, n)区间内第二次二分找到最后一个该值出现的位置。 + + + +二分查找其实不容易写对,看到哪里写的,其实是的,有要点: + + + +- 关于right的赋值 + +- - right = n-1 => while(left <= right) => right = middle-1; + - right = n => while(left < right) => right = middle; + +- middle的计算不能写在while循环外,否则无法得到更新。 + + ​ + +AC 代码 + +``` +class Solution(object): + def searchRange(self, nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: List[int] + """ + if not nums : return [-1, -1] + + result = [] + l, r = 0, len(nums) + + while l < r: + mid = (l + r) // 2 + if nums[mid] == target and (mid == 0 or nums[mid-1] != target): + result.append(mid) + break + if nums[mid] < target: + l = mid + 1 + else: + r = mid + if not result: + return [-1, -1] + + l,r = 0, len(nums) + while l < r: + mid = ( l + r )// 2 + if nums[mid] == target and (mid == len(nums)-1 or nums[mid+1] != target): + result.append(mid) + break + if nums[mid] <= target: + l = mid + 1 + else: + r = mid + + return result +``` + + + + + diff --git a/035._search_insert_position.md b/035._search_insert_position.md new file mode 100644 index 000000000..a45141cbe --- /dev/null +++ b/035._search_insert_position.md @@ -0,0 +1,32 @@ +###35. Search Insert Position + +题目: + + + +难度: + +Medium + + +递归 + +``` +class Solution(object): + def searchInsert(self, nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: int + """ + n = len(nums) + if target <= nums[0]: + return 0 + if target > nums[n-1]: + return n + for i in range(1,n): + if target == nums[i]: + return i + elif target > nums[i-1] and target < nums[i]: + return i +``` \ No newline at end of file diff --git a/039._combination_sum.md b/039._combination_sum.md new file mode 100644 index 000000000..147d5da68 --- /dev/null +++ b/039._combination_sum.md @@ -0,0 +1,66 @@ +###39. Combination Sum + +题目: + + + + +难度: + +Medium + + +最初的思路: + + +``` +res = [] +def combSum(candidates, target, valueList): + if target == 0: + res.append(valueList) + for candidate in candidates: + if candidate > target: + return + combSum(candidates, target - candidate, valueList + [candidate] ) + +``` + + +问题在于,有重复: + +``` +combSum([2,3,6,7],7,[]) + +res +Out[9]: [[2, 2, 3], [2, 3, 2], [3, 2, 2], [7]] +``` + +然后看了hint,除[2, 2, 3] 和 [2, 3, 2]这种重复的方式是, 把candidates先sort,然后用index的方式来处理。 + + +所以最终的除重大法如下,根据hint做出: + +``` +class Solution(object): + def combinationSum(self, candidates, target): + """ + :type candidates: List[int] + :type target: int + :rtype: List[List[int]] + """ + candidates = list(set(candidates)) + candidates.sort() + self.res = [] + self.combSum(candidates, target, 0, []) + return self.res + + + def combSum(self, candidates, target, start, valueList): + length = len(candidates) + if target == 0: + self.res.append(valueList) + for i in range(start, length): + if target < candidates[i]: + return + self.combSum(candidates, target - candidates[i], i, valueList + [candidates[i]]) +``` diff --git a/040._combination_sum_ii.md b/040._combination_sum_ii.md new file mode 100644 index 000000000..8ebce3aa6 --- /dev/null +++ b/040._combination_sum_ii.md @@ -0,0 +1,82 @@ +###40. Combination Sum II + +题目: + + + + +难度: + +Medium + + +Combination Sum 已经AC,做了minor change. + +``` +class Solution(object): + def combinationSum2(self, candidates, target): + """ + :type candidates: List[int] + :type target: int + :rtype: List[List[int]] + """ + candidates.sort() + self.res = [] + self.combSum(candidates, target, 0, []) + return self.res + + def combSum(self, candidates, target, start, valueList): + length = len(candidates) + if target == 0: + if valueList not in self.res: + self.res.append(valueList) + if length == 0: + return + for i in range(start, length): + if target < candidates[i]: + return + self.combSum(candidates[:i] + candidates[i+1:], target - candidates[i], i, valueList + [candidates[i]]) + +``` + + + +以上是偷懒解法, 优化就是碰到已经碰到过的元素我们直接略过. + +这里的‘碰到’是比如我们已经有它,举个例子 + +然后也不用担心两个相同的放不进去,因为当我们处理第一个的时候,它并没拿来跟已经放入的元素比较了,只是在和还没放入的元素比较. + + +``` +class Solution(object): + def combinationSum2(self, candidates, target): + """ + :type candidates: List[int] + :type target: int + :rtype: List[List[int]] + """ + def combSum(candidates, target, start, valueList): + length = len(candidates) + if target < 0 : + return + if target == 0 : + res.append(valueList) + for i in range(start, length): + if candidates[i] > target: return + if i > 0 and candidates[i] == candidates[i-1]: continue + combSum(candidates[i+1:], target - candidates[i], 0, valueList + [candidates[i]]) + + + candidates.sort() + res = [] + combSum(candidates, target, 0, []) + return res + + + +``` + + + +多重优化 \ No newline at end of file diff --git a/042._trapping_rain_water.md b/042._trapping_rain_water.md new file mode 100644 index 000000000..08d0dd0b7 --- /dev/null +++ b/042._trapping_rain_water.md @@ -0,0 +1,50 @@ +###42. Trapping Rain Water + + + +题目: + + + +难度: +Hard + +思路: + +题目有几个特性可用,bar width = 1,然后第一个和最后一个是不能trap water,其次中间的部分能trap多少水是看`左右高度差教低的那个 - 本身的高度`,所以就是本身的比较高就不能trap water了,这种情况取0. + + +AC代码: + + +``` +class Solution(object): + def trap(self, height): + """ + :type height: List[int] + :rtype: int + """ + if not height: return 0 + n = len(height) + + rightH = [0 for i in range(n)] + rightH[n-1] = height[n-1] + + for i in range(n-2,0,-1): + rightH[i] = max(rightH[i+1],height[i+1]) + # print rightH + + + leftH = [0 for i in range(n)] + leftH[0] = height[0] + for i in range(1,n): + leftH[i] = max(leftH[i-1],height[i-1]) + # print leftH + + water = 0 + for i in range(1,n-1): + water += max(0, min(leftH[i],rightH[i]) - height[i]) + print water + return water + +``` \ No newline at end of file diff --git a/043._multiply_strings.md b/043._multiply_strings.md new file mode 100644 index 000000000..461c8ee91 --- /dev/null +++ b/043._multiply_strings.md @@ -0,0 +1,81 @@ +###43. Multiply Strings + +题目: + + + +难度: + +Medium + + +思路: + +虽然写了一堆similar problems,拿到的时候也算有思路,但是还是觉得很难写 + +参考了别人的思路: + +1. m位的数字乘以n位的数字的结果最大为m+n位: +999*99 < 1000*100 = 100000,最多为3+2 = 5位数。 +2. 先将字符串逆序便于从最低位开始计算。 + + +觉得这样写才是最容易理解的,看一个具体的🌰: + +``` +123 * 456 + + 123 + * 456 + + +先把每一位拿来相乘:得到 + 1 2 3 + 4 5 6 + + 6 12 18 + 5 10 15 + 4 8 12 + +这样在全部加起来和做进位处理 + 5 6 0 8 8 + + +``` + + + + +``` +class Solution(object): + def multiply(self, num1, num2): + """ + :type num1: str + :type num2: str + :rtype: str + """ + if num1 == '0' or num2 == '0' : return '0' + len1,len2 = len(num1),len(num2) + + num1 = num1[::-1] + num2 = num2[::-1] + # 99 * 99 < 10000, maxmize 4 digit + arr = [0 for i in range(len1 + len2)] + + for i in xrange(len1): + for j in xrange(len2): + arr[i+j] += (ord(num1[i]) - ord('0')) * (ord(num2[j]) - ord('0')) + + + res = [0 for i in range(len1 + len2)] + + for i in range(len(arr)): + res[i] = arr[i] % 10 + if i < len(arr) - 1: + arr[i+1] += arr[i]/10 + + i = len(arr)-1 + if res[i] == 0: + i -= 1 + return ''.join(str(j) for j in res[:i+1][::-1]) +``` diff --git a/044._wildcard_matching.md b/044._wildcard_matching.md new file mode 100644 index 000000000..e7d2755a0 --- /dev/null +++ b/044._wildcard_matching.md @@ -0,0 +1,44 @@ +###44. Wildcard Matching + +题目: + + + +难度: + +Hard + + + +做完Regular Expression Matching来做的这道题,按照DP思路run一下是超时,感觉是开心的,至少暂时没有报错了,有待优化,应该在dp的同时在贪心一下么。 + + + +超时代码 +``` +class Solution(object): + def isMatch(self, s, p): + """ + :type s: str + :type p: str + :rtype: bool + """ + m, n = len(s), len(p) + dp = [ [0 for i in xrange(n+1)] for j in xrange(m+1)] + + dp[0][0] = 1 + + # init the first line + for i in xrange(1,n+1): + if p[i-1] == '*': + dp[0][i] = dp[0][i-1] + + for i in xrange(1,m+1): + for j in xrange(1,n+1): + if p[j-1] == s[i-1] or p[j-1] == '?': + dp[i][j] = dp[i-1][j-1] + elif p[j-1] == '*': + dp[i][j] = dp[i][j-1] or dp[i-1][j] + + return dp[m][n] == 1 +``` \ No newline at end of file diff --git a/046._permutations.md b/046._permutations.md new file mode 100644 index 000000000..a79e7c67c --- /dev/null +++ b/046._permutations.md @@ -0,0 +1,138 @@ +###46. Permutations + +题目: + + + +难度: + +Medium + + +复习了一下,自己写的容易理解版本: + +每次调一个放入现有 + +``` +class Solution(object): + def permute(self, nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + self.result = [] + self.recPermute([],nums) + return self.result + + def recPermute(self, sofar, rest): + if rest == []: + self.result.append(sofar) + else: + for i in range(len(rest)): + next = sofar + [rest[i]] + remaining = rest[:i] + rest[i+1:] + self.recPermute(next, remaining) +``` + +交换 + + + +``` +class Solution(object): + def permute(self, nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + result = [] + self.helper(nums,0,result) + return result + + def helper(self,nums,begin,result): + n = len(nums) + if begin == n: + tmp = nums[:] + result.append(tmp) + return + + for i in range(begin,n): + nums[begin], nums[i] = nums[i],nums[begin] + self.helper(nums,begin+1,result) + nums[begin],nums[i] = nums[i],nums[begin] + +``` + + + + + + +好像还有一个巧妙的版本 + + +``` +class Solution: + # @param num, a list of integer + # @return a list of lists of integers + def permute(self, num): + if len(num) == 0: return [] + if len(num) == 1: return [num] + res = [] + for i in range(len(num)): + for j in self.permute(num[:i] + num[i+1:]): + res.append([num[i]] + j) + return res +``` + + +更容易理解的写法: + + +``` +class Solution: + # @param num, a list of integer + # @return a list of lists of integers + def permute(self, num): + if len(num) == 0: return [] + if len(num) == 1: return [num] + res = [] + for i in range(len(num)): + x = num[i] + xs = num[:i] + num[i+1:] + for j in self.permute(xs): + res.append([x] + j) + return res + +``` + +就是一定要有递归的信念❤️ + + + +还有介绍的基本无memory使用的算法: + + +``` +class Solution: + # @param num, a list of integer + # @return a list of lists of integers + def permute(self, num): + if len(num) == 0: yield [] + if len(num) == 1: yield [num] + res = [] + for i in range(len(num)): + x = num[i] + xs = num[:i] + num[i+1:] + for j in self.permute(xs): + res.append([x] + j) + yield res + +``` + +但是这个yield只是生产generator,要看结果还是要用for in的。 + + + + + diff --git a/047._permutations_ii.md b/047._permutations_ii.md new file mode 100644 index 000000000..68a3ead84 --- /dev/null +++ b/047._permutations_ii.md @@ -0,0 +1,42 @@ +###47. Permutations II + +题目: + + + +难度: + +Medium + + +虽然想到了,但是没有靠自己的力量implement出来,还是比较容易了理解的,因为如果有重复的,那么处理只用处理第一个,就只用把第一个提出来,剩下的管它怎么permute。 + +第二次碰到这个元素就不要再用它了,因为可能出现的组合已经有了。 + + +看代码: +base case 处理掉 +sort一下,设置一个prevNum变量 + +如果碰到过了,就continue,去继续执行下一个 + + +``` +class Solution(object): + def permuteUnique(self, nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + if len(nums) == 0: return [] + if len(nums) == 1: return [nums] + res = [] + nums.sort() + for i in range(len(nums)): + if i > 0 and nums[i] == nums[i-1]: continue + for j in self.permuteUnique(nums[:i] + nums[i+1:]): + res.append([nums[i]] + j) + return res +``` + + diff --git a/048._rotate_image.md b/048._rotate_image.md new file mode 100644 index 000000000..bff771bbb --- /dev/null +++ b/048._rotate_image.md @@ -0,0 +1,118 @@ +###48. Rotate Image + + +题目: + + + +难度: + +Medium + + + +思路一: + +``` +rotate之前: 之后: + 1 2 3 4 13 9 5 1 + 5 6 7 8 14 10 6 2 + 9 10 11 12 15 11 7 3 + 13 14 15 16 16 12 8 4 + +``` +看网上的hint,是先沿着对角线变换一次,再验证水平中线变换一次 + + +``` +16 12 8 4 13 9 5 1 +15 11 7 3 14 10 6 2 +14 10 6 2 15 11 7 3 +13 9 5 1 16 12 8 4 +``` + +对角线变换的规律是 +(i,j), (n-1-j,n-1-i) + +上下变换规律 +(i,j),(n-1-i,j) + + +``` +class Solution(object): + def rotate(self, matrix): + """ + :type matrix: List[List[int]] + :rtype: void Do not return anything, modify matrix in-place instead. + """ + n = len(matrix) + for i in range(n): + for j in range(n): + if j < n-1-i: + matrix[i][j],matrix[n-1-j][n-1-i] = matrix[n-1-j][n-1-i],matrix[i][j] + + for i in range(n/2): + for j in range(n): + matrix[i][j],matrix[n-1-i][j] = matrix[n-1-i][j],matrix[i][j] + + +``` + + +思路二: + +参考这里 + + + +找规律,一次完成四个数的该有的变换 + +``` + +1 2 3 4 5 + +6 7 8 9 10 + +11 12 13 14 15 + +16 17 18 19 20 + +21 22 23 24 25 + +``` + +观察一下,第一个数开始的变换是 (0,0)->(0,4)->(4,4)->(4,0) +第二个数的变换是 (0,1)->(1,4)->(4,3)->(3,0) + +变换是 (x,y) -> (y, n-1-x) -> (n-1-x,n-1-y)->(n-1-y,x) + +然后处理第一行是从(0,0)->(0,n-2),第二列是(1,1)->(1,n-3). + +第i行(i, i)(i, n – 2 – i).终止条件也有了。 + +虽然都是O(N^2),但是这个比上面的稍快 + +``` +class Solution(object): + def rotate(self, matrix): + """ + :type matrix: List[List[int]] + :rtype: void Do not return anything, modify matrix in-place instead. + """ + n = len(matrix) + + # row, col + for i in range(n): + for j in range(i,n-1-i): + matrix[i][j],matrix[j][n-1-i],matrix[n-1-i][n-1-j],matrix[n-1-j][i] = \ + matrix[n-1-j][i],matrix[i][j],matrix[j][n-1-i],matrix[n-1-i][n-1-j] +``` + + +这里的问题是矩阵都是方形,如果不是方形,貌似难很多。 + + + + + + diff --git a/049._group_anagrams_python.md b/049._group_anagrams_python.md new file mode 100644 index 000000000..c6d15903c --- /dev/null +++ b/049._group_anagrams_python.md @@ -0,0 +1,38 @@ +###49. Group Anagrams python + +题目: + + + +难度 : Medium + +我又来使用我的取巧神奇python大法 + + +``` +class Solution(object): + def groupAnagrams(self, strs): + """ + :type strs: List[str] + :rtype: List[List[str]] + """ + mapx = {} + for str1 in strs: + key = self.sortedWord(str1) + if key in mapx: + mapx[key].append(str1) + else: + mapx[key] = [str1] + return list(mapx.values()) + + def sortedWord(self,s): + """ + :type s: str + :type t: str + :rtype: bool + """ + sList = sorted(list(s)) + str1 = ''.join(sList) + return str1 + +``` diff --git a/050._pow(x,_n).md b/050._pow(x,_n).md new file mode 100644 index 000000000..d7a2d0e31 --- /dev/null +++ b/050._pow(x,_n).md @@ -0,0 +1,36 @@ +###50. Pow(x, n) + +题目: + + + +难度: + +Medium + + +幼时的我写的代码 🔽 + + +``` +class Solution(object): + def myPow(self, x, n): + """ + :type x: float + :type n: int + :rtype: float + """ + def myPosPow(x, n): + if n == 0 : + return 1 + v = myPosPow(x, n / 2) + if n % 2 == 0: + return v * v + else: + return x * v * v + + if n < 0 : + return 1 / myPosPow(x, -n) + else: + return myPosPow(x, n) +``` diff --git a/051._n-queens.md b/051._n-queens.md new file mode 100644 index 000000000..960ce32d5 --- /dev/null +++ b/051._n-queens.md @@ -0,0 +1,48 @@ +###51. N-Queens + +题目: + + + +难度: +Hard + +偷懒,用52, 依旧需要挖掘 + +``` +class Solution(object): + def solveNQueens(self, n): + """ + :type n: int + :rtype: List[List[str]] + """ + self.board = [] + self.res = [] + self.placequeen(0,n) + return self.res + + def danger(self, board ,row, col): + for (i, j) in board: + if row == i: return True + if col == j: return True + if abs(row - i) == abs(col - j): return True + + return False + + + def placequeen(self, row, n): + if row >= n: + tmpRes = [['.' for i in range(n)] for j in range(n)] + for (row,col) in self.board: + tmpRes[row][col] = 'Q' + tmpRes = [''.join(i) for i in tmpRes] + self.res.append(tmpRes) + + else: + for col in range(0, n): + if not self.danger(self.board, row, col): + self.board.append((row, col)) + self.placequeen(row + 1, n) + self.board.remove((row,col)) + +``` \ No newline at end of file diff --git a/052._n-queens_ii.md b/052._n-queens_ii.md new file mode 100644 index 000000000..07d153553 --- /dev/null +++ b/052._n-queens_ii.md @@ -0,0 +1,52 @@ +###52. N-Queens II + +题目: + + + +难度: +Hard + +思路参见recursion & backtracking + +n queens还是属于比较难的,需要花时间吃透的问题 + + +``` + + +class Solution(object): + def totalNQueens(self, n): + """ + :type n: int + :rtype: int + """ + self.board = [] + self.cnt = 0 + self.placequeen(0,n) + return self.cnt + + def danger(self, board ,row, col): + for (i, j) in board: + if row == i: return True + if col == j: return True + if abs(row - i) == abs(col - j): return True + + return False + + + def placequeen(self, row, n): + if row >= n: + #print self.board + self.cnt +=1 + else: + for col in range(0, n): + if not self.danger(self.board, row, col): + self.board.append((row, col)) + self.placequeen(row + 1, n) + self.board.remove((row,col)) +``` + + + + diff --git a/053._maximum_subarray.md b/053._maximum_subarray.md new file mode 100644 index 000000000..c3d8cce5b --- /dev/null +++ b/053._maximum_subarray.md @@ -0,0 +1,146 @@ +###53. Maximum Subarray + +题目: + + + +难度: +Medium + + +思路一: + +O(N^2) + +从i开始,计算i到n,存比较大的sum,会超时 + +``` +class Solution(object): + def maxSubArray(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + n = len(nums) + m = float('-inf') + for i in range(n): + s = 0 + for j in range(i,n): + s = s + nums[j] + m = max(m,s) + return m +``` + +思路二: + +动归 + +ms(i) = max(ms[i-1]+ a[i],a[i]) + +到i处的最大值两个可能,一个是加上a[i],另一个从a[i]起头,重新开始。可以AC + +``` +class Solution(object): + def maxSubArray(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + n = len(nums) + maxSum = [nums[0] for i in range(n)] + for i in range(1,n): + maxSum[i] = max(maxSum[i-1] + nums[i], nums[i]) + return max(maxSum) +``` + + +思路三: + + +Kadane’s Algorithm wikipedia可以查到,然后一般的是负的可以还回0,这里需要稍作修改,参考 + + + + +``` +start: + max_so_far = a[0] + max_ending_here = a[0] + +loop i= 1 to n + (i) max_end_here = Max(arrA[i], max_end_here+a[i]); + (ii) max_so_far = Max(max_so_far,max_end_here); + +return max_so_far + +``` + +AC代码: + +``` +class Solution(object): + def maxSubArray(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + n = len(nums) + maxSum , maxEnd = nums[0], nums[0] + + for i in range(1,n): + maxEnd = max(nums[i],maxEnd + nums[i]) + maxSum = max(maxEnd,maxSum) + return maxSum +``` + + +思路四: + + + +参见clrs 第71页,用divide and conquer,有伪码 + + +最大的subarray sum有三个可能,左半段或者右半段,或者跨越左右半段, + +速度比较慢,AC代码,复杂度O(NlogN) + +``` +class Solution(object): + def maxSubArray(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + def find_max_crossing_subarray(nums, low, mid, high): + left_sum = float('-inf') + sum = 0 + for i in xrange(mid,low-1,-1): + sum = sum + nums[i] + if sum > left_sum: + left_sum = sum + + right_sum = float('-inf') + sum = 0 + for j in range(mid+1,high+1): + sum = sum + nums[j] + if sum > right_sum: + right_sum = sum + + return left_sum + right_sum + + def find_max_subarray(nums,low,high): + if low == high: + return nums[low] + else: + mid = (low + high) / 2 + left_sum = find_max_subarray(nums, low, mid) + right_sum = find_max_subarray(nums,mid+1,high) + cross_sum = find_max_crossing_subarray(nums,low,mid,high) + # print left_sum, right_sum, cross_sum + # print mid, low, high + return max(left_sum, right_sum, cross_sum) + + return find_max_subarray(nums, 0, len(nums)-1) + +``` \ No newline at end of file diff --git a/054._spiral_matrix.md b/054._spiral_matrix.md new file mode 100644 index 000000000..15c9d97f2 --- /dev/null +++ b/054._spiral_matrix.md @@ -0,0 +1,120 @@ +###54. Spiral Matrix + +题目: + + + +难度: +Medium + + +参考别人的代码,一开始觉得很有递归性,根据奇偶不同来写,递归太难写。 + +然后想到了loop,再想,可能有更优trick,事实证明并没有。 + +用四个变量来控制边界,然后因为方向总是:→↓←↑ 左右下上 + + + + +``` +class Solution(object): + def spiralOrder(self, matrix): + """ + :type matrix: List[List[int]] + :rtype: List[int] + """ + if matrix == [] : return [] + res = [] + maxUp = maxLeft = 0 + maxDown = len(matrix) - 1 + maxRight = len(matrix[0]) - 1 + direction = 0 # 0 go right, 1 go down, 2 go left, 3 up + while True: + if direction == 0: #go right + for i in range(maxLeft, maxRight+1): + res.append(matrix[maxUp][i]) + maxUp += 1 + elif direction == 1: # go down + for i in range(maxUp, maxDown+1): + res.append(matrix[i][maxRight]) + maxRight -= 1 + elif direction == 2: # go left + for i in reversed(range(maxLeft, maxRight+1)): + res.append(matrix[maxDown][i]) + maxDown -= 1 + else: #go up + for i in reversed(range(maxUp, maxDown+1)): + res.append(matrix[i][maxLeft]) + maxLeft +=1 + if maxUp > maxDown or maxLeft > maxRight: + return res + direction = (direction + 1 ) % 4 +``` + +以上的写法非常精妙,看看我自己用同样的思路写的|||| + +``` +class Solution(object): + def spiralOrder(self, matrix): + """ + :type matrix: List[List[int]] + :rtype: List[int] + """ + if len(matrix) == 0 : return [] + + left = 0 + up = 0 + down = len(matrix) - 1 + right = len(matrix[0]) -1 + + # 0 -> right, 1 -> down, 2-> left, 3 -> up + direction = 0 + + # start location + x, y = 0,0 + res = [] + + while True: + if left > right or up > down: + return res + + if direction == 0 : + while y <= right: + res.append(matrix[up][y]) + y += 1 + up += 1 + x = up + direction = 1 + continue + + if direction == 1: + while x <= down: + res.append(matrix[x][right]) + x += 1 + right -= 1 + y = right + direction = 2 + continue + + if direction == 2: + while y >= left: + res.append(matrix[down][y]) + y -= 1 + down -= 1 + x = down + direction = 3 + continue + + if direction == 3: + while x >= up: + res.append(matrix[x][left]) + x -= 1 + left += 1 + y = left + direction = 0 + continue + +``` + +明显别人的代码写的更精妙,因为这里两个boundary都很明确,所以用for in range就能很好的解决问题了. \ No newline at end of file diff --git a/055._jump_game.md b/055._jump_game.md new file mode 100644 index 000000000..fe68b059c --- /dev/null +++ b/055._jump_game.md @@ -0,0 +1,67 @@ +###55. Jump Game + +题目: + + + +难度: + +Medium + +dp + + +问题出现在一旦有0,而且这个0是不可跨过的那么无解,无法达到 +貌似对于dp[i] <= i,就无法达到,不能成立 + + +尝试一: + +超时 + +``` +class Solution(object): + def canJump(self, nums): + """ + :type nums: List[int] + :rtype: bool + """ + if len(nums) < 2: return True + + far = [0 for i in range(len(nums))] + far[0] = nums[0] + + for i in range(len(nums)-1): + for j in range(i): + if far[j] > far[i]: + far[i] = far[j] + far[i] = max(far[i],i+nums[i]) + if far[i] <= i: + return False + return True +``` + +尝试二,看了hint,根本不用这个数组,直接用一个数来记录可达最远距离,非常巧妙 + + +``` +class Solution(object): + def canJump(self, nums): + """ + :type nums: List[int] + :rtype: bool + """ + i = 0 + reach = 0 + + # i > reach also means terminate it can not really reach + while i < len(nums) and i <= reach: + reach = max(i+nums[i],reach) + i += 1 + + return reach >= len(nums) -1 +``` + +i记录当前loop位置,reach记录当前可到位置 + +注意这里的while循环的条件是 `i < len(nums) and i <= reach`,之所以加上 `i <= reach` 是因为如果reach < i说明i层不可达,其实也可以直接terminate.也就是我一开始写的dp[i] <= i会导致依旧不可达。 \ No newline at end of file diff --git a/058._length_of_last_word.md b/058._length_of_last_word.md new file mode 100644 index 000000000..7e9ff8a5d --- /dev/null +++ b/058._length_of_last_word.md @@ -0,0 +1,24 @@ +###58. Length of Last Word + +题目: + + + +难度 : Easy + + +作弊式做法 + +``` + +class Solution(object): + def lengthOfLastWord(self, s): + """ + :type s: str + :rtype: int + """ + lst = s.split() + if len(lst) >= 1: + return len(lst[-1]) + return 0 +``` \ No newline at end of file diff --git a/059._spiral_matrix_ii.md b/059._spiral_matrix_ii.md new file mode 100644 index 000000000..319314846 --- /dev/null +++ b/059._spiral_matrix_ii.md @@ -0,0 +1,51 @@ +###59. Spiral Matrix II + +题目: + + + +难度: +Medium + +和Spiral Matrix的思路基本一致 + +也许还有待挖掘trick + + +``` +class Solution(object): + def generateMatrix(self,n): + """ + :type n: int + :rtype: List[List[int]] + """ + curNum = 0 + matrix = [[0 for i in range(n)] for j in range(n)] + maxUp = maxLeft = 0 + maxDown = maxRight = n - 1 + direction = 0 + while True: + if direction == 0: #go right + for i in range(maxLeft, maxRight+1): + curNum += 1 + matrix[maxUp][i] = curNum + maxUp += 1 + elif direction == 1: # go down + for i in range(maxUp, maxDown+1): + curNum += 1 + matrix[i][maxRight] = curNum + maxRight -= 1 + elif direction == 2: # go left + for i in reversed(range(maxLeft, maxRight+1)): + curNum += 1 + matrix[maxDown][i] = curNum + maxDown -= 1 + else: #go up + for i in reversed(range(maxUp, maxDown+1)): + curNum += 1 + matrix[i][maxLeft] = curNum + maxLeft +=1 + if curNum >= n*n: + return matrix + direction = (direction + 1 ) % 4 +``` \ No newline at end of file diff --git a/060._permutation_sequence.md b/060._permutation_sequence.md new file mode 100644 index 000000000..81935e253 --- /dev/null +++ b/060._permutation_sequence.md @@ -0,0 +1,93 @@ +###60. Permutation Sequence + +题目: + + + +难度: + +Medium + + + +偷懒,用46的方法,会超时 + +``` + +class Solution(object): + def getPermutation(self, n, k): + """ + :type n: int + :type k: int + :rtype: str + """ + self.result = [] + s = "" + for i in range(1, n+1): + s += str(i) + self.recPermute("",s,k) + return self.result[-1] + + + def recPermute(self, sofar, rest, k): + if rest == "": + if len(self.result) == k: + return + self.result.append(sofar) + else: + for i in xrange(len(rest)): + nnext = sofar + rest[i] + remaining = rest[:i] + rest[i+1:] + self.recPermute(nnext, remaining, k) +``` + + +然后其实有规律的,比如 + +``` +1 "123" +2 "132" +3 "213" +4 "231" +5 "312" +6 "321" +``` + +是第n个数 + 余下的n-1个数的permutation + + +k = 1 就是所有的顺序排列 +k = n! 是所有的逆序排列 + +对于余下的也是递归,比如 + + +k < (n-1)! 1 + (n-1)个数的全排列的第k个 +k < 2*(n-1)! 2 + (n-1)个数的顺序全排列的第k个 + + +发现思路对了,但是implement还有点困难. + +看了一个最为精妙的解法 + +``` +class Solution(object): + def getPermutation(self, n, k): + """ + :type n: int + :type k: int + :rtype: str + """ + seq, k, fact = '', k-1, math.factorial(n-1) + perm = [i for i in range(1, n+1)] + for i in reversed(xrange(n)): + curr = perm[k/fact] + seq += str(curr) + perm.remove(curr) + if i > 0: + k %= fact + fact /= i + return seq +``` + + diff --git a/061._rotate_list.md b/061._rotate_list.md new file mode 100644 index 000000000..a26319d15 --- /dev/null +++ b/061._rotate_list.md @@ -0,0 +1,58 @@ + +###61. Rotate List + + +题目: + + + +难度: + +Medium + +- k可能比list的size大,需要做一个取余准备 +- 计算list size的同时把tail也记录下来,方便之后把tail的next指向原本的head +- 利用之前的到末端的kth node + + +AC 代码 + +``` +class Solution(object): + def rotateRight(self, head, k): + if head == None or k == 0 : + return head + + cur = head + size = 1 + while cur.next: + size += 1 + cur = cur.next + + tail = cur + + k = k % size + + p = self.findKth(head,k) + + tail.next = head + head = p.next + p.next = None + return head + + def findKth(self,head, k): + dummy = ListNode(-1) + dummy.next = head + p = dummy + q = dummy + + for i in range(k): + q = q.next + + while q.next: + p = p.next + q = q.next + return p +``` + + diff --git a/064._minimum_path_sum.md b/064._minimum_path_sum.md new file mode 100644 index 000000000..591c171b5 --- /dev/null +++ b/064._minimum_path_sum.md @@ -0,0 +1,58 @@ + +###64. Minimum Path Sum + +题目: + + + +难度: + +Medium + + + +非常明显的DP + +状态转移方程 + +dp[i][j] = gird[i][j] + min(dp[i-1][j], dp[i][j-1]) + + +然后注意一下边界的处理,一开始dp[0][0] = grid[0][0] + +第一行和第一列,之后开始全用状态转移方程 + + +``` +class Solution(object): + def minPathSum(self, grid): + """ + :type grid: List[List[int]] + :rtype: int + """ + m = len(grid) + n = len(grid[0]) if m else 0 + + dp = [[0 for i in range(n)] for i in range(m)] + + dp[0][0] = grid[0][0] + + # first row + for i in range(1,n): + dp[0][i] = grid[0][i] + dp[0][i-1] + + # first col + for i in range(1,m): + dp[i][0] = grid[i][0] + dp[i-1][0] + + + for i in range(1,m): + for j in range(1,n): + dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1]) + + + return dp[m-1][n-1] + + + +``` diff --git a/065.unique_paths_ii.md b/065.unique_paths_ii.md new file mode 100644 index 000000000..16e8e940c --- /dev/null +++ b/065.unique_paths_ii.md @@ -0,0 +1,84 @@ + ###65.Unique Paths II + +题目: + + + + +tag : DP + +难度 : Medium + + + + + +``` +BASE CASE( i = 0 , j = 0): +//第一排和第一列,如果没有obstacle, 则走法为1, 一旦有了obstacle,则之后的格子走法都为0 + +非BASE CASE : +//一旦有obstacle,则dp为0 +dp(i, j) = dp(i,j-1) + dp(i-1,j) + +``` + +Python代码 + +``` +class Solution(object): + def uniquePathsWithObstacles(self, obstacleGrid): + """ + :type obstacleGrid: List[List[int]] + :rtype: int + """ + row = len(obstacleGrid) + col = len(obstacleGrid[0]) + dp = [[0 for i in range(col)] for j in range(row)] + + dp[0][0] = int(obstacleGrid[0][0] == 0) + + #first row + for j in range(1,col): + if obstacleGrid[0][j] == 1: + dp[0][j] = 0 + else: + dp[0][j] = dp[0][j-1] + #first col + for i in range(1,row): + if obstacleGrid[i][0] == 1: + dp[i][0] = 0 + else: + dp[i][0] = dp[i-1][0] + + for i in range(1,row): + for j in range(1,col): + if obstacleGrid[i][j] == 1: + dp[i][j] = 0 + else: + dp[i][j] = dp[i-1][j] + dp[i][j-1] + return dp[row-1][col-1] + +``` + +犯了一个错,简直觉得不可思议。一开始初始化dp用的代码是 + +``` +dp = [[0] * col] * row +``` + +问题在此: + + +``` +>>> x = [[]] * 3 +>>> x[1].append(0) +>>> x +[[0], [0], [0]] +``` + +这样初始化是做了三个一样的object. + +The problem is that they're all the same exact list in memory. When you use the [x]*n syntax, what you get is a list of n many x objects, but they're all references to the same object. They're not distinct instances, rather, just n references to the same instance. + +参见stackoverflow : diff --git a/066._plus_one.md b/066._plus_one.md new file mode 100644 index 000000000..af4f118ef --- /dev/null +++ b/066._plus_one.md @@ -0,0 +1,63 @@ +###66. Plus One + +题目: + + + +难度 : Easy + + + +奇怪的AC了 +😄 +搞笑 —> 😓 + +这里是用的递归,很容易理解,如果空列表直接加1,最后一位小于9,那么直接就最后一位加1,否则添加一个0,然后再把余下的递归加1 + + +``` + +class Solution(object): + def plusOne(self, digits): + """ + :type digits: List[int] + :rtype: List[int] + """ + if digits == []: + return [1] + if digits[-1] < 9: + return digits[:-1] + [digits[-1] + 1] + else: + return self.plusOne(digits[:-1]) + [0] +``` + + +其实可以考虑循环,效率更高,参考[此处](https://shenjie1993.gitbooks.io/leetcode-python/content/066%20Plus%20One.html) + + + +> 从低位到高位,如果后一位有进位的话,那么该位要加上一,否则退出循环。如果最高位也进位,那么在列表前要插入一个一。 + + + +``` +class Solution(object): + def plusOne(self, digits): + """ + :type digits: List[int] + :rtype: List[int] + """ + carry = 1 + + for i in range(len(digits)-1,-1,-1): + digits[i] += carry + if digits[i] < 10: + carry = 0 + break + else: + digits[i] -= 10 + if carry == 1: + digits.insert(0,1) + return digits +``` + diff --git a/067._add_binary.md b/067._add_binary.md new file mode 100644 index 000000000..8ddec55c7 --- /dev/null +++ b/067._add_binary.md @@ -0,0 +1,33 @@ +###67. Add Binary + +题目: + + + +难度 : Easy + + +几种case: + +- a or b 为空,最简单 +- 唯一的问题是如果有进位的处理,进位的处理就是先让其中的一个数addBinary +1 ,然后再用addBinary + +``` + + +class Solution(object): + def addBinary(self, a, b): + """ + :type a: str + :type b: str + :rtype: str + """ + if (a == '' or b == ''): + return a + b + elif a[-1] == '0' and b[-1] == '0': + return self.addBinary(a[:-1], b[:-1]) + '0' + elif a[-1] == '1' and b[-1] == '1': + return self.addBinary(a[:-1], self.addBinary(b[:-1],'1')) + '0' + else: + return self.addBinary(a[:-1], b[:-1]) + '1' +``` \ No newline at end of file diff --git a/069._sqrt(x).md b/069._sqrt(x).md new file mode 100644 index 000000000..47f0363e7 --- /dev/null +++ b/069._sqrt(x).md @@ -0,0 +1,78 @@ +###69. Sqrt(x) + + +题目: + + + +难度: + +Medium + + +思路: + +一看,觉得很容易,一写,超时: + +``` +class Solution(object): + def mySqrt(self, x): + """ + :type x: int + :rtype: int + """ + i = 0 + while i * i <= x : + if i * i == x: + return i + elif i * i < x and (i+1) * (i+1) > x: + return i + i += 1 +``` + +看一眼tag, binary search,难道从x/2之类的开始搜起来?话说还想到求sqrt有个🐂的牛顿法? + +莫名其妙过了的代码: + +``` +class Solution(object): + def mySqrt(self, x): + """ + :type x: int + :rtype: int + """ + if x == 1 : return 1 + if x == 0 : return 0 + l,r = 0, x + while l < r: + mid = (l+r)/2 + if mid * mid <= x and (mid+1)*(mid+1) > x: + return mid + elif mid * mid > x: + r = mid + else: + l = mid +``` + +其实这个else感觉是没有意义的,因为其root不可能比它的一半还大吧? + + +牛顿法 + +参见wikipedia,to be done:自己推导一遍 + + + +``` +class Solution(object): + def mySqrt(self, x): + """ + :type x: int + :rtype: int + """ + result = 1.0 + while abs(result * result - x) > 0.1: + result = (result + x / result) / 2 + return int(result) + +``` diff --git a/072._edit_distance.md b/072._edit_distance.md new file mode 100644 index 000000000..c2720f92b --- /dev/null +++ b/072._edit_distance.md @@ -0,0 +1,116 @@ +###72. Edit Distance + +题目: + + + +难度: + +Hard + +可以做的操作: + +- insert +- delete +- replace + +动归典型,原来也是有wikipedia page的算法 + + + + + + +看wikipedia 这解释 + +``` + / max(i,j) if min(i,j) = 0 + + / dp[i-1][j] + 1 word1[i]不在word2[0...j]中,所以删除 + dp[i][j] - min -- dp[i][j-1] + 1 insertion + \ dp[i-1][j-1] + 1/0 word[i]与word[j]是否相等 +``` + +上面的就不用解释了,min分别对应:删除、插入、以及替代(1/0取决 word1[i] == word2[j] ),反正也是tabular类型,画表来解决问题。 + + +用wikipedia上的伪码改造 + +``` +function LevenshteinDistance(char s[1..m], char t[1..n]): + // for all i and j, d[i,j] will hold the Levenshtein distance between + // the first i characters of s and the first j characters of t + // note that d has (m+1)*(n+1) values + declare int d[0..m, 0..n] + + set each element in d to zero + + // source prefixes can be transformed into empty string by + // dropping all characters + for i from 1 to m: + d[i, 0] := i + + // target prefixes can be reached from empty source prefix + // by inserting every character + for j from 1 to n: + d[0, j] := j + + for j from 1 to n: + for i from 1 to m: + if s[i] = t[j]: + substitutionCost := 0 + else: + substitutionCost := 1 + d[i, j] := minimum(d[i-1, j] + 1, // deletion + d[i, j-1] + 1, // insertion + d[i-1, j-1] + substitutionCost) // substitution + + return d[m, n] +``` + +对应的例子表格图 + +``` + k i t t e n + 0 1 2 3 4 5 6 +s 1 1 2 3 4 5 6 +i 2 2 1 2 3 4 5 +t 3 3 2 1 2 3 4 +t 4 4 3 2 1 2 3 +i 5 5 4 3 2 2 3 +n 6 6 5 4 3 3 2 +g 7 7 6 5 4 4 3 +``` + + +AC代码 + +``` +class Solution(object): + def minDistance(self, word1, word2): + """ + :type word1: str + :type word2: str + :rtype: int + """ + m,n = len(word1), len(word2) + dp = [[0 for i in range(m+1)] for j in range(n+1)] + + for i in range(1,m+1): + dp[0][i] = i + + for j in range(1,n+1): + dp[j][0] = j + + for j in range(1,n+1): + for i in range(1,m+1): + cost = 0 if word1[i-1] == word2[j-1] else 1 + dp[j][i] = min(dp[j-1][i] + 1, dp[j][i-1] + 1, dp[j-1][i-1] + cost) + + return dp[n][m] +``` + + +貌似还有提升版本,但是比较明显即使有伪码,一开始也出错于下标. + +升级版 to be learned. \ No newline at end of file diff --git a/073. Set Matrix Zeroes.md b/073. Set Matrix Zeroes.md new file mode 100644 index 000000000..0b30f99ed --- /dev/null +++ b/073. Set Matrix Zeroes.md @@ -0,0 +1,55 @@ +### 73. Set Matrix Zeroes + + + +题目: + + + + +难度 : Medium + + + +思路: + +Naive AC代码,一看类似那个 game of life,不用extra space,不用O(mn),应该就是用状态转移机了(?),所以还是先naive AC把: + +``` +class Solution(object): + def setZeroes(self, matrix): + """ + :type matrix: List[List[int]] + :rtype: void Do not return anything, modify matrix in-place instead. + """ + def setZero(i,j): + for m in range(col): + matrix[i][m] = 0 + for n in range(row): + matrix[n][j] = 0 + + + row = len(matrix) + col = len(matrix[0]) if row else 0 + + newM = [] + for i in range(row): + newM.append(matrix[i][:]) + + + for i in range(row): + for j in range(col): + if newM[i][j] == 0: + setZero(i,j) +``` + + + +`正确思路`: + +一边遍历,一边将相应的行和列置为0是行不通的,会影响后面元素的遍历判断,所以要记录下哪些行和哪些列是要置为0的。为了节约空间,在原矩阵中借两条边,如果该行或者列要置为0,则把左边或者上边的相应位置置为0。如果左边和上边本来就有0,那么需要额外标记一下,最后把左边或者右边也全部置为0. + + + + + diff --git a/074._search_a_2d_matrix.md b/074._search_a_2d_matrix.md new file mode 100644 index 000000000..bef2e7ffb --- /dev/null +++ b/074._search_a_2d_matrix.md @@ -0,0 +1,51 @@ +###74. Search a 2D Matrix + +题目: + + + +难度: +Easy + + + + +二分Search + + +``` +class Solution(object): + def searchMatrix(self, matrix, target): + """ + :type matrix: List[List[int]] + :type target: int + :rtype: bool + """ + if len(matrix) == 0: + return False + else: + n = len(matrix[0]) + half = len(matrix)//2 + if target >= matrix[half][0] and target <= matrix[half][n-1]: + return self.searchList(matrix[half],target) + elif target < matrix[half][0]: + return self.searchMatrix(matrix[:half],target) + else: + return self.searchMatrix(matrix[half+1:],target) + + def searchList(self, lst, target): + if len(lst) == 0: + return False + else: + mid = len(lst) // 2 + if target == lst[mid]: + return True + elif target < lst[mid]: + return self.searchList(lst[:mid],target) + else: + return self.searchList(lst[mid+1:],target) + + + + +``` \ No newline at end of file diff --git a/075._sort_colors.md b/075._sort_colors.md new file mode 100644 index 000000000..e70f4e6ad --- /dev/null +++ b/075._sort_colors.md @@ -0,0 +1,54 @@ +###75. Sort Colors + +题目: + + + +难度: + +Medium + + +思路: + +这个问题是 Dutch National Flag Problem, 荷兰旗问题 + + + +思路其实是类似partition的,比x小的放左边,比x大的放右边。 + +这里是用三个指针,begin, cur, end,cur需要遍历整个数组 + +- cur 指向0,交换begin与cur, begin++,cur++ +- cur 指向1,不做任何交换,cur++ +- cur 指向2,交换end与cur,end-- + +之所以cur指向2,交换之后不前进是因为我们不知道end此时指向的元素是几,如果交换过来的是0或者1,那么明显我们需要做进一步的处理,所以最终判断条件是end =< cur应该就结束了 + +这样的three-way-partition也只是3-way好用吧?如果有4个数,那么这样则是无效的,或者如果是4-way,那么可以转换成3-way+2-way + + +``` +class Solution(object): + def sortColors(self, nums): + """ + :type nums: List[int] + :rtype: void Do not return anything, modify nums in-place instead. + """ + begin,cur,end = 0,0,len(nums) - 1 + + while cur <= end: + if nums[cur] == 0: + nums[begin],nums[cur] = nums[cur],nums[begin] + cur += 1 + begin += 1 + + elif nums[cur] == 1: + cur += 1 + + else: # nums[cur] == 2 + nums[cur],nums[end] = nums[end],nums[cur] + end -=1 + +``` + diff --git a/077._combinations.md b/077._combinations.md new file mode 100644 index 000000000..1672b9dff --- /dev/null +++ b/077._combinations.md @@ -0,0 +1,123 @@ +###77. Combinations + + +题目: + + + +难度 : Medium + + +思路一: +python作弊法 + +``` +import itertools +p = [4, 8, 15, 16, 23, 42] +c = itertools.combinations(p, 4) +for i in c: + print i + +结果: + +(4, 8, 15, 16) +(4, 8, 15, 23) +(4, 8, 15, 42) +(4, 8, 16, 23) +(4, 8, 16, 42) +(4, 8, 23, 42) +(4, 15, 16, 23) +(4, 15, 16, 42) +(4, 15, 23, 42) +(4, 16, 23, 42) +(8, 15, 16, 23) +(8, 15, 16, 42) +(8, 15, 23, 42) +(8, 16, 23, 42) +(15, 16, 23, 42) +``` + +作弊AC代码: + +``` +class Solution(object): + def combine(self, n, k): + """ + :type n: int + :type k: int + :rtype: List[List[int]] + """ + import itertools + return [list(i) for i in itertools.combinations(range(1,n+1), k)] +``` + + +思路二: + +标准的recursion + +但是会超时 + + +``` +class Solution(object): + def combine(self, n, k): + """ + :type n: int + :type k: int + :rtype: List[List[int]] + """ + ans = [] + self.dfs(n, k, 1, [], ans) + return ans + + def dfs(self, n, k ,start, lst, ans): + if k == 0 : + ans.append(lst) + return + for i in range(start, n+1): + self.dfs(n, k - 1, i + 1,lst +[i], ans) +``` + +理解方式 + +``` + + 1 2 3 + 12 13 14 23 24 34 +``` + +可以参照这里 + + + + + +解法三: + + +采用递归的方式,在n个数中选k个,如果n大于k,那么可以分类讨论,如果选了n,那么就是在1到(n-1)中选(k-1)个,否则就是在1到(n-1)中选k个。递归终止的条件是k为1,这时候1到n都符合要求。 + +注意一开始这里的else part花了我一点时间来理解,因为n必定大于k,所以这样递归当 n == k的时候选法就是code原作者的写法,也就是直接[range(1,k+1)] + +参考这里: + + +``` +class Solution(object): + def combine(self, n, k): + """ + :type n: int + :type k: int + :rtype: List[List[int]] + """ + if k == 1: + return [[i + 1] for i in range(n)] + result = [] + if n > k: + result = [r + [n] for r in self.combine(n - 1, k - 1)] + self.combine(n - 1, k) + else: #n == k + # result = [r + [n] for r in self.combine(n - 1, k - 1)] + result = [range(1,k+1)] + return result +``` \ No newline at end of file diff --git a/078.Subsets .md b/078.Subsets .md new file mode 100644 index 000000000..c0092653e --- /dev/null +++ b/078.Subsets .md @@ -0,0 +1,67 @@ +###78.Subsets + +题目: + + + +难度 : Medium + + +Python代码 + +``` +class Solution(object): + def subsets(self, nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + results = [[]] + for num in nums: + results.extend([result + [num] for result in results]) + return results + +``` + +可是我不能理解,为嘛我写的这个不work. + +⬇️ + +我的不work因为不能同时改变list和iterate list + + +``` +def subsets(nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + results = [[]] + for num in nums: + for result in results: + results.extend([result + [num]]) + return results + +``` + +BackTrack 标准解法版 + + +``` +class Solution: + + def search(self, nums, S, index): + if index == len(nums): + self.results.append(S) + return + + self.search(nums, S + [nums[index]], index + 1) + self.search(nums, S, index + 1) + + def subsets(self, nums): + self.results = [] + self.search(nums, [], 0) + return self.results +``` + +对每个元素,有两种可能,加入S和不加入S,写起来思路还是很清爽的 \ No newline at end of file diff --git a/079._word_search.md b/079._word_search.md new file mode 100644 index 000000000..e097a4259 --- /dev/null +++ b/079._word_search.md @@ -0,0 +1,63 @@ +###79. Word Search + + + +题目: + + + +难度: +Medium + + +思路: + +其实这个题和number of islands类似,是backtracking基本功的考查,但是基本功非常有待提高||| + +比较核心的是dfs函数,然后这个函数有取巧的写法:如果outside of boundary就return False + +loop, 如果碰到跟word开头的字母一样,把这个扔进去loop,可以考查这个char在这个board的上下左右是否可以选择,补课使用则重置used, 然后return + +也还是之前摘录的,backtrack写法关键: 选择 (Options),限制 (Restraints),结束条件 (Termination)。 + + + + +``` +class Solution(object): + def exist(self, board, word): + """ + :type board: List[List[str]] + :type word: str + :rtype: bool + """ + + def dfs(board, used, row, col, x, y, word, idx): + if idx == len(word) : + return True + + if x < 0 or x > row -1 or y < 0 or y > col -1 : + return False + + if board[x][y] == word[idx] and not used[x][y]: + used[x][y] = 1 + left = dfs(board,used,row,col,x-1,y,word,idx+1) + right = dfs(board,used,row,col,x+1,y,word,idx+1) + up = dfs(board,used,row,col,x,y-1,word,idx+1) + down = dfs(board,used,row,col,x,y+1,word,idx+1) + + used[x][y] = left or right or up or down + return left or right or up or down + return False + + + row = len(board) + col = len(board[0]) if row else 0 + used = [ [0 for i in range(col)] for j in range(row)] + + for i in range(row): + for j in range(col): + if dfs(board,used,row,col,i,j,word,0): + return True + return False +``` \ No newline at end of file diff --git a/082._remove_duplicates_from_sorted_list_ii.md b/082._remove_duplicates_from_sorted_list_ii.md new file mode 100644 index 000000000..277b3870c --- /dev/null +++ b/082._remove_duplicates_from_sorted_list_ii.md @@ -0,0 +1,49 @@ +###82. Remove Duplicates from Sorted List II + + +题目: + + + + +难度: + +Medium + + +木有space 和 time的限制,第一想法,用dictionary存一下每个nodes的个数,这样只要看到它是大于1的,就删删删。 + +虽然是笨办法。但是也可以AC + +``` +class Solution(object): + def deleteDuplicates(self, head): + """ + :type head: ListNode + :rtype: ListNode + """ + dummy = ListNode(-1) + dummy.next = head + + cur = dummy.next + nodeNumber = {} + while cur: + if cur.val in nodeNumber: + nodeNumber[cur.val] += 1 + else: + nodeNumber[cur.val] = 1 + cur = cur.next + + cur = dummy + while cur.next: + if nodeNumber[cur.next.val] > 1: + cur.next = cur.next.next + else: + cur = cur.next + return dummy.next +``` + + +谷歌一下,更省时间的方法是用一个prev 和 cur 指针,然后用一个bool来记录是否duplicate,这样loop一次即可解决问题。 + +to be 写出来 \ No newline at end of file diff --git a/083._remove_duplicates_from_sorted_list.md b/083._remove_duplicates_from_sorted_list.md new file mode 100644 index 000000000..bdca46263 --- /dev/null +++ b/083._remove_duplicates_from_sorted_list.md @@ -0,0 +1,33 @@ +###83. Remove Duplicates from Sorted List + +题目: + + + +难度: + +Easy + + + + +``` +class Solution(object): + def deleteDuplicates(self, head): + """ + :type head: ListNode + :rtype: ListNode + """ + cur = head + while cur: + if cur.next: + if cur.val == cur.next.val: + cur.next = cur.next.next + else: + cur = cur.next + # cur.next None + else: + break + return head + +``` \ No newline at end of file diff --git a/086._partition_list.md b/086._partition_list.md new file mode 100644 index 000000000..c1fd2dca0 --- /dev/null +++ b/086._partition_list.md @@ -0,0 +1,56 @@ +###86. Partition List + + +题目: + + + +难度 : Medium + + +思路一: + + +最简单的思路就是两个dummy head,然后一个指向 小于的node,一个指向大于的node + + +思路二: + +不走寻常路了,使用两个指针,一个指向小于的尾巴,一个一直往后走,指向大于,然后交换node + +完成比完美更重要啊,其实可以先试试用简单方法,因为我用我的不走寻常路画了比较久的图,写起来也稍显没那么美观,还在交换node的部分卡了一会 + + + +``` +class Solution(object): + def partition(self, head, x): + """ + :type head: ListNode + :type x: int + :rtype: ListNode + """ + dummy = ListNode(-1) + dummy.next = head + + p1 = p2 = dummy + + while p1.next and p1.next.val < x: + p1 = p1.next + + p2 = p1.next + + while p2: + while p2.next and p2.next.val >= x: + p2 = p2.next + + if p2.next == None: + break + node = p2.next + p2.next = node.next + node.next = p1.next + p1.next = node + p1 = p1.next + + return dummy.next +``` \ No newline at end of file diff --git a/088._merge_sorted_array.md b/088._merge_sorted_array.md new file mode 100644 index 000000000..935310045 --- /dev/null +++ b/088._merge_sorted_array.md @@ -0,0 +1,56 @@ +###88. Merge Sorted Array + + +题目: + + + +难度 : Easy + +并不easy和容易写对 + +给的数组可能是这样的 + +nums1 : [0] +m : 0 +nums2 : [1] +n : 1 + + +设置指针p = m + n -1, p1 = m - 1, p2 = n - 1 + +从末端开始,哪个数更大就放末端,两个指针都走到-1才算走完,问题可能出现在p1走完但是p2还没走完,所以添加一个多的loop来检查,想之上的例子就可以理解 + + +AC代码 + + +``` +class Solution(object): + def merge(self, nums1, m, nums2, n): + """ + :type nums1: List[int] + :type m: int + :type nums2: List[int] + :type n: int + :rtype: void Do not return anything, modify nums1 in-place instead. + """ + p = m + n -1 + p1 = m - 1 + p2 = n - 1 + while p2 >= 0 and p1 >= 0 : + if nums2[p2] > nums1[p1]: + nums1[p] = nums2[p2] + p2 -= 1 + else: + nums1[p] = nums1[p1] + p1 -= 1 + p -= 1 + + + + for i in range(p2,-1,-1): + nums1[p] = nums2[i] + p -= 1 + +``` \ No newline at end of file diff --git a/089._gray_code.md b/089._gray_code.md new file mode 100644 index 000000000..c0a9f193c --- /dev/null +++ b/089._gray_code.md @@ -0,0 +1,101 @@ +###89. Gray Code + + + +题目: + + + +难度: +Medium + +思路: + +首先不是从任何一个数开始都是有效的,所以naive的想法是从任何一个开始,然后如果能到2^n位,那么说明是有效的,问题解决. + +A gray code sequence must begin with 0. ->简化了一点 + +先写了一段代码: + +``` +def nextCode(curCode, res, n): + if curCode not in res: + res.append(curCode) + else: + return + if len(res) == pow(2,n): + return res + for i in range(n): + nCode = curCode[:] + nCode[i] = 1 if curCode[i] == 0 else 0 + nextCode(nCode,res,n) + +res = [] +nextCode([0,0,0],res,3) +print res +#[[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], [0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 0, 1]] +``` +实际上问题是这段代码的时间复杂度感觉很高,但是试试 + + +不失所望,到11就超时 + +``` + +class Solution(object): + def grayCode(self, n): + """ + :type n: int + :rtype: List[int] + """ + def nextCode(curCode, res, n): + if curCode not in res: + res.append(curCode) + else: + return + if len(res) == pow(2,n): + return res + for i in xrange(n): + nCode = curCode[:] + nCode[i] = 1 if curCode[i] == 0 else 0 + nextCode(nCode, res, n) + + def listoVal(curCode,n): + val = 0 + for i in range(n-1,-1,-1): + val += pow(2,i) * curCode[i] + return val + + + res = [] + nextCode([0]*n, res, n) + # print res + + val = [] + for i in res: + val.append(listoVal(i,n)) + return val +``` + +然后居然有这个东西: +Gray code,要用位运算!瞑目 + + + + +服气,这个待研究 +``` +class Solution(object): + def grayCode(self, n): + """ + :type n: int + :rtype: List[int] + """ + result = [(i>>1)^i for i in range(pow(2,n))] + return results +``` + + + + + diff --git a/090._subsets_ii.md b/090._subsets_ii.md new file mode 100644 index 000000000..9a1cdafd4 --- /dev/null +++ b/090._subsets_ii.md @@ -0,0 +1,47 @@ +###90. Subsets II + +题目: + + + +难度 : Medium + + +思路: + +参考别人的 + +现在来观察规律,与之前有不同之处是我们需要一个位置来mark,因为不再需要往之前出现过的地方再加了,看这个: + + +``` +[[],[1]] 是 [1] 的子集合 +[[],[1],[2],[1,2]] 是 [1,2] 的子集合,实际上就是1的子集合们加了一个2 +新来的2不能再从头开始加了,它需要从[ .., [2],[1,2] ]加 才是合理的 +``` + + +这里这个start是来记录了之前一次数组的长度,temp_size记住目前数组的长度,然后用这个来达到去重的目的,非常聪明 + + + + + +``` +class Solution(object): + def subsetsWithDup(self, nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + nums.sort() + result = [[]] + temp_size = 0 + for i in range(len(nums)): + start = temp_size if i >= 1 and nums[i] == nums[i-1] else 0 + temp_size = len(result) + for j in range(start, temp_size): + result.append(result[j] + [nums[i]]) + return result + +``` \ No newline at end of file diff --git a/091._decode_ways.md b/091._decode_ways.md new file mode 100644 index 000000000..3abd24a85 --- /dev/null +++ b/091._decode_ways.md @@ -0,0 +1,71 @@ +###91. Decode Ways + +题目: + + + + +tag : DP + +难度 : Medium + + + + + +``` +BASE CASE(len(s) = 1 和 len(s) = 2 ): +直接check + +非BASE CASE : +先令 dp[i] = 0 +如果s[i]是可以map的话 -> dp[i] += dp[i-1] 原本的s[0..i]decode方式加上s[i] +如果s[i-1,i]可以map的话 -> dp[i] += dp[i-2] 原本的s[0...i-1]decode方式加上s[i-1,i] +``` + + +Python代码(可美化) + +``` +class Solution(object): + def numDecodings(self, s): + """ + :type s: str + :rtype: int + """ + keys = ['1', '2', '3', '4', '5', '6', '7', '8', '9' ,'10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26'] + values = ['A', 'B','C', 'D', 'E', 'F', 'G','H', 'I', 'J', 'K', 'L', 'M' , 'N', 'O', 'P','Q', 'S', 'R', 'T', 'U','V', 'W', 'X','Y','Z'] + numbersToLetters = dict(zip(keys, values)) + + ways = {} + n = len(s) + for i in range(n): + ways[i] = 0 + if n == 0: + return 0 + elif n == 1 : + ways[0] = int(s in numbersToLetters) + elif n == 2: + if (s[0] in numbersToLetters) and (s[1] in numbersToLetters): + ways[1] += 1 + if (s in numbersToLetters): + ways[1] += 1 + else: + #s[0] + ways[0] = int(s[0] in numbersToLetters) + #s[01] + if (s[0] in numbersToLetters) and (s[1] in numbersToLetters): + ways[1] += 1 + if (s[:2] in numbersToLetters): + ways[1] += 1 + for i in range(2,n): + if s[i] in numbersToLetters: + ways[i] += ways[i-1] + if (s[i-1:i+1] in numbersToLetters): + ways[i] += ways[i-2] + + #print(ways[n-1]) + return ways[n-1] + +``` + diff --git a/092._reverse_linked_list_ii.md b/092._reverse_linked_list_ii.md new file mode 100644 index 000000000..f2b29da12 --- /dev/null +++ b/092._reverse_linked_list_ii.md @@ -0,0 +1,66 @@ +###92. Reverse Linked List II + +题目: + + + +难度: +Medium + + +跟 reverse linked list一样 + +思路: 找到 第 m 个node,然后开始reverse到第n个node,然后再把它们和原本的list连接起来 + +AC 代码 + +``` +class Solution(object): + def reverseBetween(self, head, m, n): + """ + :type head: ListNode + :type m: int + :type n: int + :rtype: ListNode + """ + # m == n, not reverse + if m == n : return head + + dummy = ListNode(-1) + dummy.next = head + + mbefore = dummy + cnt = 1 + + while mbefore and cnt < m: + mbefore = mbefore.next + cnt += 1 + + prev = None + cur = mbefore.next + tail1 = mbefore.next + + + while cnt <= n : + nxt = cur.next + cur.next = prev + prev = cur + cur = nxt + cnt += 1 + + + + mbefore.next = prev + tail1.next = cur + + return dummy.next +``` + +看了一下别人的代码,又比我写的好嘛,因为是保证m和n有效,用的是for循环先找到 m node: + + + for _ in range(m-1): + .... + + for _ in range(n-m): + reverse 操作 \ No newline at end of file diff --git a/093._restore_ip_addresses.md b/093._restore_ip_addresses.md new file mode 100644 index 000000000..55e31916b --- /dev/null +++ b/093._restore_ip_addresses.md @@ -0,0 +1,66 @@ +###93. Restore IP Addresses + +题目: + + + + +难度: + +Medium + + +基本思路已达到,等待AC之路 + +结果AC之路还是比较漫长的,因为不允许前缀为0困扰了一下 + +``` +class Solution(object): + def restoreIpAddresses(self, s): + """ + :type s: str + :rtype: List[str] + """ + self.res = [] + self.singgleAddresses([],s,4) + for i in range(len(self.res)): + self.res[i] = '.'.join(str(j) for j in self.res[i]) + return self.res + + + + def singgleAddresses(self, curRes, s, k): + """ + :type s: str + :rtype: List[str] + """ + if len(s) == 0 and k == 0: + if curRes not in self.res: + self.res.append(curRes) + if len(s) == 0 or k < 0: + return + else: + if self.between0And255(s[:1]): + self.singgleAddresses(curRes + [int(s[:1])], s[1:], k-1) + if self.between0And255(s[:2]): + self.singgleAddresses(curRes + [int(s[:2])], s[2:], k-1) + if self.between0And255(s[:3]): + self.singgleAddresses(curRes + [int(s[:3])], s[3:], k-1) + + def between0And255(self,s): + #前缀不允许为0 + if int(s) == 0 : + if len(s) == 1 : + return True + else: + return False + + if int(s) > 0 and s[0] == '0': + return False + if int(s) > 0 and int(s) <= 255: + return True + return False + +``` + + diff --git a/094._binary_tree_inorder_traversal.md b/094._binary_tree_inorder_traversal.md new file mode 100644 index 000000000..6056c4b47 --- /dev/null +++ b/094._binary_tree_inorder_traversal.md @@ -0,0 +1,70 @@ +###94. Binary Tree Inorder Traversal + +题目: + + + +难度: + +Medium + + +递归 + +``` +class Solution(object): + def inorderTraversal(self, root): + """ + :type root: TreeNode + :rtype: List[int] + """ + self.lst = [] + self.DFS(root) + return self.lst + + + def DFS(self,root): + if root == None: + return + if root.left: + self.DFS(root.left) + self.lst.append(root.val) + if root.right: + self.DFS(root.right) + +``` + +非递归用stack,我听谁讲过 😓 + +// to be done + + +via wikipedia + + +递归: + +``` +inorder(node) + if (node = null) + return + inorder(node.left) + visit(node) + inorder(node.right) +``` + + +非递归,跟之前那个iterator有得一拼,其实好几个题都是在玩这个花样? + +``` +iterativeInorder(node) + s ← empty stack + while (not s.isEmpty() or node ≠ null) + if (node ≠ null) + s.push(node) + node ← node.left + else + node ← s.pop() + visit(node) + node ← node.right +``` \ No newline at end of file diff --git a/096._unique_binary_search_trees.md b/096._unique_binary_search_trees.md new file mode 100644 index 000000000..2e29cf929 --- /dev/null +++ b/096._unique_binary_search_trees.md @@ -0,0 +1,43 @@ +###96. Unique Binary Search Trees + + + +题目: + + + +难度: +Medium + +思路: + + +参照此处hint: + + + + +首先明确n个不等的数它们能构成的二叉搜索树的种类都是相等的. + +毫无头绪,对于1...n的bst,可以这样看,k可以作为root,那么1..k-1必定在左边,k+1...n必定在右边,而1...k-1课产生的bst树是dp[k-1],右边产生的数是dp[n-k],所以能生成的树的数量是 dp[k-1]* dp[n-k] + +dp[n] = sum(dp[k-1]*dp[n-k]),从0到k + + +``` +class Solution(object): + def numTrees(self, n): + """ + :type n: int + :rtype: int + """ + dp = [ 1 for i in range(n+1)] + + for i in range(2,n+1): + s = 0 + for k in range(i): + s += dp[k]*dp[i-k-1] + dp[i] = s + + return dp[-1] +``` \ No newline at end of file diff --git a/098._validate_binary_search_tree.md b/098._validate_binary_search_tree.md new file mode 100644 index 000000000..c4b5dcfbf --- /dev/null +++ b/098._validate_binary_search_tree.md @@ -0,0 +1,74 @@ +###98. Validate Binary Search Tree + +题目: + + + + +难度: + +Easy + + +以前做过这道题,valid binary tree,需要check两件事: + + +``` + 10 + / \ + 7 20 + / \ + 5 40 +``` + + +- node.left.val < node.val + - right subtree of left child, value < node.val +- node.right.val > node.val + - left subtree of the right child, value > node.val + + +wikipedia上有伪码: + +``` +truct TreeNode { + int key; + int value; + struct TreeNode *left; + struct TreeNode *right; +}; + +bool isBST(struct TreeNode *node, int minKey, int maxKey) { + if(node == NULL) return true; + if(node->key < minKey || node->key > maxKey) return false; + + return isBST(node->left, minKey, node->key) && isBST(node->right, node->key, maxKey); +} + + +if(isBST(root, INT_MIN, INT_MAX)) { + puts("This is a BST."); +} else { + puts("This is NOT a BST!"); +} +``` + +实际上就是每次往下看,node都确保被夹在一个范围。 + +翻译了一下伪码,AC + + +``` +class Solution(object): + def isValidBST(self, root): + """ + :type root: TreeNode + :rtype: bool + """ + return self.isBST(root, float('-inf'),float('inf')) + + def isBST(self, root, minKey, maxKey): + if root == None: return True + if root.val <= minKey or root.val >= maxKey : return False + return self.isBST(root.left,minKey,root.val) and self.isBST(root.right, root.val, maxKey) +``` diff --git a/100._same_tree.md b/100._same_tree.md new file mode 100644 index 000000000..47dc25545 --- /dev/null +++ b/100._same_tree.md @@ -0,0 +1,32 @@ +###100. Same Tree + +题目: + + + + +难度: + +Easy + + +递归 + + +``` +class Solution(object): + def isSameTree(self, p, q): + """ + :type p: TreeNode + :type q: TreeNode + :rtype: bool + """ + if p == None or q == None: + if p == None and q == None: + return True + else: + return False + else: + return p.val == q.val and self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right) +``` + diff --git a/101._symmetric_tree.md b/101._symmetric_tree.md new file mode 100644 index 000000000..58651ac01 --- /dev/null +++ b/101._symmetric_tree.md @@ -0,0 +1,48 @@ +###101. Symmetric Tree + +题目: + + + + +难度: + +Easy + + +两棵树symmetric, 有几种可能: + +- 均为none ,symmetric +- 左孩子,右孩子都不存在,并且值相等, symmetric +- 右子树 和 另一棵树的左子树相等,左子树 和另一颗树的右子树相等 🌲 + + +``` +class Solution(object): + def isSymmetric(self, root): + """ + :type root: TreeNode + :rtype: bool + """ + if root == None : + return True + return self.symmetric(root.left, root.right) + + + def symmetric(self,t1, t2): + # empty tree + if t1 == None or t2 == None: + if t1 == t2 == None: + return True + else: + return False + elif t1.val == t2.val: + return self.symmetric(t1.left,t2.right) and self.symmetric(t1.right, t2.left) + else: + return False +``` + +其实函数不应该定义为symmetric,应该定义为qual?更合适。 + + + diff --git a/102._binary_tree_level_order_traversal.md b/102._binary_tree_level_order_traversal.md new file mode 100644 index 000000000..80f7145d3 --- /dev/null +++ b/102._binary_tree_level_order_traversal.md @@ -0,0 +1,63 @@ +###102. Binary Tree Level Order Traversal + +题目: + + + + +难度: + +Easy + + +我觉得并不easy + +两种做法,利用curLevel和nextLevel来记录,然后按层append. + + +``` +class Solution(object): + def levelOrder(self, root): + """ + :type root: TreeNode + :rtype: List[List[int]] + """ + res = [] + + if root == None: return [] + + curLevel = [root] + while curLevel: + nextLevel = [] + tmpRes = [] + for node in curLevel: + tmpRes.append(node.val) + if node.left: nextLevel.append(node.left) + if node.right: nextLevel.append(node.right) + res.append(tmpRes) + curLevel = nextLevel + + return res +``` + + +第二种做法: + + + +``` +class Solution: + # @param root, a tree node + # @return a list of lists of integers + def preorder(self, root, level, res): + if root: + if len(res) < level+1: res.append([]) + res[level].append(root.val) + self.preorder(root.left, level+1, res) + self.preorder(root.right, level+1, res) + def levelOrder(self, root): + res=[] + self.preorder(root, 0, res) + return res +``` +用递归来记录每一层,需要更加学习,不算easy \ No newline at end of file diff --git a/103._binary_tree_zigzag_level_order_traversal.md b/103._binary_tree_zigzag_level_order_traversal.md new file mode 100644 index 000000000..3598fd91e --- /dev/null +++ b/103._binary_tree_zigzag_level_order_traversal.md @@ -0,0 +1,48 @@ +###103. Binary Tree Zigzag Level Order Traversal + +题目: + + + + +难度: + +Medium + + +继续用102 的算法作弊 + +使用102作弊的题目都需要再努力寻求一下别家解法 + +``` + +class Solution(object): + def zigzagLevelOrder(self, root): + """ + :type root: TreeNode + :rtype: List[List[int]] + """ + res = [] + if root == None: return [] + + curLevel = [root] + levelCount = 0 + while curLevel: + nextLevel = [] + tmpRes = [] + for node in curLevel: + tmpRes.append(node.val) + if node.left: nextLevel.append(node.left) + if node.right: nextLevel.append(node.right) + if levelCount % 2 == 0: + res.append(tmpRes) + else : + tmpRes.reverse() + res.append(tmpRes) + levelCount += 1 + curLevel = nextLevel + + return res +``` + + diff --git a/104._maximum_depth_of_binary_tree.md b/104._maximum_depth_of_binary_tree.md new file mode 100644 index 000000000..a11c7d872 --- /dev/null +++ b/104._maximum_depth_of_binary_tree.md @@ -0,0 +1,27 @@ +###104. Maximum Depth of Binary Tree + +题目: + + + +难度: + +Easy + + +简单题 + + +``` + +class Solution(object): + def maxDepth(self, root): + """ + :type root: TreeNode + :rtype: int + """ + if root == None: return 0 + elif root.right == None and root.left == None: return 1 + else: + return max(1 + self.maxDepth(root.left), 1+ self.maxDepth(root.right)) +``` diff --git a/105._construct_binary_tree_from_preorder_and_inorder_traversal.md b/105._construct_binary_tree_from_preorder_and_inorder_traversal.md new file mode 100644 index 000000000..7ed244dd9 --- /dev/null +++ b/105._construct_binary_tree_from_preorder_and_inorder_traversal.md @@ -0,0 +1,100 @@ +###105. Construct Binary Tree from Preorder and Inorder Traversal + +题目: + + + +难度 : Medium + + +preorder 是 根 -> 左 -> 右 +inorder 是 左 -> 根 -> 右 + + +首先pre的第一个就是整个树的root, 假设 pre[0] = in[k],那么in的前k-1个就是树的左子树,后面部分就是树的右子树,这样递归来看. + +然后递归来看,对于前k-1个又是同样的道理吧。 + +然后用递归,写了一颗小树测试,感觉上是对的, + + +``` +class TreeNode(object): + def __init__(self, x): + self.val = x + self.left = None + self.right = None + +nodeA = TreeNode('A') +nodeB = TreeNode('B') +nodeC = TreeNode('C') +nodeD = TreeNode('D') +nodeE = TreeNode('E') +nodeF = TreeNode('F') + +nodeA.left = nodeB +nodeA.right = nodeC +nodeB.left = nodeD +nodeB.right = nodeE +nodeC.left = nodeF + + + # A + # / \ + # B C + # / \ / + # D E F + + +def construct(preorder, inorder): + if preorder == inorder == []: + return None + else: + rootVal = preorder[0] + root = TreeNode(rootVal) + k = inorder.index(rootVal) + if len(preorder) == len(inorder) == 1: + return root + else: + root.left = construct(preorder[1:1+k],inorder[:k]) + root.right = construct(preorder[k+1:],inorder[k+1:]) + return root +root = construct(['A','B','D','E','C','F'],['D','B','E','A','F','C']) + +``` + +尝试AC发现,memory limit超,用大一点的数据测试RecursionError: maximum recursion depth exceeded。 + +根据网上的参考改成偏iteration一点的递归, AC通过 + +mark一下,为了避免数组的复杂操作,这里直接用左右界和数组的引用来代表一段前序遍历和中序遍历。直接用递归更改list本身不能AC,但是变成这样就可以AC,因为更改数组会拷贝数组带来很多内存和递归上的麻烦,是这样的么? + +这个技巧还比较常见,就是用原本list的角标,而不去cut list本身 + + +``` +class Solution(object): + def buildTree(self, preorder, inorder): + """ + :type preorder: List[int] + :type inorder: List[int] + :rtype: TreeNode + """ + def buildTree(preorder, inorder, lp, rp, li, ri): + if lp > rp or li > ri: + return None + + root = TreeNode(preorder[lp]) + k = inorder.index(preorder[lp]) + + # left node + left = buildTree(preorder, inorder, lp+1, lp + k - li, li, k - 1) + right = buildTree(preorder, inorder, lp + k - li + 1, rp, k+1, ri) + + root.left = left + root.right = right + + return root + + return buildTree(preorder, inorder, 0 , len(preorder) - 1, 0, len(inorder) -1) +``` diff --git a/106._construct_binary_tree_from_inorder_and_postorder_traversal.md b/106._construct_binary_tree_from_inorder_and_postorder_traversal.md new file mode 100644 index 000000000..61331c520 --- /dev/null +++ b/106._construct_binary_tree_from_inorder_and_postorder_traversal.md @@ -0,0 +1,68 @@ +###106. Construct Binary Tree from Inorder and Postorder Traversal + +题目: + + + +难度 : Medium + + +inorder 是 左 -> 根 -> 右 +postorder 是 左 -> 右 -> 根 + + +跟105基本一样 + +还是先弄了一个递归可用版本 + + +``` +def buildTree(inorder, postorder): + """ + :type preorder: List[int] + :type inorder: List[int] + :rtype: TreeNode + """ + if postorder == inorder == []: + return None + else: + rootVal = postorder[-1] + root = TreeNode(rootVal) + k = inorder.index(rootVal) + root.left = buildTree(inorder[:k],postorder[:k]) + root.right = buildTree(inorder[k+1:],postorder[k:-1]) + return root + +``` +照抄105 + + +``` +class Solution(object): + def buildTree(self, inorder, postorder): + """ + :type inorder: List[int] + :type postorder: List[int] + :rtype: TreeNode + """ + def buildTree(inorder, postorder, li, ri ,lp, rp ): + if lp > rp or li > ri: + return None + + root = TreeNode(postorder[rp]) + k = inorder.index(postorder[rp]) + + # left node + left = buildTree(inorder, postorder, li, k-1, lp, lp + k - li - 1) + right = buildTree(inorder, postorder, k+1, ri, lp+k-li, rp-1) + + root.left = left + root.right = right + + return root + + return buildTree(inorder, postorder, 0, len(inorder) - 1, 0, len(postorder) - 1) + +``` + + diff --git a/107._binary_tree_level_order_traversal_ii.md b/107._binary_tree_level_order_traversal_ii.md new file mode 100644 index 000000000..a7fd3d732 --- /dev/null +++ b/107._binary_tree_level_order_traversal_ii.md @@ -0,0 +1,48 @@ +###107. Binary Tree Level Order Traversal II + +题目: + + + + +难度: + +Easy + + +用102 的算法作弊 + + +``` +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def levelOrderBottom(self, root): + """ + :type root: TreeNode + :rtype: List[List[int]] + """ + res = [] + + if root == None: return [] + + curLevel = [root] + while curLevel: + nextLevel = [] + tmpRes = [] + for node in curLevel: + tmpRes.append(node.val) + if node.left: nextLevel.append(node.left) + if node.right: nextLevel.append(node.right) + res.append(tmpRes) + curLevel = nextLevel + res.reverse() + return res +``` + + diff --git a/108._convert_sorted_array_to_binary_search_tree.md b/108._convert_sorted_array_to_binary_search_tree.md new file mode 100644 index 000000000..12705f918 --- /dev/null +++ b/108._convert_sorted_array_to_binary_search_tree.md @@ -0,0 +1,41 @@ +###108. Convert Sorted Array to Binary Search Tree + +题目: + + + +难度: +Medium + + +思路: + +递归 + +- nums为空,return None +- nums 只有一个, return其为根节点 +- nums 大于一个,nums[n/2]为中间元素,根结点,nums[:mid]为左子树, nums[mid+1:]为右子树 + + +``` +class Solution(object): + def sortedArrayToBST(self, nums): + """ + :type nums: List[int] + :rtype: TreeNode + """ + n = len(nums) + + if n == 0 : + return None + if n == 1 : + return TreeNode(nums[0]) + else: + mid = n / 2 + root = TreeNode(nums[mid]) + root.left = self.sortedArrayToBST(nums[:mid]) + root.right = self.sortedArrayToBST(nums[mid+1:]) + return root + + +``` diff --git a/109._convert_sorted_list_to_binary_search_tree.md b/109._convert_sorted_list_to_binary_search_tree.md new file mode 100644 index 000000000..4ca36dc47 --- /dev/null +++ b/109._convert_sorted_list_to_binary_search_tree.md @@ -0,0 +1,47 @@ +###109. Convert Sorted List to Binary Search Tree + + + +题目: + + + +难度: + +Medium + +思路: + +跟解array to binary search tree一样,递归,找到list中间点,把它变成root,左边为左树,右边为右子树 + +值得注意的是需要找到的是list中间的前一个,所以用一个dummy node,然后反复使用linked list找中点的代码 + +``` +class Solution(object): + def sortedListToBST(self, head): + """ + :type head: ListNode + :rtype: TreeNode + """ + + if head == None: + return None + elif head.next == None: + return TreeNode(head.val) + else: + dummy = ListNode(-1) + dummy.next = head + slow, fast = dummy, dummy + while fast.next and fast.next.next: + slow = slow.next + fast = fast.next.next + + # print slow.val + mid = slow.next + slow.next = None + + root = TreeNode(mid.val) + root.left = self.sortedListToBST(head) + root.right = self.sortedListToBST(mid.next) + return root +``` diff --git a/110._balanced_binary_tree.md b/110._balanced_binary_tree.md new file mode 100644 index 000000000..4b32130f9 --- /dev/null +++ b/110._balanced_binary_tree.md @@ -0,0 +1,37 @@ +###110. Balanced Binary Tree + +题目: + + + +难度: +Easy + + +全程递归中 + + + +``` +class Solution(object): + def isBalanced(self, root): + """ + :type root: TreeNode + :rtype: bool + """ + if root == None: + return True + + lh = self.height(root.left) + rh = self.height(root.right) + + if abs(lh-rh) <= 1 and self.isBalanced(root.left) and self.isBalanced(root.right): + return True + return False + + + def height(self, node): + if node == None: + return 0 + return 1 + max(self.height(node.left),self.height(node.right)) +``` \ No newline at end of file diff --git a/111._minimum_depth_of_binary_tree.md b/111._minimum_depth_of_binary_tree.md new file mode 100644 index 000000000..a04d4164e --- /dev/null +++ b/111._minimum_depth_of_binary_tree.md @@ -0,0 +1,44 @@ +###111. Minimum Depth of Binary Tree + +题目: + + + +难度: + +Easy + +注意leaf node反正就是没有left和right的 + +比如下图 + + +``` +1 + \ + 2 +``` + +2是一个孩子节点 + + +``` +class Solution(object): + def minDepth(self, root): + """ + :type root: TreeNode + :rtype: int + """ + if root == None: + return 0 + elif root.left == None and root.right == None: + return 1 + else : + if root.left == None: + return 1 + self.minDepth(root.right) + elif root.right == None: + return 1 + self.minDepth(root.left) + else: + return min(1+ self.minDepth(root.left), 1+ self.minDepth(root.right)) + +``` \ No newline at end of file diff --git a/112._path_sum.md b/112._path_sum.md new file mode 100644 index 000000000..db20ec2aa --- /dev/null +++ b/112._path_sum.md @@ -0,0 +1,30 @@ +###112. Path Sum + +题目: + + + +难度: + +Easy + + +递归 + +``` +class Solution(object): + def hasPathSum(self, root, sum): + """ + :type root: TreeNode + :type sum: int + :rtype: bool + """ + if root == None: + return False + else: + if root.val == sum and (root.left == None and root.right == None): + return True + else: + return self.hasPathSum(root.left, sum - root.val) or self.hasPathSum(root.right, sum - root.val) + +``` diff --git a/113._path_sum_ii.md b/113._path_sum_ii.md new file mode 100644 index 000000000..21cb0fabf --- /dev/null +++ b/113._path_sum_ii.md @@ -0,0 +1,48 @@ +###113. Path Sum II + +题目: + + + + + +tag : DFS + + +难度 : Medium + + +注意宁愿写几次curList + [root.val] 也不要直接传一个list进去,因为list pass by reference的亏已经吃过了 + +``` +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def pathSum(self, root, sum): + """ + :type root: TreeNode + :type sum: int + :rtype: List[List[int]] + """ + result = [] + self.auxPathSum(root,sum,[],result) + return result + + def auxPathSum(self, root, sum, curList, curLists): + if root == None: + return + sum -= root.val + if sum == 0 and (root.left == None and root.right == None): + curLists.append(curList + [root.val]) + return + if root.left != None: + self.auxPathSum(root.left, sum - root.val, curList + [root.val],curLists) + if root.right != None: + self.auxPathSum(root.right, sum - root.val, curList + [root.val],curLists) +``` + diff --git a/114._flatten_binary_tree_to_linked_list.md b/114._flatten_binary_tree_to_linked_list.md new file mode 100644 index 000000000..f23fd7870 --- /dev/null +++ b/114._flatten_binary_tree_to_linked_list.md @@ -0,0 +1,42 @@ +###114. Flatten Binary Tree to Linked List + +题目: + + + +难度: + +Medium + + +有hint,又是玩DFS的preorder,用的loop,也不算很聪明的算法 + +用stack来放node,每次把pop出来的node左边变成null,把它的right指向下一个pop出来的node,也就是为嘛有prev,然后root处特殊处理一下 + + +``` + +class Solution(object): + def flatten(self, root): + """ + :type root: TreeNode + :rtype: void Do not return anything, modify root in-place instead. + """ + if root == None: + return + s = [] + s.append(root) + prev = root + while s: + node = s.pop() + if node.right: + s.append(node.right) + if node.left: + s.append(node.left) + node.left = None + if node == root: + continue + else: + prev.right = node + prev = node +``` diff --git a/116._populating_next_right_pointers_in_each_node.md b/116._populating_next_right_pointers_in_each_node.md new file mode 100644 index 000000000..ed51a5c1e --- /dev/null +++ b/116._populating_next_right_pointers_in_each_node.md @@ -0,0 +1,36 @@ +###116. Populating Next Right Pointers in Each Node + +题目: + + + + +难度: + +Medium + +思路: 跟level print一样,把每个level由左到右记录。 +然后这层level的右指向右,最后一个指向None。 +处理一下边界条件,完工。 + +看题目tag给的DFS,所以是否有哪种push & pop stack的方法可以特别来处理指向呢-》 有待研究 + +``` +class Solution(object): + def connect(self, root): + """ + :type root: TreeLinkNode + :rtype: nothing + """ + if root == None: return root + thislevel = [root] + while thislevel: + nextlevel = list() + for n in thislevel: + if n.left: nextlevel.append(n.left) + if n.right: nextlevel.append(n.right) + for i in range(len(thislevel)-1): + thislevel[i].next = thislevel[i+1] + thislevel[-1].next = None + thislevel = nextlevel +``` diff --git a/118._pascal's_triangle.md b/118._pascal's_triangle.md new file mode 100644 index 000000000..72e7a44f9 --- /dev/null +++ b/118._pascal's_triangle.md @@ -0,0 +1,36 @@ +###118. Pascal's Triangle + +题目: + + + + +难度: + +Easy + + +高中数学知识,把行数理理清楚就ok + + +``` +class Solution(object): + def generate(self, numRows): + """ + :type numRows: int + :rtype: List[List[int]] + """ + res = [[1],[1,1]] + if numRows < 3: + return res[:numRows] + for i in range(3, numRows+1): + tmp = [1] * i + for j in range(1,i-1): + tmp[j] = res[i-2][j-1] + res[i-2][j] + res.append(tmp) + return res + + +``` + + diff --git a/119. Pascal's Triangle II.md b/119. Pascal's Triangle II.md new file mode 100644 index 000000000..dbf97df9d --- /dev/null +++ b/119. Pascal's Triangle II.md @@ -0,0 +1,59 @@ +### 119. Pascal's Triangle II + +题目: + + +难度 : Easy + + + +思路: + +高中数学 + + + +这种算法会超时||| + +``` +class Solution(object): + def getRow(self, rowIndex): + """ + :type rowIndex: int + :rtype: List[int] + """ + def combNum(n,k): + if k == 0 or k == n : + return 1 + return combNum(n-1,k-1) + combNum(n-1,k) + res = [] + for i in range(rowIndex + 1): + res.append(combNum(rowIndex,i)) + + return res +``` + + + +用118改的,AC代码 + + + +``` +class Solution(object): + def getRow(self, rowIndex): + """ + :type rowIndex: int + :rtype: List[int] + """ + res = [[1],[1,1]] + if rowIndex < 2: + return res[rowIndex] + for i in range(3, rowIndex+2): + tmp = [1] * i + for j in range(1,i-1): + tmp[j] = res[i-2][j-1] + res[i-2][j] + res.append(tmp) + return res[-1] +``` + diff --git a/120. Triangle.md b/120. Triangle.md new file mode 100644 index 000000000..954a28cb8 --- /dev/null +++ b/120. Triangle.md @@ -0,0 +1,72 @@ +### 120. Triangle + +题目: + + + +难度: +Medium + +思路: + +先是要注意下这句话:**Each step you may move to adjacent numbers on the row below** + +在考虑adjacent number的定义,并不是角标的adjacent,而是真的形态上的adjacent + +比如 + +``` + -1 -1 + 2 1 最小 1 0 +-2 2 0 -1 2 0 +``` + +最小是-1, 而并不能从第二排的0跳到第三排的第一个造成-2. + + so AC代码 + +感觉关于dp,我可能还需要补一些东西,因为我不能做到O(n) space + +``` +class Solution(object): + def minimumTotal(self, triangle): + """ + :type triangle: List[List[int]] + :rtype: int + """ + # n total rows of triangle + n = len(triangle) + if n == 1: return triangle[0][0] + elif n == 2 : return min(triangle[0][0] + triangle[1][0], triangle[0][0] + triangle[1][1]) + else: + res = [] + for i in range(n): + res.append(triangle[i]) + + res[0] = [triangle[0][0]] + res[1] = [triangle[0][0] + triangle[1][0], triangle[0][0] + triangle[1][1]] + + for i in range(2,n): + for j in range(i+1): + if j == 0: + res[i][j] = res[i-1][j] + triangle[i][j] + elif j == i: + res[i][j] = res[i-1][-1] + triangle[i][j] + else: + res[i][j] = min(res[i-1][j-1],res[i-1][j]) + triangle[i][j] + + return min(res[-1]) +``` + + + + + + + + + + + + + diff --git a/125._valid_palindrome.md b/125._valid_palindrome.md new file mode 100644 index 000000000..f79899e2d --- /dev/null +++ b/125._valid_palindrome.md @@ -0,0 +1,63 @@ +###125. Valid Palindrome + +题目: + + + +难度: + +Easy + +根据这个palindrome原理来看,running time比较慢 + +``` +class Solution(object): + def isPalindrome(self,s): + """ + :type s: str + :rtype: bool + """ + Alphabets = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9'] + i = 0 + j = len(s) - 1 + palindrome = True + lowerS = s.lower() + while i < j: + if lowerS[i] not in Alphabets: + i += 1 + continue + if lowerS[j] not in Alphabets: + j -= 1 + continue + if lowerS[i] != lowerS[j]: + print(i,lowerS[i],j,lowerS[j]) + return False + # s[i] == s[j] + else: + i += 1 + j -= 1 + return palindrome + +``` + +当然也有取巧的办法,就是比较reversed string 和原本的是否相等. +Running time 提升了一点 + +``` +class Solution(object): + def isPalindrome(self,s): + """ + :type s: str + :rtype: bool + """ + + new=[] + + s=s.lower() + + for i in s: + if '0'<=i<='9' or 'a'<=i<='z': + new.append(i) + + return new==new[::-1] +``` \ No newline at end of file diff --git a/126. Word Ladder II.md b/126. Word Ladder II.md new file mode 100644 index 000000000..e6ef281cc --- /dev/null +++ b/126. Word Ladder II.md @@ -0,0 +1,101 @@ +###126. Word Ladder II + +题目: + + + +难度: + +Hard + +其实关键在于怎么优化和表示图 + + + +思路来自1p3a: + +这题目实在是太适合python了  如此简洁 + +就是基本的bfs,典型的level order traverse +有两个坑: + +1. 不要判断字典里的某两个word是否只相差一个字母,而是要判断某个word的邻居(和他只相差一个字母的所有word)是否在字典里,这样的改进会使这一步的复杂度下降了很多,否则超时妥妥 +2. 记录每一层已经访问过的word,一层结束后把他们加到大的visited里面,记住每次要访问的word不可以是在visited里面的 + +最后见到end word就收 +完成 + + + +拿题目的例子来看: + +```\ + hit + | + hot + / \ + dot lot + | | + dog log + \ / + cog +``` + +生成了如下的一个trace 字典,然后再根据这个来寻找路径 + +`{'cog': ['log', 'dog'], 'hit': [], 'log': ['lot'], 'dog': ['dot'], 'hot': ['hit'], 'lot': ['hot'], 'dot': ['hot']}` + +而生成字典的过程就是BFS的,此处保证寻找的路径就是最短的。 + +AC代码: + +``` +class Solution(object): + def findLadders(self, beginWord, endWord, wordlist): + """ + :type beginWord: str + :type endWord: str + :type wordlist: Set[str] + :rtype: List[List[int]] + """ + def backtrack(result, trace, path, word): + if len(trace[word]) == 0: + result.append([word] + path) + else: + for prev in trace[word]: + backtrack(result, trace, [word] + path, prev) + + + wordSet = set(wordlist) + wordSet.add(beginWord) + wordSet.add(endWord) + + result, trace, current = [], {word: [] for word in wordSet}, set([beginWord]) + # print result, trace, current + while current and endWord not in current: + for word in current: + wordSet.remove(word) + net = set([]) + for word in current: + for i in range(len(word)): + for j in 'abcdefghijklmnopqrstuvwxyz': + candidate = word[:i] + j + word[i+1:] + if candidate in wordSet: + trace[candidate].append(word) + net.add(candidate) + current = net + + if current: + backtrack(result, trace, [], endWord) + return result +``` + + + +这样可以beat 约 60% + + + + + + diff --git a/127._word_ladder.md b/127._word_ladder.md new file mode 100644 index 000000000..e602a0847 --- /dev/null +++ b/127._word_ladder.md @@ -0,0 +1,85 @@ +###127. Word Ladder + +题目: + + + + +难度: + +Medium + +tag可以算BFS,其实就是求shortest path的变体 + +按照BFS的微码改了一下,尝试AC,超时 + +``` +class Solution(object): + def ladderLength(self, beginWord, endWord, wordList): + """ + :type beginWord: str + :type endWord: str + :type wordList: Set[str] + :rtype: int + """ + queue = [(beginWord, [beginWord])] + visited = set() + + while queue: + (vertex, path) = queue.pop(0) + if vertex not in visited: + if self.oneDiff(vertex, endWord): + return len(path) + 1 + visited.add(vertex) + for word in wordList: + if self.oneDiff(vertex, word): + queue.append((word, path + [word])) + return 0 + + def oneDiff(self,s1, s2): + countDiffs = 0 + for a, b in zip(s1,s2): + if a != b: + countDiffs += 1 + return countDiffs == 1 +``` + +着手优化 + + +实在发现优化基本无所提升,然后看别人的解法,思路一致,但是用了collection里面的结构deque和增加set帮助解题。 + +collection有待研究 + +``` +class Solution(object): + def ladderLength(self, beginWord, endWord, wordList): + """ + :type beginWord: str + :type endWord: str + :type wordList: Set[str] + :rtype: int + """ + from collections import deque, defaultdict + + queue = deque([(beginWord, [beginWord])]) + visited = set() + wordSet = set(wordList) + wordSet.add(endWord) + + while queue: + (vertex, path) = queue.popleft() + if vertex not in visited: + if vertex == endWord: + return len(path) + visited.add(vertex) + for i in range(len(beginWord)): + part1 = vertex[:i]; part2 = vertex[i+1:] + for j in 'abcdefghijklmnopqrstuvwxyz': + if vertex[i] != j: + nextWord = part1 + j + part2 + if nextWord in wordSet: + queue.append((nextWord, path + [nextWord])) + wordSet.remove(nextWord) + return 0 +``` \ No newline at end of file diff --git a/129._sum_root_to_leaf_numbers.md b/129._sum_root_to_leaf_numbers.md new file mode 100644 index 000000000..cedbdcd74 --- /dev/null +++ b/129._sum_root_to_leaf_numbers.md @@ -0,0 +1,37 @@ +###129. Sum Root to Leaf Numbers + +题目: + + + +难度: + +Medium + +其实递归不难想到,不过我自己做错在细节方面 + +如果只有单支,每朝下走一层,代表的数字都增加10, 10* 原本的 + 新节点的数字,最终也是用这个来解 + +``` +class Solution(object): + def sumNumbers(self, root): + """ + :type root: TreeNode + :rtype: int + """ + return self.calSum(root,0) + + + def calSum(self,root,curSum): + if root == None: + return 0 + else: + curSum = curSum * 10 + root.val + if root.left == None and root.right == None: + return curSum + else: + return self.calSum(root.left, curSum) + self.calSum(root.right, curSum) + + + +``` diff --git a/130._surrounded_regions.md b/130._surrounded_regions.md new file mode 100644 index 000000000..a0f76e264 --- /dev/null +++ b/130._surrounded_regions.md @@ -0,0 +1,147 @@ +###130. Surrounded Regions + + +题目: + + + + +难度: + +Medium + + +思路: + +loop,然后碰到O做DFS/BFS找出O所在区域: + +- 貌似只要O没有碰壁,O就总是被X包围着? +- 所以找出O的范围,然后看它是否碰壁,没有碰壁则mark不需要修改 + +但是这道题折磨我了很久,因为它有毛病。。。。 +它给的input例子是 +["XXX","XOX","XXX"] +也怪我 input写着List[List[str]] + +但实际上的输入是: +[[u'X', u'X', u'X'], [u'X', u'X', u'X'], [u'X', u'X', u'X']] + + +还要mark unicode + +还有就是学会了新的可以函数之下定义函数,这样就不用什么self了,用起来真方便,但是这样的思路做起来会超时。 + + + +``` +class Solution(object): + def solve(self, board): + """ + :type board: List[List[str]] + :rtype: void Do not return anything, modify board in-place instead. + """ + + + def shouldOChange(i, j): + """ + return x,y area and whether they shouldChange + """ + shouldChange = True + Oarea = [] + s = [] + s.append((i,j)) + while s: + (x,y) = s.pop() + if x == 0 or x == row - 1 or y == 0 or y == col -1 : + shouldChange = False + visited[x][y] = 1 + Oarea.append((x,y)) + if legal(x-1,y): + s.append((x-1,y)) + if legal(x+1,y): + s.append((x+1,y)) + if legal(x,y-1): + s.append((x,y-1)) + if legal(x,y-1): + s.append((x,y+1)) + return Oarea,shouldChange + + def legal(x,y): + return x>=0 and x < row and y>=0 and y < col and board[x][y] == 'O' and visited[x][y] == 0 + + + row = len(board) + col = len(board[0]) if row else 0 + + visited = [[0 for i in range(col)] for j in range(row)] + + for i in range(row): + for j in range(col): + if board[i][j] == 'O' and visited[i][j] == 0: + Oarea, shouldChange = shouldOChange(i,j) + print Oarea,shouldChange + if shouldChange: + for (x,y) in Oarea: + board[x][y] = u'X' + + print board +``` + + +另一个思路就是对周围碰壁的O做BFS/DFS,碰壁的和碰壁相连的是不需要修改的。这样就时间复杂度降低很多了。 + +原本是O(n^2)可能做DFS/BFS。现在是O(4n)做DFS/BFS,但是发现依旧超时,最后查看了别人的解法,因为我的解法里面多了一个存储工具,相当于,把需要更换location的位置存储起来,最后做loop的时候去查,然后这样还是很耗时。 + +而一个简便的变法是把这些特别的碰壁的'O' mark出来,这样最后loop的时候不改变这些'O',只改变不碰壁的'O',又可以减少工作量。同时依旧可以使用collection里面的queue + + + +AC代码 + +``` +class Solution(object): + def solve(self, board): + """ + :type board: List[List[str]] + :rtype: void Do not return anything, modify board in-place instead. + """ + def legal(x,y): + return x>=0 and x < row and y>=0 and y < col and board[x][y] == 'O' and visited[x][y] == 0 + + + row = len(board) + col = len(board[0]) if row else 0 + + visited = [[0 for i in range(col)] for j in range(row)] + + notChangeOArea = [] + queue = collections.deque() + + for j in range(col): + if board[0][j] == 'O': queue.append((0,j)) + if board[row-1][j] == 'O': queue.append((row-1,j)) + for i in range(row): + if board[i][0] == 'O': queue.append((i,0)) + if board[i][col-1] == 'O': queue.append((i,col-1)) + + while queue: + (x,y) = queue.popleft() + board[x][y] = '$' + visited[x][y] = 1 + if legal(x-1,y): + queue.append((x-1,y)) + if legal(x+1,y): + queue.append((x+1,y)) + if legal(x,y-1): + queue.append((x,y-1)) + if legal(x,y+1): + queue.append((x,y+1)) + + for i in range(row): + for j in range(col): + if board[i][j] == '$' : board[i][j] = 'O' + elif board[i][j] == 'O' : board[i][j] = 'X' +``` + + +同时发现,用这种方式,无论是否使用collection里面的queue,都能AC \ No newline at end of file diff --git a/131._palindrome_partitioning.md b/131._palindrome_partitioning.md new file mode 100644 index 000000000..45d404c89 --- /dev/null +++ b/131._palindrome_partitioning.md @@ -0,0 +1,48 @@ +###131. Palindrome Partitioning + +题目: + + + +难度: +Medium + +知道一定是用递归做,但是在怎么拆的部分疑惑了,然后看了hint + +key部分长这样,拆法是类似于combination,然后这个len(s) == 0是确保能被拆为palindrome,因为这样剩下的string才是空的 + + +这个recursion tree是这样的,感觉时间复杂度是O(n!),因为每次树都branch n个分支 + +``` + +class Solution(object): + def partition(self, s): + """ + :type s: str + :rtype: List[List[str]] + """ + self.res = [] + self.dfs(s,[]) + return self.res + + + def dfs(self, s, stringList): + if len(s) == 0: + self.res.append(stringList) + for i in range(1,len(s)+1): + if self.isPalindrome(s[:i]): + self.dfs(s[i:],stringList + [s[:i]]) + + def isPalindrome(self, s): + if len(s) <= 1: + return True + return s[0] == s[-1] and self.isPalindrome(s[1:-1]) + +a = Solution() +print a.partition("aab") + +# [['a', 'a', 'b'], ['aa', 'b']] +``` + +输出是每次必定从单个char的list开始,然后单个char 配 palindrome word,然后palindrome word再来配char... \ No newline at end of file diff --git a/133._clone_graph.md b/133._clone_graph.md new file mode 100644 index 000000000..39921e282 --- /dev/null +++ b/133._clone_graph.md @@ -0,0 +1,66 @@ +###133. Clone Graph + + +题目: + + + +难度: +Medium + + + +思路: + +DFS或者BFS把graph traverse一遍,边traverse边复制。因为nodes are labeled uniquely,这就是方便的地方,但是注意node可能重复和有self-loop. + +所以先建立新的root node,然后有一个dict把node label和node一一对应。 + +用stack来存储原本的graph root node,对原本的graph做DFS,这个时候,如果这个node的neighbor是已经出现过,那么我们就是去修改原本的existNode,让它指向存在的neighbor,否则创建新的,再把它们联系起来,谷歌了一下,别人写的比我更简单。anyway,先AC。 + + + +`if cur.label in createdNodes:`多余。 + + + + +``` +class Solution(object): + def cloneGraph(self, node): + """ + :type node: UndirectedGraphNode + :rtype: UndirectedGraphNode + """ + if node == None: return None + + root = UndirectedGraphNode(node.label) + # must 1 to 1 + createdNodes = {} + createdNodes[root.label] = root + + stack = [] + stack.append(node) + + while stack: + cur = stack.pop() + if cur.label in createdNodes: + existNode = createdNodes[cur.label] + for neighbor in cur.neighbors: + if neighbor.label in createdNodes: + existNeighbor = createdNodes[neighbor.label] + existNode.neighbors.append(existNeighbor) + else: + newNode = UndirectedGraphNode(neighbor.label) + existNode.neighbors.append(newNode) + createdNodes[neighbor.label] = newNode + stack.append(neighbor) + return root +``` + + + +看了别人的代码,貌似比我又写的简洁。 + + + diff --git a/136._single_number.md b/136._single_number.md new file mode 100644 index 000000000..67fdc7dcf --- /dev/null +++ b/136._single_number.md @@ -0,0 +1,43 @@ +###136. Single Number + + + +题目: + + + +难度: + +Easy + + +思路: + +位运算,终于要take it了 + +非常常见的一道算法题,将所有数字进行异或操作即可。对于异或操作明确以下三点: + +- 一个整数与自己异或的结果是0 +- 一个整数与0异或的结果是自己 +- 异或操作满足交换律,即a^b=b^a + +Python的位操作: + + +神奇的解法: + + +``` +class Solution(object): + def singleNumber(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + result = nums[0] + + for i in nums[1:]: + result ^= i + return result +``` + diff --git a/139._word_break.md b/139._word_break.md new file mode 100644 index 000000000..45d941fb3 --- /dev/null +++ b/139._word_break.md @@ -0,0 +1,61 @@ +###139. Word Break + +题目: + + + +难度: + +Medium + + + +超时,无法AC + +backtracking,或者叫递归,简直超时小公主了 + +``` +class Solution(object): + def wordBreak(self, s, wordDict): + """ + :type s: str + :type wordDict: Set[str] + :rtype: bool + """ + self.res = [] + self.wordBreakLst([],s,wordDict) + for r in self.res: + return set(wordDict) >= set(r) + return False + + + def wordBreakLst(self, lst, rest, wordDict): + if rest == '': + self.res.append(lst) + for i in range(1+len(rest)): + if rest[:i] in wordDict: + self.wordBreakLst(lst+[rest[:i]],rest[i:],wordDict) +``` + + +然后发现别人家的孩子,大家都用的动规.时间复杂度由O(2^n) -> O(n^2) + +``` +class Solution(object): + def wordBreak(self, s, wordDict): + """ + :type s: str + :type wordDict: Set[str] + :rtype: bool + """ + dp = [False for i in range(1+len(s))] + dp[0] = True + for i in range(1,len(s)+1): + for k in range(i): + if dp[k] and s[k:i] in wordDict: + dp[i] = True + return dp[len(s)] +``` + +还是刷的不够多 + diff --git a/140._word_break_ii.md b/140._word_break_ii.md new file mode 100644 index 000000000..2f48adf7b --- /dev/null +++ b/140._word_break_ii.md @@ -0,0 +1,119 @@ + +###140. Word Break II + +题目: + + + +难度: + +Medium + + + +还是backtracking,会超时 + +``` +class Solution(object): + def wordBreak(self, s, wordDict): + """ + :type s: str + :type wordDict: Set[str] + :rtype: bool + """ + self.res = [] + self.wordBreakLst("",s,wordDict) + return self.res + + + def wordBreakLst(self, lst, rest, wordDict): + if rest == '': + self.res.append(lst.rstrip()) + # print lst + for i in range(1+len(rest)): + if rest[:i] in wordDict: + self.wordBreakLst(lst + rest[:i] + " ",rest[i:],wordDict) + +``` + + + + +然后看到有把word break i 结合起来减少时间复杂度的作法。 + + +做法如下,聪明: + +就是对于每一个s,我们来check它是否可以break,如果不可以,就不用做相应的操作了 + +举例 + +``` +s = "catsanddog" +传入wordBreakLst函数 + +首先check它是可以被分割的,于是开始分割 +stringLst = cat s[:i] = sanddog +继续传入s[:i] 进wordBreakLst again,还是可以分割,stringLst = ' cat sand' +继续 + +另外的是s[:i] = cats s[:i] = anddog +也是可以分割 + +画图就是类似这样 + + + catsanddog | | + cat cats + | | sand and + / \ + dog dog + +``` + + + 解法 + +``` +class Solution(object): + def wordBreak(self, s, wordDict): + """ + :type s: str + :type wordDict: Set[str] + :rtype: bool + """ + self.res = [] + self.wordBreakLst(s,wordDict,"") + return self.res + + def check(self, s, wordDict): + dp = [False for i in range(1+len(s))] + dp[0] = True + for i in range(1,len(s)+1): + for k in range(i): + if dp[k] and s[k:i] in wordDict: + dp[i] = True + return dp[len(s)] + + + def wordBreakLst(self, s, wordDict, stringLst): + if self.check(s,wordDict): + if len(s) == 0 : self.res.append(stringLst[1:]) + for i in range(1,len(s)+1): + if s[:i] in wordDict: + self.wordBreakLst(s[i:], wordDict, stringLst + ' ' + s[:i]) +``` + + +但是其实 + +``` +s = "aaaaaa" +wordDict = ["a","aa","aaa"] +print a.wordBreak(s,wordDict)还是会loop很多次 + +不过像 +s = "aabbb" +wordDict = ["a","abbb"] +就会极其的减少loop次数 +``` diff --git a/141._linked_list_cycle.md b/141._linked_list_cycle.md new file mode 100644 index 000000000..e671e4942 --- /dev/null +++ b/141._linked_list_cycle.md @@ -0,0 +1,81 @@ +###141. Linked List Cycle + +题目: + + + + +难度: + +Easy + + +想法一: + +直接超时 + +``` +class Solution(object): + def hasCycle(self, head): + """ + :type head: ListNode + :rtype: bool + """ + if head == None: return False + lst = [] + cur = head + while cur: + if cur in lst: + return True + lst.append(cur) + cur = cur.next + return False +``` + + + +想法二:相当用boolean array记录某个点是否被访问过,时间,空间复杂度都是O(n) + +``` +class Solution(object): + def hasCycle(self, head): + """ + :type head: ListNode + :rtype: bool + """ + if head == None: return False + dictx = {} + cur = head + while cur: + if cur in dictx: + return True + dictx[cur] = 1 + cur = cur.next + return False +``` + +结果这种方法的run time还比较快 + +查了一下,有解答说可以有空间复杂度O(1),时间复杂度O(n)。两个指针,一个快一个慢,快的每次走两步,慢的每次走一步,如果有环,最终会在某处相遇。这也是一个算法。这种快慢指针配合已经不是第一次遇到了,比如找linklist中间的node。 + + + +但是并没有觉得这样的算法是O(n), worst case time complexity is O(N+K), which is O(n). + + +``` +class Solution(object): + def hasCycle(self, head): + """ + :type head: ListNode + :rtype: bool + """ + slow = head + fast = head + while slow and fast and fast.next: + slow = slow.next + fast = fast.next.next + if slow == fast: + return True + return False +``` diff --git a/143._reorder_list.md b/143._reorder_list.md new file mode 100644 index 000000000..59c9fb9fb --- /dev/null +++ b/143._reorder_list.md @@ -0,0 +1,112 @@ +###143. Reorder List + +题目: + + + + +难度: + +Medium + +超时 + + +``` + +class Solution(object): + def reorderList(self, head): + """ + :type head: ListNode + :rtype: void Do not return anything, modify head in-place instead. + """ + head = self.reorder(head) + + + def reorder(self, head): + if head == None or head.next == None or head.next.next == None: + return head + + l0 = head + l1 = head.next + ln_1 = self.oneNodeTail(head) + ln =ln_1.next + + l0.next = ln + ln_1.next = None + ln.next = self.reorder(l1) + return l0 + + + def oneNodeTail(self, head): + if head == None or head.next == None or head.next.next == None: + return head + cur = head + while cur.next: + if cur.next.next: + cur = cur.next + else: + break + return cur + +``` + + +取巧的办法是: + +找到中间节点,断开,把后半截linked list reverse,然后合并 √ + +看了AC指南 + +``` +class Solution(object): + def reorderList(self, head): + """ + :type head: ListNode + :rtype: void Do not return anything, modify head in-place instead. + """ + if head == None or head.next == None or head.next.next == None: + return + + slow = head + fast = head + prev = None + + while fast and fast.next: + prev = slow + slow = slow.next + fast = fast.next.next + + prev.next = None + + + slow = self.reverseList(slow) + + cur = head + while cur.next: + tmp = cur.next + cur.next = slow + slow = slow.next + cur.next.next = tmp + cur = tmp + cur.next = slow + + + + def reverseList(self,head): + """ + :type head: ListNode + :rtype: ListNode + """ + prev = None + cur = head + while(cur): + nxt = cur.next + cur.next = prev + prev = cur + cur = nxt + return prev + + +``` + diff --git a/144._binary_tree_preorder_traversal.md b/144._binary_tree_preorder_traversal.md new file mode 100644 index 000000000..805a59dca --- /dev/null +++ b/144._binary_tree_preorder_traversal.md @@ -0,0 +1,63 @@ +###144. Binary Tree Preorder Traversal + +题目: + + + + +难度: + +Medium + +Recursive + + +``` +class Solution(object): + def preorderTraversal(self, root): + """ + :type root: TreeNode + :rtype: List[int] + """ + if root == None: + return [] + res = [] + self.preorder(root,res) + return res + + + def preorder(self,root,res): + if root == None: + return + res.append(root.val) + self.preorder(root.left,res) + self.preorder(root.right,res) +``` + + +Iterative + + +``` +class Solution(object): + def preorderTraversal(self, root): + """ + :type root: TreeNode + :rtype: List[int] + """ + if root == None: + return [] + res = [] + + stack = [] + stack.append(root) + while stack: + node = stack.pop() + res.append(node.val) + if node.right: + stack.append(node.right) + if node.left: + stack.append(node.left) + return res + +``` \ No newline at end of file diff --git a/145._binary_tree_postorder_traversal.md b/145._binary_tree_postorder_traversal.md new file mode 100644 index 000000000..788cfc623 --- /dev/null +++ b/145._binary_tree_postorder_traversal.md @@ -0,0 +1,67 @@ +###145. Binary Tree Postorder Traversal + +题目: + + + + +难度: + +Hard + +wikipedia 助你幸福 + +递归版本 + +``` +postorder(node) + if (node = null) + return + postorder(node.left) + postorder(node.right) + visit(node) +``` + + +迭代版本 + +``` +iterativePostorder(node) + s ← empty stack + lastNodeVisited ← null + while (not s.isEmpty() or node ≠ null) + if (node ≠ null) + s.push(node) + node ← node.left + else + peekNode ← s.peek() + // if right child exists and traversing node + // from left child, then move right + if (peekNode.right ≠ null and lastNodeVisited ≠ peekNode.right) + node ← peekNode.right + else + visit(peekNode) + lastNodeVisited ← s.pop() +``` + + + +刷进度直接用递归AC + +``` +class Solution(object): + def postorderTraversal(self, root): + """ + :type root: TreeNode + :rtype: List[int] + """ + self.result = [] + self.postOrder(root) + return self.result + + def postOrder(self, root): + if root == None : return + self.postOrder(root.left) + self.postOrder(root.right) + self.result.append(root.val) +``` \ No newline at end of file diff --git a/147._insertion_sort_list.md b/147._insertion_sort_list.md new file mode 100644 index 000000000..b385d14f1 --- /dev/null +++ b/147._insertion_sort_list.md @@ -0,0 +1,59 @@ +###147. Insertion Sort List + +题目: + + + +难度: +Medium + +insertion sort 也是入门必备,一个元素本身被认为是sort的,一个简单的理解是打牌,然后进入第二个元素的时候,看它是比第一个元素大还是小,做排序,进入下一个元素的时候再看再移。 + +伪码 + +``` +for i ← 1 to length(A)-1 + j ← i + while j > 0 and A[j-1] > A[j] + swap A[j] and A[j-1] + j ← j - 1 + end while +end for +``` + +这个伪码对于list可能适用性没有那么强,则考虑,从第二个node开始,那么从开始开始看,找到这个node应该插入的位置,插入。 + + + +就是这样,就是会超时|||| + +``` +class Solution(object): + def insertionSortList(self, head): + """ + :type head: ListNode + :rtype: ListNode + """ + if head == None or head.next == None: + return head + + dummy = ListNode(-1) + dummy.next = head + + prev = head + cur = head.next + + while cur: + p = dummy + while p.next.val <= cur.val and p != prev: + p = p.next + if p != prev: + prev.next = cur.next + cur.next = p.next + p.next = cur + prev = cur + cur = cur.next + + return dummy.next +``` + diff --git a/148._sort_list.md b/148._sort_list.md new file mode 100644 index 000000000..7bb4e80b0 --- /dev/null +++ b/148._sort_list.md @@ -0,0 +1,138 @@ +###148. Sort List + +题目: + + + +难度: +Medium + +MergeSort + +merge sort是必备,divide & conquer的入门之物。 + +merge sort做两件事, sort 和 merge。 + +看一看标准伪码: + +``` +function mergesort(m) + var list left, right, result + if length(m) ≤ 1 + return m + else + var middle = length(m) / 2 + for each x in m up to middle - 1 + add x to left + for each x in m at and after middle + add x to right + left = mergesort(left) + right = mergesort(right) + if last(left) ≤ first(right) + append right to left + return left + result = merge(left, right) + return result + +function merge(left,right) + var list result + while length(left) > 0 and length(right) > 0 + if first(left) ≤ first(right) + append first(left) to result + left = rest(left) + else + append first(right) to result + right = rest(right) + if length(left) > 0 + append rest(left) to result + if length(right) > 0 + append rest(right) to result + return result +``` + +另一处获得伪码 + +``` +MergeSort(arr[], l, r) +If r > l + 1. Find the middle point to divide the array into two halves: + middle m = (l+r)/2 + 2. Call mergeSort for first half: + Call mergeSort(arr, l, m) + 3. Call mergeSort for second half: + Call mergeSort(arr, m+1, r) + 4. Merge the two halves sorted in step 2 and 3: + Call merge(arr, l, m, r) +``` + + +merge sort用在linked list上的好处是不用开辟空间,然后就处理node + +用旧的代码拼装出来的结果 + +然后需要注意的一点是拆分链表,所以有设置left node 的tail为None的操作. + +``` +class Solution(object): + def sortList(self, head): + """ + :type head: ListNode + :rtype: ListNode + """ + if head == None or head.next == None: + return head + + mid = self.findMid(head) + # split the + l1 = head + l2 = mid.next + mid.next = None + + l1 = self.sortList(l1) + l2 = self.sortList(l2) + + return self.mergeTwoLists(l1, l2) + + def mergeTwoLists(self, l1, l2): + """ + :type l1: ListNode + :type l2: ListNode + :rtype: ListNode + """ + if l1 == None: + return l2 + if l2 == None: + return l1 + + dummy = ListNode(-1) + cur = dummy + + while l1 and l2: + if l1.val < l2.val: + cur.next = l1 + l1 = l1.next + else: + cur.next = l2 + l2 = l2.next + cur = cur.next + + if l1: + cur.next = l1 + else: + cur.next = l2 + return dummy.next + + def findMid(self,head): + if head == None or head.next == None: + return head + + slow = head + fast = head + + while fast.next and fast.next.next: + slow = slow.next + fast = fast.next.next + + return slow + +``` \ No newline at end of file diff --git a/150._evaluate_reverse_polish_notation.md b/150._evaluate_reverse_polish_notation.md new file mode 100644 index 000000000..4e2b48aac --- /dev/null +++ b/150._evaluate_reverse_polish_notation.md @@ -0,0 +1,83 @@ +###150. Evaluate Reverse Polish Notation + + + +题目: + + + +难度: +Medium + + + +AC代码 + +``` +class Solution(object): + def evalRPN(self, tokens): + """ + :type tokens: List[str] + :rtype: int + """ + def cal(op, op1, op2): + if op == '*': + return op1 * op2 + elif op == '/': + return op1 / float(op2) + elif op == '+': + return op1 + op2 + else: + return op1 - op2 + + operandStack = [] + + for token in tokens: + if token in '+-*/': + op2 = operandStack.pop() + op1 = operandStack.pop() + res = cal(token, op1, op2) + operandStack.append(int(res)) + else: + operandStack.append(int(token)) + + return operandStack.pop() +``` + + +实际上这里有一个很奇(sha)怪(bi)的地方,看到了么,除法➗处,如果我不这么做,就是错的,这是python 2 和 python 3 的除法不一致导致的,所以最终我这样做了才能得到正确答案。 + +思路: + +已经给了我们wikipedia的链接了 + +- While there are input tokens left + - Read the next token from input. + - If the token is a value + - Push it onto the stack. + -Otherwise, the token is an operator (operator here includes both operators and functions). + - It is already known that the operator takes n arguments. + - If there are fewer than n values on the stack + - (Error) The user has not input sufficient values in the expression. + - Else, Pop the top n values from the stack. + - Evaluate the operator, with the values as arguments. + - Push the returned results, if any, back onto the stack. +- If there is only one value in the stack + - That value is the result of the calculation. +- Otherwise, there are more values in the stack + - (Error) The user input has too many values. + + + +再参考这里 + + + + +1. Create an empty stack called operandStack. +2. Convert the string to a list by using the string method split. +3. Scan the token list from left to right. + - If the token is an operand, convert it from a string to an integer and push the value onto the operandStack. + - If the token is an operator, *, /, +, or -, it will need two operands. Pop the operandStack twice. The first pop is the second operand and the second pop is the first operand. Perform the arithmetic operation. Push the result back on the operandStack. +4. When the input expression has been completely processed, the result is on the stack. Pop the operandStack and return the value. + diff --git a/151._reverse_words_in_a_string.md b/151._reverse_words_in_a_string.md new file mode 100644 index 000000000..fbf3493be --- /dev/null +++ b/151._reverse_words_in_a_string.md @@ -0,0 +1,25 @@ +###151. Reverse Words in a String + +题目: + + + +难度: +Medium + + +这对我Python来说,实在太简单,或许我应该看看别的语言的思路和算法 + +``` + +class Solution(object): + def reverseWords(self, s): + """ + :type s: str + :rtype: str + """ + sList = s.split() + sList.reverse() + return " ".join(sList) + +``` \ No newline at end of file diff --git a/152._maximum_product_subarray.md b/152._maximum_product_subarray.md new file mode 100644 index 000000000..7570876fa --- /dev/null +++ b/152._maximum_product_subarray.md @@ -0,0 +1,44 @@ +###152. Maximum Product Subarray + + + +题目: + + + +难度: +Medium + +思路: + +粗一看, 一股浓烈的DP气息飘来,想要套用53题的思路和方程。但是这个跟sum是不一样的,因为乘积可以正负正负的跳,这样的动归方程肯定是不对的 + +dp[i] = max(dp[i-1] * a[i],a[i]) + +举个例子 : [-2,3,-4] + + +用O(N^2)超时,厉害啊! + +想,可不可以记录+的和-的,记录两个dp数组,我哭了,真的是这样做的 + +最大值可能来源于最小值 -> 哲学般的句子 + +``` +class Solution(object): + def maxProduct(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + n = len(nums) + maxdp = [ nums[0] for i in range(n)] + mindp = [ nums[0] for i in range(n)] + + + for i in range(1,n): + maxdp[i] = max(mindp[i-1]*nums[i], maxdp[i-1]*nums[i],nums[i]) + mindp[i] = min(maxdp[i-1]*nums[i], mindp[i-1]*nums[i],nums[i]) + + return max(maxdp) +``` diff --git a/153._find_minimum_in_rotated_sorted_array.md b/153._find_minimum_in_rotated_sorted_array.md new file mode 100644 index 000000000..b46e1950d --- /dev/null +++ b/153._find_minimum_in_rotated_sorted_array.md @@ -0,0 +1,85 @@ +###153. Find Minimum in Rotated Sorted Array + + +题目: + + + +难度: + +Medium + + + +思路一: + +O(N) 就不说了 + +思路二: + +想的是分治,两段分别找出最小值,然后取最小值,但是依旧没有利用题目特性,并且也是O(N). + +> We can do it in O(logn) using Binary Search. If we take a closer look at above examples, we can easily figure out following pattern: The minimum element is the only element whose previous element is greater than it. If there is no such element, then there is no rotation and first element is the minimum element. + + +上面提到了一个特性,就是minimum element唯一一个它之前的element比它大的,如果不存在这个element,那么就没有rotation. + + + +思路其实是判断前半部分或者后半部分是否有序,然后来剔除,这里需要注意有比较多的边界case,因为如果就两个,那么会有特殊case 0 ,1 mid = 0,所以可以看一下,它这个处理,最后一个elif 是来比较mid 和 end + + + + + +``` +class Solution(object): + def findMin(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + def findRotatedMin(nums, start, end): + if end < start: + return nums[0] + if start == end: + return nums[start] + mid = (start + end) / 2 + if mid > start and nums[mid] < nums[mid-1]: + return nums[mid] + elif mid < end and nums[mid+1] < nums[mid]: + return nums[mid+1] + elif nums[mid] < nums[end]: + return findRotatedMin(nums,start, mid -1) + return findRotatedMin(nums, mid+1, end) + + + return findRotatedMin(nums,0,len(nums)-1) + +``` + +非递归 + +``` +class Solution(object): + def findMin(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + l,r = 0, len(nums) - 1 + while l < r: + mid = (l+r) / 2 + if mid > l and nums[mid] < nums[mid-1]: + return nums[mid] + elif mid < r and nums[mid] > nums[mid+1]: + return nums[mid+1] + elif nums[mid] < nums[r]: + r = mid -1 + else: + l = mid +1 + return nums[0] + +``` + + diff --git a/155._min_stack.md b/155._min_stack.md new file mode 100644 index 000000000..c663119df --- /dev/null +++ b/155._min_stack.md @@ -0,0 +1,169 @@ +###155. Min Stack + +题目: + + + +难度: + +Easy + +思路一: + +懒,直接用系统的数据结构 +用lst和系统的heapq,提升一下,用deque和heapq,这样也没太大提升 + + +``` +from heapq import * + +class MinStack(object): + + def __init__(self): + """ + initialize your data structure here. + """ + self.lst = [] + self.h = [] + + + def push(self, x): + """ + :type x: int + :rtype: void + """ + self.lst.append(x) + heappush(self.h,x) + + + def pop(self): + """ + :rtype: void + """ + val = self.lst.pop() + self.h.remove(val) + heapify(self.h) + + def top(self): + """ + :rtype: int + """ + return self.lst[-1] + + + def getMin(self): + """ + :rtype: int + """ + return self.h[0] + +``` + +思路二: + + +参考 + +用两个stack,其中一个始终来记录到当前位置的最小值 + + +``` +When we insert 18, both stacks change to following. +Actual Stack +18 <--- top +Auxiliary Stack +18 <---- top + +When 19 is inserted, both stacks change to following. +Actual Stack +19 <--- top +18 +Auxiliary Stack +18 <---- top +18 + +When 29 is inserted, both stacks change to following. +Actual Stack +29 <--- top +19 +18 +Auxiliary Stack +18 <---- top +18 +18 + +When 15 is inserted, both stacks change to following. +Actual Stack +15 <--- top +29 +19 +18 +Auxiliary Stack +15 <---- top +18 +18 +18 + +When 16 is inserted, both stacks change to following. +Actual Stack +16 <--- top +15 +29 +19 +18 +Auxiliary Stack +15 <---- top +15 +18 +18 +18 +``` + +这样无论是用deque还是本身的lst都有一些提升 + + +``` +from collections import deque +class MinStack(object): + + def __init__(self): + """ + initialize your data structure here. + """ + self.lst = deque() + self.aux = deque() + + + def push(self, x): + """ + :type x: int + :rtype: void + """ + self.lst.append(x) + if not self.aux or self.aux[-1] > x: + self.aux.append(x) + else: + self.aux.append(self.aux[-1]) + + + + def pop(self): + """ + :rtype: void + """ + self.lst.pop() + self.aux.pop() + + def top(self): + """ + :rtype: int + """ + return self.lst[-1] + + + def getMin(self): + """ + :rtype: int + """ + return self.aux[-1] +``` \ No newline at end of file diff --git a/160._intersection_of_two_linked_lists.md b/160._intersection_of_two_linked_lists.md new file mode 100644 index 000000000..689528c48 --- /dev/null +++ b/160._intersection_of_two_linked_lists.md @@ -0,0 +1,85 @@ +###160. Intersection of Two Linked Lists + +题目: + + + +难度: + +Easy + + +如果两个linkedlist有intersection的话,可以看到,其实如果一开始我们就走到b2的话,那么我们就可以两个pointer一个一个的对比,到哪一个地址一样,接下来就是intersection部分。 + +就一开始把长的那条list走掉多余部分。 + + + +``` +A: a1 → a2 + ↘ + c1 → c2 → c3 + ↗ +B: b1 → b2 → b3 +``` + + +然后这个题AC也花了一点时间,因为Python有recursion的limit限制,一开始用的一个求linkedlist len的报错 + +用这个会导致我无法AC,recursion limit达到上限 + +``` +def len(self, head): + if head == None: + return 0 + else: + return 1 + self.len(head.next) +``` + + +AC代码如下: + + + +``` +class Solution(object): + def getIntersectionNode(self, headA, headB): + """ + :type head1, head1: ListNode + :rtype: ListNode + """ + lenA = self.len(headA) + lenB = self.len(headB) + + if lenA == 0 or lenB == 0: + return None + + pA = headA + pB = headB + + if lenA > lenB: + for i in range(lenA - lenB): + pA = pA.next + else: + for i in range(lenB - lenA): + pB = pB.next + + while pA and pB: + if pA == pB: + return pA + else: + pA = pA.next + pB = pB.next + + return None + + + def len(self, head): + p = head + count = 0 + while p: + count += 1 + p = p.next + return count + +``` \ No newline at end of file diff --git a/162._find_peak_element.md b/162._find_peak_element.md new file mode 100644 index 000000000..6c7517530 --- /dev/null +++ b/162._find_peak_element.md @@ -0,0 +1,69 @@ +###162. Find Peak Element + +题目: + + + +难度: +Medium + + +思路: + + +最直观的是O(N)解法 + +``` +class Solution(object): + def findPeakElement(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + n = len(nums) + if n == 1: + return 0 + if nums[0] > nums[1]: + return 0 + elif nums[n-1] > nums[n-2]: + return n-1 + for i in range(1,n-1): + if nums[i] > nums[i-1] and nums[i] > nums[i+1]: + return i +``` + +O(lgN) 解法 + +这是一个经典题目 + +- a[n/2] < a[n/2-1] only look at the left side +- a[n/2] < a[n/2+1] only look at the right side +- else peak found + + +证明就是用反正法,或者看peak,因为这里已经限制了num[i] ≠ num[i+1],所以peak element 一定存在。然后a[n/2] < a[n/2-1],那么说明这里一定是下降的,说明之前一定有一个peak存在,否则我们可以用反证法证明. + +写到这里,我非常相信就是binary search能写对其实不容易。注意附加条件mid > l 和mid < r,这是针对mid+1和mid-1需要附加的,否则不容易对。 + + +AC代码 + +``` +class Solution(object): + def findPeakElement(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + l,r = 0, len(nums) - 1 + while l <= r: + if l == r : return l + mid = (l+r)/2 + if mid > l and nums[mid] < nums[mid-1]: + r = mid - 1 + elif mid < r and nums[mid] < nums[mid+1]: + l = mid + 1 + else: + return mid + +``` diff --git a/165._compare_version_numbers.md b/165._compare_version_numbers.md new file mode 100644 index 000000000..ab976ce99 --- /dev/null +++ b/165._compare_version_numbers.md @@ -0,0 +1,47 @@ +###165. Compare Version Numbers + +题目: + + + +难度: + +Easy + + +其实我并不觉得这个很简单 + +因为可能两个的位数不一样,首端或者尾端需要补0,同时我还考虑过可能有出现多个'.'的状况 + + + +``` +class Solution(object): + def compareVersion(self, version1, version2): + """ + :type version1: str + :type version2: str + :rtype: int + """ + v1 = version1.split('.') + v2 = version2.split('.') + v1 = [int(x) for x in v1] + v2 = [int(x) for x in v2] + + len1 = len(v1) + len2 = len(v2) + lenMax = max(len1, len2) + for x in range(lenMax): + v1Token = 0 + if x < len1: + v1Token = v1[x] + v2Token = 0 + if x < len2: + v2Token = v2[x] + if v1Token > v2Token: + return 1 + elif v1Token < v2Token: + return -1 + return 0 + +``` diff --git a/167._two_sum_ii_-_input_array_is_sorted.md b/167._two_sum_ii_-_input_array_is_sorted.md new file mode 100644 index 000000000..b0ded8c46 --- /dev/null +++ b/167._two_sum_ii_-_input_array_is_sorted.md @@ -0,0 +1,39 @@ +###167. Two Sum II - Input array is sorted + + + +题目: + + + +难度: +Medium + +思路: + + +作为2sum, 3sum, 4sum 的姐妹题,明显我一上来被误导了一下,非要想用binary search(|||因为不小心看了tag),但素其实人家就是用的两个指针,一个指头,一个指尾巴,如果大了就尾巴左移,小了就头部右移,没看出来哪里用了binary 的思想 + + +AC Code + +``` +class Solution(object): + def twoSum(self, numbers, target): + """ + :type numbers: List[int] + :type target: int + :rtype: List[int] + """ + left, right = 0, len(numbers) - 1 + while left < right: + temp = numbers[left] + numbers[right] + if temp == target: + return [left + 1, right + 1] + elif temp < target: + left += 1 + else: + right -= 1 + return [] + +``` \ No newline at end of file diff --git a/168._excel_sheet_column_title.md b/168._excel_sheet_column_title.md new file mode 100644 index 000000000..547f083ee --- /dev/null +++ b/168._excel_sheet_column_title.md @@ -0,0 +1,28 @@ +###168. Excel Sheet Column Title + +题目: + + + + +难度: + +Easy + +依旧26进制的反击,不过这个反击我做的没之前那个好,看了hint + +``` +class Solution(object): + def convertToTitle(self, n): + """ + :type n: int + :rtype: str + """ + ans = '' + while n : + ans = chr(ord('A') + (n - 1) % 26) + ans + n = (n - 1) // 26 + return ans + +``` + diff --git a/169._majority_element.md b/169._majority_element.md new file mode 100644 index 000000000..6701ba759 --- /dev/null +++ b/169._majority_element.md @@ -0,0 +1,74 @@ +###169. Majority Element + + + +题目: + + + +难度: +Easy + +思路: + +其实这个我有点有想到过 + + +给定一个长度为 n的数组,其中有一个数,它出现的次数大于⎣n/2⎦,称为主要元素,找到它. + +这个很像之前做过的一道CLRS的题目,想法可以用divide & conquer. + + +- 如果数组长度 <= 2,那么return第一个即解决问题 +- 如果长度 > 2,那么可以两两配对,对于配对一样的结果,删去 + - 如果最后余一个,这一个留下 + - shuffle之后再尝试两两配对,直到最后结果不再改变 + + 这样肯定是能解决问题的,因为为了满足次数大于⎣n/2⎦这个条件。 + + + + + + +``` + + 1 2 1 2 1 2 1 2 + 2 3 2 3 2 3 2 3 + 2 4 2 2 2 2 3 + 2 4 2 3 3 + 3 2 + 2 2 + 2 2 +``` + +思路容易implement非常难啊. + + + +这个问题有一个很出名的算法 + + +Boyer-Moore众数(majority number) 问题 + +在数组中找到两个不相同的元素并删除它们,不断重复此过程,直到数组中元素都相同,那么剩下的元素就是主要元素。 + + +这个算法的妙处在于不直接删除数组中的元素,而是利用一个计数变量. + +伪码 + + def majorityElement(self, nums): + count,major=0,0 + for n in nums: + if count==0: + major=n + if major==n: + count+=1 + else: + count-=1 + return major + + + + \ No newline at end of file diff --git a/171._excel_sheet_column_number.md b/171._excel_sheet_column_number.md new file mode 100644 index 000000000..4521f737c --- /dev/null +++ b/171._excel_sheet_column_number.md @@ -0,0 +1,34 @@ +###171. Excel Sheet Column Number + +题目: + + + + +难度: + +Easy + + +26进制的反击 + +``` +class Solution(object): + def titleToNumber(self, s): + """ + :type s: str + :rtype: int + """ + maps = {} + for i in range(65,91): + maps[chr(i)] = i - 64 + + lst = list(s) + lst.reverse() + num = 0 + for idx,item in enumerate(lst): + num += maps[item] * (26 ** idx) + return num + +``` + diff --git a/173._binary_search_tree_iterator.md b/173._binary_search_tree_iterator.md new file mode 100644 index 000000000..f41778d71 --- /dev/null +++ b/173._binary_search_tree_iterator.md @@ -0,0 +1,95 @@ +###173. Binary Search Tree Iterator + +题目: + + + +难度: +Medium + + +同样没有听题目要求,一开始就取巧,用InOrder,这样得到BSF有序排列,然后使用 + + +``` + +class BSTIterator(object): + def __init__(self, root): + """ + :type root: TreeNode + """ + self.root = root + self.lst = [] + self.inOrder(root) + self.lst.reverse() + + + + def hasNext(self): + """ + :rtype: bool + """ + return self.lst != [] + + + def next(self): + """ + :rtype: int + """ + return self.lst.pop() + + def inOrder(self, root): + if root == None: + return + self.inOrder(root.left) + self.lst.append(root.val) + self.inOrder(root.right) + +``` + +谷歌了一下,得到如何满足题目要求的hint,从root开始,往左走,把左孩子压入stack,直到左边为空。 + +然后开始取node,如果node有右孩子,则同样要把node的左孩子入stack,画了一个图,可行。 + + + + + +``` + +class BSTIterator(object): + def __init__(self, root): + """ + :type root: TreeNode + """ + self.root = root + self.stack = [] + self.pushLeft(root) + + + def hasNext(self): + """ + :rtype: bool + """ + return self.stack != [] + + + def next(self): + """ + :rtype: int + """ + while self.hasNext(): + cur = self.stack.pop() + if cur.right: + self.pushLeft(cur.right) + return cur.val + + def pushLeft(self, node): + """ + :type node: TreeNode + """ + cur = node + while cur: + self.stack.append(cur) + cur = cur.left +``` \ No newline at end of file diff --git a/189._rotate_array.md b/189._rotate_array.md new file mode 100644 index 000000000..080a1e581 --- /dev/null +++ b/189._rotate_array.md @@ -0,0 +1,23 @@ +###189. Rotate Array + +题目: + + + +难度 : Easy + + +作弊神奇python大法 + +``` +class Solution(object): + def rotate(self, nums, k): + """ + :type nums: List[int] + :type k: int + :rtype: void Do not return anything, modify nums in-place instead. + """ + n = len(nums) + nums[:] = nums[n-k:] + nums[:n-k] + œ +``` diff --git a/191._number_of_1_bits.md b/191._number_of_1_bits.md new file mode 100644 index 000000000..ac09a2c84 --- /dev/null +++ b/191._number_of_1_bits.md @@ -0,0 +1,70 @@ +###191. Number of 1 Bits + +题目: + + + + +难度: + +Easy + + +转成二进制,数1的个数 + +``` +class Solution(object): + def hammingWeight(self, n): + """ + :type n: int + :rtype: int + """ + count = 0 + while n > 0: + count += n % 2 + n = n//2 + return count +``` + + + +有wikipedia的题目 [Hamming Weight]((https://zh.wikipedia.org/wiki/汉明重量)) + + + +用wikipedia的解法: + +原理是在于每次使用x & x-1 总会把低位的数字给置0 + +比如 3 = 011 2 = 010 3 & 2 = 010 cnt =1 + +​ 2 = 010 1 = 001 2 & 1 = 000 cnt = 2 + +比如 9 = 1001 8 = 1000 9&8 = 1000 cnt =1 + +​ 8 = 1000 7 = 0111 8&7 = 0000 cnt = 2 + +> 减1操作将最右边的符号从0变到1,从1变到0,与操作将会移除最右端的1。如果最初X有N个1,那么经过N次这样的迭代运算,X将减到0。下面的算法就是根据这个原理实现的。 + +所以关键点是每次都会把最右边的1变成0. + + + +AC代码 + + + +``` +class Solution(object): + def hammingWeight(self, n): + """ + :type n: int + :rtype: int + """ + cnt = 0 + while n != 0: + n &= n - 1 + cnt += 1 + return cnt +``` + diff --git a/198._house_robber.md b/198._house_robber.md new file mode 100644 index 000000000..74fc67d1e --- /dev/null +++ b/198._house_robber.md @@ -0,0 +1,41 @@ + +###198. House Robber + + +题目: + + + +难度: + +Easy + + +状态转移方程: + +dp[i] = max(dp[i-1], dp[i-2] + nums[i]) + + +AC 代码 + +``` +class Solution(object): + def rob(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + n = len(nums) + if n == 0 : return 0 + elif n == 1 : return nums[0] + elif n == 2 : return max(nums[0], nums[1]) + else: + dp = [0 for i in range(n)] + dp[0] = nums[0] + dp[1] = max(nums[0],nums[1]) + for i in range(2,n): + dp[i] = max( dp[i-1], dp[i-2] + nums[i]) + return dp[n-1] +``` + + diff --git a/199._binary_tree_right_side_view.md b/199._binary_tree_right_side_view.md new file mode 100644 index 000000000..6f7b3b6d6 --- /dev/null +++ b/199._binary_tree_right_side_view.md @@ -0,0 +1,37 @@ +###199. Binary Tree Right Side View + +题目: + + + + +难度: + +Medium + + +还是在玩第102题,level order traversal. + +``` +class Solution(object): + def rightSideView(self, root): + """ + :type root: TreeNode + :rtype: List[int] + """ + if root == None: return [] + + res = [] + curLevel = [root] + while curLevel: + nextLevel = [] + tmpRes = [] + for node in curLevel: + tmpRes.append(node.val) + if node.left: nextLevel.append(node.left) + if node.right: nextLevel.append(node.right) + res.append(tmpRes[-1]) + curLevel = nextLevel + return res +``` + diff --git a/200._number_of_islands.md b/200._number_of_islands.md new file mode 100644 index 000000000..eef73b54e --- /dev/null +++ b/200._number_of_islands.md @@ -0,0 +1,113 @@ +###200. Number of Islands + + +题目: + + + +难度: +Medium + + +思路: + + +一开始: +numberOfIslands = 0 +islandArea = [] + + +然后遇到(x,y) = 1的状况,更新numberOfIslands,并且把(x,y)放入islandArea,然后用BFS或者DFS查找岛屿范围,全部更如islandArea,做loop + +以上就是基本思路 + + +然后超时|||, 小改之后AC + + +``` + +class Solution(object): + def numIslands(self, grid): + """ + :type grid: List[List[str]] + :rtype: int + """ + self.grid = grid[:] + + self.row = len(self.grid) + self.col = len(self.grid[0]) if self.row else 0 + self.visited = [[0 for i in range(self.col)]for j in range(self.row)] + + + self.numberOfIslands = 0 + + for i in range(self.row): + for j in range(self.col): + if self.grid[i][j] == '1' and self.visited[i][j] == 0: + self.findArea(i,j) + self.numberOfIslands += 1 + + return self.numberOfIslands + + def findArea(self, i, j): + s = [] + s.append((i,j)) + while s: + (x,y) = s.pop() + self.visited[x][y] = 1 + if self.legal(x-1,y): + s.append((x-1,y)) + if self.legal(x+1,y): + s.append((x+1,y)) + if self.legal(x,y-1): + s.append((x,y-1)) + if self.legal(x,y+1): + s.append((x,y+1)) + + def legal(self,x,y): + return x>= 0 and x < self.row and y >= 0 and y < self.col and self.grid[x][y] == '1' and self.visited[x][y] == 0 +a = Solution() +print a.numIslands(["11000","11000","00100","00011"]) + +``` + + +看了别人的代码,写的真美 ╮(╯_╰)╭ 啊 + +``` +class Solution(object): + def numIslands(self, grid): + """ + :type grid: List[List[str]] + :rtype: int + """ + def dfs(gird, used, row, col, x, y): + if gird[x][y] == '0' or used[x][y]: + return + used[x][y] = True + + if x!= 0: + dfs(grid, used, row,col, x-1,y) + if x!= row -1 : + dfs(grid, used, row,col, x+1, y) + if y!= 0: + dfs(grid, used, row,col, x, y-1) + if y!= col - 1: + dfs(grid, used, row,col, x, y+1) + + + row = len(grid) + col = len(grid[0]) if row else 0 + + used = [[0 for i in xrange(col)] for i in xrange(row)] + + count = 0 + for i in xrange(row): + for j in xrange(col): + if grid[i][j] == '1' and not used[i][j]: + dfs(grid,used,row,col,i,j) + count += 1 + return count +``` + diff --git a/203._remove_linked_list_elements.md b/203._remove_linked_list_elements.md new file mode 100644 index 000000000..15aa10efa --- /dev/null +++ b/203._remove_linked_list_elements.md @@ -0,0 +1,38 @@ +###203. Remove Linked List Elements + +题目: + + + +难度: + +Easy + + +AC代码如下: + + + +``` +class Solution(object): + def removeElements(self, head, val): + """ + :type head: ListNode + :type val: int + :rtype: ListNode + """ + dummy = ListNode(-1) + dummy.next = head + + cur = dummy + + while cur.next: + if cur.next.val == val: + cur.next = cur.next.next + else: + cur = cur.next + + return dummy.next + + +``` \ No newline at end of file diff --git a/204._count_primes.md b/204._count_primes.md new file mode 100644 index 000000000..b69290b70 --- /dev/null +++ b/204._count_primes.md @@ -0,0 +1,57 @@ +###204. Count Primes + + +题目: + + + +难度: + +Easy + + + +这个题的hint是已经把算法喂到嘴边了 + + + + +``` +Input: an integer n > 1 + +Let A be an array of Boolean values, indexed by integers 2 to n, +initially all set to true. + +for i = 2, 3, 4, ..., not exceeding √n: + if A[i] is true: + for j = i^2, i^2+i, i^2+2*i, i^2+3i, ..., not exceeding n : + A[j] := false + +Output: all i such that A[i] is true. +``` + + + +python算法 + + +``` +class Solution(object): + def countPrimes(self, n): + """ + :type n: int + :rtype: int + """ + isPrime = [1 for i in range(n)] + + i = 2 + while i * i < n: + if isPrime[i]: + j = i * i + while j < n : + isPrime[j] = 0 + j += i + i += 1 + + return sum(isPrime[2:]) +``` \ No newline at end of file diff --git a/205._isomorphic_strings.md b/205._isomorphic_strings.md new file mode 100644 index 000000000..47b0ab772 --- /dev/null +++ b/205._isomorphic_strings.md @@ -0,0 +1,39 @@ +###205. Isomorphic Strings + +题目: + + + +难度 : Easy + + +AC之法,用dictionary,因为限制,所以确保s 和 t 是isomorphic 同时 t 和 s 是 + + +``` +class Solution(object): + def isIsomorphic(self, s, t): + """ + :type s: str + :type t: str + :rtype: bool + """ + return self.iso(s,t) and self.iso(t,s) + + def iso(self,s, t): + """ + :type s: str + :type t: str + :rtype: bool + """ + mapx = {} + for i in range(len(s)): + if s[i] not in mapx: + mapx[s[i]] = t[i] + elif s[i] in mapx: + if t[i] != mapx[s[i]]: + return False + return True + + +``` diff --git a/206._reverse_linked_list.md b/206._reverse_linked_list.md new file mode 100644 index 000000000..b8fb116ae --- /dev/null +++ b/206._reverse_linked_list.md @@ -0,0 +1,52 @@ +###206. Reverse Linked List + +题目: + + + +难度: +Easy + +用三个指针,分别指向prev,cur 和 nxt,然后loop一圈还算比较简单. + + + + +``` +class Solution(object): + def reverseList(self, head): + """ + :type head: ListNode + :rtype: ListNode + """ + prev = None + cur = head + while(cur): + nxt = cur.next + cur.next = prev + prev = cur + cur = nxt + return prev +``` + + +递归版本,可以再消化一下. + + +``` +class Solution(object): + def reverseList(self, head): + """ + :type head: ListNode + :rtype: ListNode + """ + return self.doReverse(head, None) + + + def doReverse(self, head, newHead): + if head == None: + return newHead + nxt = head.next + head.next = newHead + return self.doReverse(nxt, head) +``` \ No newline at end of file diff --git a/207._course_schedule.md b/207._course_schedule.md new file mode 100644 index 000000000..6e990f09d --- /dev/null +++ b/207._course_schedule.md @@ -0,0 +1,93 @@ +###207. Course Schedule + + + +题目: + + + +难度: +Medium + +思路: + +就是考topological sort,用来判断directed graph是否有cycle + +DFS 和 BFS都可以用来拓扑排序。 + +最简单的想法是每次取出indegree是0的node,然后把它和与之相关的edge都删了。一开始觉得这样的时间复杂度会很高,然后看到了这样写,参照: + + + +很聪明的写法 + +这里做了转成set以及添加removeList这样的操作是因为边list边做iterator这样的操作很危险 + + + + +``` +class Solution(object): + def canFinish(self, numCourses, prerequisites): + """ + :type numCourses: int + :type prerequisites: List[List[int]] + :rtype: bool + """ + degrees = [ 0 for i in range(numCourses)] + childs = [[] for i in range(numCourses)] + for front, tail in prerequisites: + degrees[front] += 1 + childs[tail].append(front) + + courses = set(range(numCourses)) + flag = True + + while flag and len(courses): + flag = False + removeList = [] + for x in courses: + if degrees[x] == 0: + for child in childs[x]: + degrees[child] -= 1 + removeList.append(x) + flag = True + for x in removeList: + courses.remove(x) + return len(courses) == 0 + +``` + +因为CLRS里面明确提到涂色法来处理DFS + +搞了半天,写了一个涂色法,在超时的边缘。之所以超时边缘是因为每次都要去prerequisites里看,没有删减,不高效. + +``` +class Solution(object): + def canFinish(self, numCourses, prerequisites): + """ + :type numCourses: int + :type prerequisites: List[List[int]] + :rtype: bool + """ + def dfs(i, colors, prerequisites): + colors[i] = 'G' + #print i, colors + for front, tail in prerequisites: + if tail == i: + if colors[front] == 'G': + return False + elif colors[front] == 'B': + continue + elif dfs(front, colors, prerequisites) == False: + return False + colors[i] = 'B' + return True + + colors = ['W' for i in range(numCourses)] + for i in range(numCourses): + if colors[i] == 'W': + if dfs(i, colors, prerequisites) == False: + return False + return True +``` diff --git a/208._implement_trie_(prefix_tree).md b/208._implement_trie_(prefix_tree).md new file mode 100644 index 000000000..39707fe83 --- /dev/null +++ b/208._implement_trie_(prefix_tree).md @@ -0,0 +1,87 @@ +###208. Implement Trie (Prefix Tree) + +题目: + + + + +难度: + +Medium + +这个Python实现也太精美了吧,谷歌复写之 + +然后还unlock了一个solution,to read + +Trie整个都需要 to read,精美,可爱😊 + + + + +``` +class TrieNode(object): + def __init__(self): + """ + Initialize your data structure here. + """ + self.childs = dict() + self.isWord = False + + + +class Trie(object): + + def __init__(self): + self.root = TrieNode() + + def insert(self, word): + """ + Inserts a word into the trie. + :type word: str + :rtype: void + """ + node = self.root + for letter in word: + child = node.childs.get(letter) + if child is None: + child = TrieNode() + node.childs[letter] = child + node = child + node.isWord = True + + def search(self, word): + """ + Returns if the word is in the trie. + :type word: str + :rtype: bool + """ + node = self.root + for letter in word: + node = node.childs.get(letter) + if node is None: + return False + return node.isWord + + + def startsWith(self, prefix): + """ + Returns if there is any word in the trie + that starts with the given prefix. + :type prefix: str + :rtype: bool + """ + node = self.root + for letter in prefix: + node = node.childs.get(letter) + if node is None: + return False + return True + + +# Your Trie object will be instantiated and called as such: +# trie = Trie() +# trie.insert("somestring") +# trie.search("key") + +``` + diff --git a/210._course_schedule_ii.md b/210._course_schedule_ii.md new file mode 100644 index 000000000..852b1163e --- /dev/null +++ b/210._course_schedule_ii.md @@ -0,0 +1,55 @@ +###210. Course Schedule II + + + +题目: + + + +难度: +Medium + +思路: + +在207的基础上加了order,进击 + + +``` +class Solution(object): + def findOrder(self, numCourses, prerequisites): + """ + :type numCourses: int + :type prerequisites: List[List[int]] + :rtype: List[int] + """ + degrees = [ 0 for i in range(numCourses)] + childs = [[] for i in range(numCourses)] + for front, tail in prerequisites: + degrees[front] += 1 + childs[tail].append(front) + + + courses = set(range(numCourses)) + flag = True + order = [] + + while flag and len(courses): + flag = False + removeList = [] + for x in courses: + if degrees[x] == 0: + print x + for child in childs[x]: + degrees[child] -= 1 + removeList.append(x) + order.append(x) + flag = True + for x in removeList: + courses.remove(x) + + if len(courses) == 0: + return order + else: + return [] + +``` diff --git a/211. Add and Search Word - Data structure design.md b/211. Add and Search Word - Data structure design.md new file mode 100644 index 000000000..7dd0ea278 --- /dev/null +++ b/211. Add and Search Word - Data structure design.md @@ -0,0 +1,77 @@ +### 211. Add and Search Word - Data structure design + +题目: + + + +难度: Medium + +思路: + +trie也是树,那么dfs/bfs同样适用。 + +实际上是照抄208trie的题目再加上dfs + + + +AC代码 + + + +``` +class TrieNode(object): + """docstring for TrieNode""" + def __init__(self): + self.childs = dict() + self.isWord = False + +class WordDictionary(object): + def __init__(self): + """ + initialize your data structure here. + """ + self.root = TrieNode() + + + def addWord(self, word): + """ + Adds a word into the data structure. + :type word: str + :rtype: void + """ + node = self.root + for letter in word: + child = node.childs.get(letter) + if child is None: + child = TrieNode() + node.childs[letter] = child + node = child + node.isWord = True + + + def search(self, word): + """ + Returns if the word is in the data structure. A word could + contain the dot character '.' to represent any one letter. + :type word: str + :rtype: bool + """ + def dfs(root, word): + if len(word) == 0: + return root.isWord + elif word[0] == '.': + for node in root.childs: + if dfs(root.childs[node], word[1:]): + return True + return False + else: + node = root.childs.get(word[0]) + if node is None: + return False + return dfs(node, word[1:]) + + return dfs(self.root, word) +``` + + + diff --git a/213._house_robber_ii.md b/213._house_robber_ii.md new file mode 100644 index 000000000..9caec3dfd --- /dev/null +++ b/213._house_robber_ii.md @@ -0,0 +1,61 @@ +###213. House Robber II + + +题目: + + + +难度: +Medium + +思路: + +跟house robber 1 类似,但是加了一些限制,抢到第 n-1 家最大两种可能,抢第 n-1 家和不抢第 n-1 家。 + + 0, 1, 2, 3, 4, 5, 6 ... n-1 + + +所以状态转移方程写成二维的更好来求,从第i家抢到第j家的状态转移方程 + + + nums[j] ,j = i + dp[i][j] = max(nums[i], nums[i+1]) , j = i +1 + max(dp[i][j-2] + nums[j], dp[i][j-1]), j > i+1 + + + +Show me the code + + +AC代码 + +``` +class Solution(object): + def rob(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + n = len(nums) + if n == 0 : return 0 + if n == 1 : return nums[0] + if n == 2 : return max(nums[0],nums[1]) + + dp = [[0 for i in range(n)] for j in range(n)] + + for i in range(n): + for j in range(i,n): + if j == i: + dp[i][j] = nums[j] + elif j == i + 1: + dp[i][j] = max(nums[i],nums[i+1]) + else: + dp[i][j] = max(dp[i][j-2] + nums[j], dp[i][j-1]) + + # print dp + # rob without n-1, or rob with n-1 + val = max(dp[0][n-2], dp[1][n-3] + nums[n-1]) + + return val + +``` \ No newline at end of file diff --git a/216._combination_sum_iii.md b/216._combination_sum_iii.md new file mode 100644 index 000000000..9e1b6371e --- /dev/null +++ b/216._combination_sum_iii.md @@ -0,0 +1,40 @@ +###216. Combination Sum III + +题目: + + + + +难度: + +Medium + +继续Combination Sum 系列 + + +``` +class Solution(object): + def combinationSum3(self, k, n): + """ + :type k: int + :type n: int + :rtype: List[List[int]] + """ + candidates = [1,2,3,4,5,6,7,8,9] + self.res = [] + self.combSum(candidates, n, [], k) + return self.res + + + def combSum(self,candidates, target, valueList, k): + if target == 0 and k == 0: + self.res.append(valueList) + length = len(candidates) + if length == 0 or k < 0 : + return + for i in range(length): + if candidates[i] > target: + return + self.combSum(candidates[i+1:], target - candidates[i], valueList + [candidates[i]], k-1) + +``` \ No newline at end of file diff --git a/217._contains_duplicate.md b/217._contains_duplicate.md new file mode 100644 index 000000000..f6c2a2aef --- /dev/null +++ b/217._contains_duplicate.md @@ -0,0 +1,62 @@ +###217. Contains Duplicate + +题目: + + + +难度: + +Easy + + +我直接sort,然后比较相邻的元素,这样O(n),也是笨办法,居然unlocked a solution,所以来读读解答. + +三个办法: + +- linear search O(n^2) +- sort O(n) +- hashtable + + +我用的sort + +``` +class Solution(object): + def containsDuplicate(self, nums): + """ + :type nums: List[int] + :rtype: bool + """ + nums.sort() + for i in range(len(nums)-1): + if nums[i] == nums[i+1]: + return True + return False +``` + + + + +看给的Java解法 + + +``` +public boolean containsDuplicate(int[] nums) { + Set set = new HashSet<>(nums.length); + for (int x: nums) { + if (set.contains(x)) return true; + set.add(x); + } + return false; +} +``` + +还有一个取巧的Python解法,我也看到了 + +``` +class Solution(object): + def containsDuplicate(self, nums): + if len(nums) > len(set(nums)): + return True + return False +``` \ No newline at end of file diff --git a/219._contains_duplicate_ii.md b/219._contains_duplicate_ii.md new file mode 100644 index 000000000..8c5868c6f --- /dev/null +++ b/219._contains_duplicate_ii.md @@ -0,0 +1,35 @@ +###219. Contains Duplicate II + +题目: + + + +难度: + +Easy + + +经过了Contains Duplicate的考验,用hash table(也叫dictionary)来存,这个元素还没出现过,就放hash table,如果出现了,计算相邻距离,小于等于k则return true,否则更新hash table中元素的位置, + + +我用的sort + +``` +class Solution(object): + def containsNearbyDuplicate(self, nums, k): + """ + :type nums: List[int] + :type k: int + :rtype: bool + """ + if len(nums) < 2 : return False + lookup = {} + for i in range(len(nums)): + if nums[i] not in lookup: + lookup[nums[i]] = i + else: + if i - lookup[nums[i]] <= k : + return True + lookup[nums[i]] = i + return False +``` \ No newline at end of file diff --git a/221._maximal_square.md b/221._maximal_square.md new file mode 100644 index 000000000..3dd7b9a8c --- /dev/null +++ b/221._maximal_square.md @@ -0,0 +1,78 @@ +###221. Maximal Square + + +题目: + + + +难度: +Medium + +tag: DP + + +递推公式,一开始想的很简单: + +dp[i][j] = dp[i-1][j-1] + 1 #如果dp[i-1][j-1]为1,dp[i-1][j]为1,dp[i][j-1]为1 + +很明显的错误,一旦遇到更大的方块就会有问题 + +然后看了hint,其实递推方程式是很有技巧的,左上角,左边,上面,相邻的三个部分最小的+1,当然,前提也是要这里dp[i][j] 为1,然后我们再会去看其他的部分。 + +看个例子 + +``` +原本的matrix DP + +1 0 1 0 0 1 0 1 0 0 +1 0 1 1 1 → 1 0 1 1 1 +1 1 1 1 1 1 1 1 2 2 +1 0 0 1 0 1 0 0 1 0 + +``` + +是非常make sense的,因为最小的必定包括了周边的1,然后再加1,否则如果是0的话那么就为0. + +而naïve的错误的递推公式是因为一个square考虑的部分是k * k的部分, k * k 部分都必定为1. + +而正确的递推公式 + + + dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1]) + 1 + +则完美的考虑了这一情况 + + +``` +class Solution(object): + def maximalSquare(self, matrix): + """ + :type matrix: List[List[str]] + :rtype: int + """ + dp = [] + for i in matrix: + tmp = [] + for j in i: + tmp.append(int(j)) + dp.append(tmp) + + row = len(dp) + col = len(dp[0]) if row else 0 + + + for i in range(1,row): + for j in range(1,col): + if dp[i][j] == 1: + dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1]) + 1 + + + maxv = 0 + for i in range(row): + for j in range(col): + if dp[i][j] > maxv: + maxv = dp[i][j] + return maxv * maxv +``` + + diff --git a/222._count_complete_tree_nodes.md b/222._count_complete_tree_nodes.md new file mode 100644 index 000000000..e1b6bede6 --- /dev/null +++ b/222._count_complete_tree_nodes.md @@ -0,0 +1,67 @@ +###222. Count Complete Tree Nodes + +题目: + + + +难度: +Medium + + +思路: + + +思路一: 超时,跟一般的树一样,递归的来数nodes数 + + + +``` +class Solution(object): + def countNodes(self, root): + """ + :type root: TreeNode + :rtype: int + """ + if root == None: + return 0 + if root.left == None and root.right == None: + return 1 + return 1 + self.countNodes(root.left) + self.countNodes(root.right) +``` + + +思路二:既然说了是 complete binary tree,那么必然有特性可用,complete binary tree的特性是除了最后一层,之前的就是perfect tree. + + +所以寻找左子树的最左边的高度和右子树的最右边的node高度,如果相同就是perfect tree,高度2^h - 1, 否则递归的来看左子树和右子树 + + +``` + +class Solution(object): + def countNodes(self, root): + """ + :type root: TreeNode + :rtype: int + """ + if root == None: + return 0 + + p, q = root,root + + leftHeight = 0 + rightHeight = 0 + + while p: + p = p.left + leftHeight += 1 + + while q: + q = q.right + rightHeight += 1 + + if leftHeight == rightHeight: + return (int)(math.pow(2,leftHeight) - 1) + else: + return 1 + self.countNodes(root.left) + self.countNodes(root.right) +``` \ No newline at end of file diff --git a/223._rectangle_area.md b/223._rectangle_area.md new file mode 100644 index 000000000..3edba1bc3 --- /dev/null +++ b/223._rectangle_area.md @@ -0,0 +1,50 @@ +###223. Rectangle Area + +题目: + + + +难度 : Easy + + +这道题是我瞎了狗眼,🐶,之前看错了,以为要求相交的部分,结果是求cover的部分,所以写的长|||||| + + +``` +class Solution(object): + def computeArea(self, A, B, C, D, E, F, G, H): + """ + :type A: int + :type B: int + :type C: int + :type D: int + :type E: int + :type F: int + :type G: int + :type H: int + :rtype: int + """ + return self.area(C - A, D - B) + self.area(H - F, G - E ) - self.area(self.interSect(A,C,E,G), self.interSect(B,D,F,H)) + + def area(self, w, h): + if w * h < 0: + return - w * h + return w * h + + + def interSect(self, A, C, E, G): + if E > C: + return 0 + elif G < A: + return 0 + elif E >= A and G <= C: + return G - E + elif A >= E and C <= G: + return C - A + elif G <= C and G >= A and E <= A: + return G - A + else: + return C - E + + +``` diff --git a/224. Basic Calculator .md b/224. Basic Calculator .md new file mode 100644 index 000000000..53683dc7e --- /dev/null +++ b/224. Basic Calculator .md @@ -0,0 +1,108 @@ +### 224. Basic Calculator + + + +题目: + + +难度: +Medium + +思路: + +基本跟227一样,只是这里加了括号 + +瞄了一眼,基本上infix(中缀表达式)都是表达成postfix(后缀表达式)再来求值的。 +比如 A + B * C 写成 A B C * + + +| Infix Expression | Prefix Expression | Postfix Expression | +| ---------------- | ----------------- | ------------------ | +| A + B | + A B | A B + | +| A + B * C | + A * B C | A B C * + | + + + +infix 中缀转postfix 后缀还有专门的算法: + + + +1. Create an empty stack called opstack for keeping operators. Create an empty list for output. + +2. Convert the input infix string to a list by using the string method split. + +3. Scan the token list from left to right. + +4. - If the token is an operand, append it to the end of the output list. + - If the token is a left parenthesis, push it on the opstack. + - If the token is a right parenthesis, pop the opstack until the corresponding left parenthesis is removed. Append each operator to the end of the output list. + - If the token is an operator, *, /, +, or -, push it on the opstack. However, first remove any operators already on the opstack that have higher or equal precedence and append them to the output list. + +5. When the input expression has been completely processed, check the opstack. Any operators still on the stack can be removed and appended to the end of the output list. + + + +可以看到中缀转后缀一个重要的点是: 当我们把operator +-*/ 放到opstack上时候,我们需要考虑/看是否有之前的operator有更高或者相等的precedence,这个时候我们需要优先(计算)把它放到output list. + + + +参考 + + + + + +AC代码 + +``` +class Solution(object): + def calculate(self, s): + """ + :type s: str + :rtype: int + """ + def precedence(op): + if op == '*' or op == '/': + return 2 + else: + return 1 + + def cal(op, op1, op2): + if op == '*': + return op1 * op2 + elif op == '/': + return op1 / float(op2) + elif op == '+': + return op1 + op2 + else: + return op1 - op2 + + + opstack = [] + operands = [] + + # remove empty space and put operands and + idx = 0 + for i in range(idx, len(s)): + if s[i] in '+-*/': + operands.append(s[idx:i]) + while len(opstack) > 0 and precedence(s[i]) <= precedence(opstack[-1]) and len(operands) >= 2: + op = opstack.pop() + op2 = int(operands.pop()) + op1 = int(operands.pop()) + res = cal(op, op1, op2) + operands.append(res) + opstack.append(s[i]) + idx = i + 1 + operands.append(s[idx:]) + + while opstack: + op = opstack.pop() + op2 = int(operands.pop()) + op1 = int(operands.pop()) + res = cal(op, op1, op2) + operands.append(res) + + return int(operands[0]) + +``` + diff --git a/225._implement_stack_using_queues.md b/225._implement_stack_using_queues.md new file mode 100644 index 000000000..10a1ac200 --- /dev/null +++ b/225._implement_stack_using_queues.md @@ -0,0 +1,53 @@ +###225. Implement Stack using Queues + +题目: + + + + +难度: + +Easy + + +又到了作弊神预言Python的强项 + + +``` +class Stack(object): + def __init__(self): + """ + initialize your data structure here. + """ + self.lst = [] + + + def push(self, x): + """ + :type x: int + :rtype: nothing + """ + self.lst.append(x) + + + def pop(self): + """ + :rtype: nothing + """ + self.lst.remove(self.lst[-1]) + + + def top(self): + """ + :rtype: int + """ + return self.lst[-1] + + def empty(self): + """ + :rtype: bool + """ + return self.lst == [] + +``` + diff --git a/226._invert_binary_tree.md b/226._invert_binary_tree.md new file mode 100644 index 000000000..b66918814 --- /dev/null +++ b/226._invert_binary_tree.md @@ -0,0 +1,33 @@ +###226. Invert Binary Tree + +题目: + + + +难度: + +Easy + +然后查了一下,有更简单的写法 + + +``` + +class Solution(object): + def invertTree(self, root): + """ + :type root: TreeNode + :rtype: TreeNode + """ + if root == None: return None + elif root.left == None and root.right == None: return root + else: + leftNode = root.left + rightNode = root.right + root.right = leftNode + root.left = rightNode + self.invertTree(root.left) + self.invertTree(root.right) + return root +``` + diff --git a/227._basic_calculator_ii.md b/227._basic_calculator_ii.md new file mode 100644 index 000000000..ac5ea4eeb --- /dev/null +++ b/227._basic_calculator_ii.md @@ -0,0 +1,108 @@ +###227. Basic Calculator II + + + +题目: + + + +难度: +Medium + +思路: + +瞄了一眼,基本上infix(中缀表达式)都是表达成postfix(后缀表达式)再来求值的。 +比如 A + B * C 写成 A B C * + + + +| Infix Expression | Prefix Expression | Postfix Expression | +| ---------------- | ----------------- | ------------------ | +| A + B | + A B | A B + | +| A + B * C | + A * B C | A B C * + | + + +infix 中缀转postfix 后缀还有专门的算法: + + + +1. Create an empty stack called opstack for keeping operators. Create an empty list for output. + +2. Convert the input infix string to a list by using the string method split. + +3. Scan the token list from left to right. + +4. - If the token is an operand, append it to the end of the output list. + - If the token is a left parenthesis, push it on the opstack. + - If the token is a right parenthesis, pop the opstack until the corresponding left parenthesis is removed. Append each operator to the end of the output list. + - If the token is an operator, *, /, +, or -, push it on the opstack. However, first remove any operators already on the opstack that have higher or equal precedence and append them to the output list. + +5. When the input expression has been completely processed, check the opstack. Any operators still on the stack can be removed and appended to the end of the output list. + + + +可以看到中缀转后缀一个重要的点是: 当我们把operator +-*/ 放到opstack上时候,我们需要考虑/看是否有之前的operator有更高或者相等的precedence,这个时候我们需要优先(计算)把它放到output list. + + + + +参考 + + + + + +AC代码 + +``` +class Solution(object): + def calculate(self, s): + """ + :type s: str + :rtype: int + """ + def precedence(op): + if op == '*' or op == '/': + return 2 + else: + return 1 + + def cal(op, op1, op2): + if op == '*': + return op1 * op2 + elif op == '/': + return op1 / float(op2) + elif op == '+': + return op1 + op2 + else: + return op1 - op2 + + + opstack = [] + operands = [] + + # remove empty space and put operands and + idx = 0 + for i in range(idx, len(s)): + if s[i] in '+-*/': + operands.append(s[idx:i]) + while len(opstack) > 0 and precedence(s[i]) <= precedence(opstack[-1]) and len(operands) >= 2: + op = opstack.pop() + op2 = int(operands.pop()) + op1 = int(operands.pop()) + res = cal(op, op1, op2) + operands.append(res) + opstack.append(s[i]) + idx = i + 1 + operands.append(s[idx:]) + + while opstack: + op = opstack.pop() + op2 = int(operands.pop()) + op1 = int(operands.pop()) + res = cal(op, op1, op2) + operands.append(res) + + return int(operands[0]) + +``` + diff --git a/228._summary_ranges.md b/228._summary_ranges.md new file mode 100644 index 000000000..95e8d2faf --- /dev/null +++ b/228._summary_ranges.md @@ -0,0 +1,59 @@ +###228. Summary Ranges + +题目: + + + +难度: + +Medium + + +用一个head和headIdx来记录当前consecutive的开始,一旦不再consecutive,push it in + + +然后应该可以把代码写的更简单 + +``` +class Solution(object): + def summaryRanges(self, nums): + """ + :type nums: List[int] + :rtype: List[str] + """ + if nums == []: + return [] + tmp = [] + tmpl = [] + + + head = nums[0] + headIdx = 0 + + tmpl = [head] + + for i in range(1,len(nums)): + #not consective anymore + if nums[i] != head + i - headIdx : + tmp.append(tmpl) + head = nums[i] + headIdx = i + tmpl = [] + tmpl.append(head) + #consective nums + else: + tmpl.append(nums[i]) + #push the last sequence in + tmp.append(tmpl) + + + res = [] + for t in tmp: + if len(t) == 1: + res.append(str(t[0])) + else: + res.append(str(t[0])+"->" +str(t[-1])) + return res + + +``` diff --git a/229._majority_element_ii.md b/229._majority_element_ii.md new file mode 100644 index 000000000..061c03441 --- /dev/null +++ b/229._majority_element_ii.md @@ -0,0 +1,62 @@ +###229. Majority Element II + + + +题目: + + + +难度: +Medium + +思路: + +majority element是两两比较扔掉不同的元素,然后最后会留下一个。 + +这里变成三三比较来扔东西, find all elements that appear more than ⌊ n/3 ⌋ times,所以最多可以有两个majority element ii. + + +最后再加一个比较来确认这些函数是majority element + +``` +class Solution(object): + def majorityElement(self, nums): + """ + :type nums: List[int] + :rtype: List[int] + """ + cnt1 = 0 + cnt2 = 0 + maj1 = 0 + maj2 = 0 + for num in nums: + if maj1 == num: + cnt1 += 1 + elif maj2 == num: + cnt2 += 1 + elif cnt1 == 0: + maj1 = num + cnt1 += 1 + elif cnt2 == 0: + maj2 = num + cnt2 += 1 + else: + cnt1 -= 1 + cnt2 -= 1 + + cnt1 = 0 + cnt2 = 0 + + n = len(nums) + res = [] + for num in nums: + if maj1 == num: + cnt1 += 1 + elif maj2 == num: + cnt2 += 1 + if cnt1 > n/3: + res.append(maj1) + if cnt2 > n/3: + res.append(maj2) + return res +``` \ No newline at end of file diff --git a/230._kth_smallest_element_in_a_bst.md b/230._kth_smallest_element_in_a_bst.md new file mode 100644 index 000000000..4068afd8a --- /dev/null +++ b/230._kth_smallest_element_in_a_bst.md @@ -0,0 +1,48 @@ +###230. Kth Smallest Element in a BST + +题目: + + + +难度: +Medium + + +跟昨天做的一道题类似,一上来就走取巧之路。 + +InOrder排序,输出,当然也完全可以用昨天的binary tree iterator,入stack,出stack,知道输出第k位 + + +``` +class Solution(object): + def kthSmallest(self, root, k): + """ + :type root: TreeNode + :type k: int + :rtype: int + """ + self.root = root + self.lst = [] + self.inOrder(root) + return self.lst[k-1] + + def inOrder(self, root): + if root == None: + return + self.inOrder(root.left) + self.lst.append(root.val) + self.inOrder(root.right) +``` + + +现在看到kth 就条件反射的想用divide & conquer, 扫root的左子树看nodes量,如果nodes数量是k-1,那么node就刚好是第k个,如果大于k > 左子树数量,扫右子树,同时更新root为root.right。 + +看到的言论: + +> If we can change the BST node structure, We can add a new Integer to mark the number of element in the left sub-tree. + +when the node is not null. + +- if k == node.leftNum + 1, return node +- if k > node.leftNum + 1, make k -= node.leftNum + 1, and then node = node.right +- otherwise, node = node.left \ No newline at end of file diff --git a/231. Power of Two.md b/231. Power of Two.md new file mode 100644 index 000000000..7850b2947 --- /dev/null +++ b/231. Power of Two.md @@ -0,0 +1,93 @@ +### 231. Power of Two + + + +题目: + + + +难度: + +Easy + + + +思路: + + + +power of two 那是这个数字的binary 表示一定只有一个1 + +套用以前的代码数1的位数的 + +这样会超时 + +``` +class Solution(object): + def isPowerOfTwo(self, n): + """ + :type n: int + :rtype: bool + """ + cnt = 0 + while n != 0: + n &= n -1 + cnt += 1 + return cnt == 1 +``` + + + +跟power of three一样递归,可以AC + + + +``` +class Solution(object): + def isPowerOfTwo(self, n): + """ + :type n: int + :rtype: bool + """ + if n <= 0 : + return False + if n == 1: + return True + if n%2 == 0: + return self.isPowerOfTwo(n/2) + else: + return False + +``` + + + + + + + +也是有[算法的wikipedia page](https://en.wikipedia.org/wiki/Power_of_two#Fast_algorithm_to_check_if_a_positive_number_is_a_power_of_two) + +> The [binary representation](https://en.wikipedia.org/wiki/Binary_numeral_system) of integers makes it possible to apply a very fast test to determine whether a given [positive integer](https://en.wikipedia.org/wiki/Positive_integer) *x* is a power of two: +> +> positive *x* is a power of two ⇔ (*x* & (*x* − 1)) is equal to zero. + + + +注意特殊case 0的处理 + +``` +class Solution(object): + def isPowerOfTwo(self, n): + """ + :type n: int + :rtype: bool + """ + if n == 0 :return False + else: + res = n & (n-1) + return res == 0 +``` + + + diff --git a/232._implement_queue_using_stacks.md b/232._implement_queue_using_stacks.md new file mode 100644 index 000000000..53647fc0e --- /dev/null +++ b/232._implement_queue_using_stacks.md @@ -0,0 +1,51 @@ +###232. Implement Queue using Stacks + +题目: + + + +难度: +Easy + +这个题没有乖乖听话,不过因为当年做过用两个stack来模拟queue + +然后不得不说,我Python大法实在太厉害了 + +这功能强大的,我简直要啧啧啧 + +``` +class Queue(object): + def __init__(self): + """ + initialize your data structure here. + """ + self.lst = [] + + + def push(self, x): + """ + :type x: int + :rtype: nothing + """ + self.lst.append(x) + + + def pop(self): + """ + :rtype: nothing + """ + del self.lst[0] + + def peek(self): + """ + :rtype: int + """ + return self.lst[0] + + + def empty(self): + """ + :rtype: bool + """ + return self.lst == [] +``` \ No newline at end of file diff --git a/234._palindrome_linked_list.md b/234._palindrome_linked_list.md new file mode 100644 index 000000000..586e69584 --- /dev/null +++ b/234._palindrome_linked_list.md @@ -0,0 +1,124 @@ +###234. Palindrome Linked List + +题目: + + + +难度: +Easy + +这道题我花了很久的时间 + + +思路是:“先翻转整个链表,然后和之前的链表比较” + +但是一直不能AC,然后去谷歌了,然后debug的过程发现原来的linked list也不存在了. + + +“先翻转整个链表,然后和之前的链表比较”听起来是可行的,但是当你“翻转了整个链表”以后,“之前的链表”已经不存在了啊。这时候的head其实是指向翻转后的链表的最后一个元素,所以这段代码的本质是:“比较链表的第1个和最后1个元素是否相同”。 + + +如果用这个思路的话,你就必须创建一个原始链表的备份才行。但与其那样做,还不如干脆把List中元素拷贝到数组中算了,因为都是O(N)内存,后者实现起来还简单快捷一些。 + + +所以艰难的第一个AC办法: + + +``` +class Solution(object): + def isPalindrome(self, head): + """ + :type head: ListNode + :rtype: bool + """ + if head == None or head.next == None: + return True + + cur = head + stack = [] + while cur: + stack.append(cur.val) + cur = cur.next + + while head and stack: + if head.val != stack.pop(): + return False + else: + head = head.next + return True +``` + +这道题并不能算Easy吧: + +思路二: +找到中间的节点,把linked list拆成两个部分,后半部分linkedlist reverse,然后比较两个linked list值是否相同,看例子: + + +``` +1 -> 3 -> 1 拆成 1 和 1 + +1 -> 3 -> 5 ->5 -> 3 -> 1 拆成 1-> 3 -> 5 和 5 -> 3 -> 1 + +``` + +然后用这个思路的时候还有一个问题,就是特别简单的Python递归可能建议不用递归,因为递归反倒可能recursion到极限,用loop可能更顺. + +第二个AC之法,因为懒,所以老用之前用过的代码: + +这个速度也是慢的厉害 + + + +``` +class Solution(object): + def isPalindrome(self, head): + """ + :type head: ListNode + :rtype: bool + """ + if head == None or head.next == None: + return True + + mid = self.findMid(head) + mid = self.reverseList(mid) + + while head and mid: + if head.val != mid.val: + return False + else: + head = head.next + mid = mid.next + return True + + + + def findMid(self, head): + if head == None: + return None + else: + slow = head + fast = head + + while fast.next and fast.next.next: + slow = slow.next + fast = fast.next.next + + print(slow.val) + return slow.next + + def reverseList(self, head): + """ + :type head: ListNode + :rtype: ListNode + """ + prev = None + cur = head + while(cur): + nxt = cur.next + cur.next = prev + prev = cur + cur = nxt + return prev +``` + +然后看了一下,如果把这三块写在一起,会轻松一些,AC速度快很多 diff --git a/235._lowest_common_ancestor_of_a_binary_search_tree.md b/235._lowest_common_ancestor_of_a_binary_search_tree.md new file mode 100644 index 000000000..62c1e09a5 --- /dev/null +++ b/235._lowest_common_ancestor_of_a_binary_search_tree.md @@ -0,0 +1,33 @@ +###235. Lowest Common Ancestor of a Binary Search Tree + +题目: + + + +难度 : Easy + +- 两个node,一个大于root,一个小于root,那么必定root两边,共同的ancestor是root,同时再考虑同为空的状况 +- 两个node,都比node小,到左边去寻找,那么先找到那个必定是common ancestor +- 两个node,都比node大,类似.... + + +AC解法 + +``` +class Solution(object): + def lowestCommonAncestor(self, root, p, q): + """ + :type root: TreeNode + :type p: TreeNode + :type q: TreeNode + :rtype: TreeNode + """ + if root == None or root == p or root == q: + return root + elif p.val < root.val < q.val or q.val < root.val < p.val : + return root + elif p.val < root.val and q.val < root.val: + return self.lowestCommonAncestor(root.left,p,q) + else: + return self.lowestCommonAncestor(root.right,p,q) +``` diff --git a/236._lowest_common_ancestor_of_a_binary_tree.md b/236._lowest_common_ancestor_of_a_binary_tree.md new file mode 100644 index 000000000..271c462ad --- /dev/null +++ b/236._lowest_common_ancestor_of_a_binary_tree.md @@ -0,0 +1,104 @@ + +###236. Lowest Common Ancestor of a Binary Tree + + +题目: + + + +难度: + +Medium + + + +思路 + +求root到node的path,然后对比path,最后一个想同的点就是lowest common ancestor + + + +好开心,AC了 + + +但是我根本不能在Runtime Distribution 上找到我,因为太慢了|||| + + + + +``` + +class Solution(object): + def lowestCommonAncestor(self, root, p, q): + """ + :type root: TreeNode + :type p: TreeNode + :type q: TreeNode + :rtype: TreeNode + """ + pathP = self.pathTo(root,p) + pathQ = self.pathTo(root,q) + n = min(len(pathP), len(pathQ)) + + ans = root + for i in range(n): + if pathP[i] == pathQ[i]: + ans = pathP[i] + else: + break + return ans + + + def pathTo(self, root, goal): + # goal node ,path + if root == None: return root + stack = [(root, [root])] + while stack: + node, path = stack.pop() + if node == goal: + return path + if node.left: stack.append((node.left, path + [node.left])) + if node.right: stack.append((node.right, path + [node.right])) + +``` + +递归解法,之所以我没有用递归因为有疑惑, BASE CASE 很容易想到,root 是none,或者p == root 或者q == root,那么LCA就是root,如果两个node一个在左边,一个在右边,那么LCA也是root,但是如果一个是6,另一个是4则有一点疑惑,但其实是没有问题的,因为这个时候给的总是他们的共同root,所以这个递归解法是没错的,总是想到递归是在那个状况下递归 + + +``` + _______3______ + / \ + ___5__ ___1__ + / \ / \ + 6 _2 0 8 + / \ + 7 4 +``` + +AC代码 + + + +``` +class Solution(object): + def lowestCommonAncestor(self, root, p, q): + """ + :type root: TreeNode + :type p: TreeNode + :type q: TreeNode + :rtype: TreeNode + """ + if root == None: + return None + + if p == root or q == root: + return root + + left = self.lowestCommonAncestor(self.left,p,q) + right = self.lowestCommonAncestor(self.right,p,q) + + if left and right: + return root + + return left if left is None else right +``` \ No newline at end of file diff --git a/237._delete_node_in_a_linked_list.md b/237._delete_node_in_a_linked_list.md new file mode 100644 index 000000000..5e4a505ef --- /dev/null +++ b/237._delete_node_in_a_linked_list.md @@ -0,0 +1,32 @@ +###237. Delete Node in a Linked List + +题目: + + + +难度: +Easy + + + +这道题,第一感觉,像删链表一样来删,把所有的node val前移一个,但是有个问题,为什么tail那个node还是存在?哼(ˉ(∞)ˉ)唧.. + +已经去提问,被解答: + + + + + +另外一个O(1)的办法更好,把后一个node的val移到待删这个节点,并且把node.next = node.next.next +很好理解,但是为嘛不对 + +``` +class Solution(object): + def deleteNode(self, node): + """ + :type node: ListNode + :rtype: void Do not return anything, modify node in-place instead. + """ + node.val = node.next.val + node.next = node.next.next +``` \ No newline at end of file diff --git a/238._product_of_array_except_self.md b/238._product_of_array_except_self.md new file mode 100644 index 000000000..00a883f6b --- /dev/null +++ b/238._product_of_array_except_self.md @@ -0,0 +1,100 @@ +###238. Product of Array Except Self + +题目: + + + +难度: + +Medium + + +不使用division 并且O(n) + + +想到的算法 O(n^2) + +会超时 + + +``` +class Solution(object): + def productExceptSelf(self,nums): + """ + :type nums: List[int] + :rtype: List[int] + """ + lst = [] + for i in range(len(nums)): + lst.append(self.productWithoutI(nums,i)) + return lst + + + def productWithoutI(self,nums,i): + product = 1 + for j in range(len(nums)): + if j != i: + product *= nums[j] + return product +``` + +如果用除法,也会有问题,如果有0出现也会变繁琐。 + +谷歌一下: + + +解法还是很棒的 + + output[i] = { i 前面的数的乘积} X { i 后面的数的乘积} + + +``` +class Solution(object): + def productExceptSelf(self,nums): + """ + :type nums: List[int] + :rtype: List[int] + """ + if nums == [] : return [] + lft = [1] + rgt = [1] + product = 1 + for i in range(1,len(nums)): + product *= nums[i-1] + lft.append(product) + product = 1 + for i in reversed(range(1,len(nums))): + product *= nums[i] + rgt.append(product) + rgt.reverse() + result = [] + for i in range(len(nums)): + result.append(lft[i]*rgt[i]) + return result + +``` + + +空间O(n),再看到满足要求的“标准解法” + + +``` +class Solution(object): + def productExceptSelf(self,nums): + """ + :type nums: List[int] + :rtype: List[int] + """ + if nums == [] : return [] + size = len(nums) + output = [1] * size + left = 1 + for x in range(size-1): + left *= nums[x] + output[x+1] *= left + right = 1 + for x in range(size - 1, 0, -1): + right *= nums[x] + output[x-1] *= right + return output +``` \ No newline at end of file diff --git a/240._search_a_2d_matrix_ii.md b/240._search_a_2d_matrix_ii.md new file mode 100644 index 000000000..1f3ea3ca5 --- /dev/null +++ b/240._search_a_2d_matrix_ii.md @@ -0,0 +1,65 @@ +###240. Search a 2D Matrix II + + + +题目: + + + +难度: +Medium + +思路: + +每行,每列都是sorted + +但是比较好的策略是从右上角开始搜索,比如这样: + +``` +matrix = [ + [1, 4, 7, 11, 15], + [2, 5, 8, 12, 19], + [3, 6, 9, 16, 22], + [10, 13, 14, 17, 24], + [18, 21, 23, 26, 30] +] + +m, n = 0, col - 1 +更新策略: + matrix[m][n] < target: 那么这一行到从左走到此都会小于target,row+1 ,往下走 + matrix[m][n] > target: 那么这一列往下走都会大于target,col - 1,往左走 + 否则找到 +``` + +时间复杂度O(max(M,N)),因为每次都会往下或者往左走 + + +用的算法是Saddleback + + + +``` +class Solution(object): + def searchMatrix(self, matrix, target): + """ + :type matrix: List[List[int]] + :type target: int + :rtype: bool + """ + if not matrix: + return False + + row = len(matrix) + col = len(matrix[0]) + m, n = 0, col - 1 + + while m < row and n >= 0: + if matrix[m][n] < target: + m += 1 + elif matrix[m][n] > target: + n -= 1 + else: + return True + return False + +``` \ No newline at end of file diff --git a/242._valid_anagram.md b/242._valid_anagram.md new file mode 100644 index 000000000..28ddbe9c6 --- /dev/null +++ b/242._valid_anagram.md @@ -0,0 +1,54 @@ +###242. Valid Anagram + +题目: + + + +难度 : Easy + + +对Python来说,又是一块蛋糕,基本不本地测试 +就是这么自信 + +``` +class Solution(object): + def isAnagram(self, s, t): + """ + :type s: str + :type t: str + :rtype: bool + """ + sList = sorted(list(s)) + tList = sorted(list(t)) + return sList == tList + +``` + + +作弊神奇python大法,看了看别人的解法,用字数统计,因为只可能是26个字母 + +然后发现作弊大法居然更快 + +``` + +class Solution(object): + def isAnagram(self, s, t): + """ + :type s: str + :type t: str + :rtype: bool + """ + if len(s) != len(t): + return False + + charCnt = [0] * 26 + + for i in range(len(s)): + charCnt[ord(s[i]) - 97] += 1 + charCnt[ord(t[i]) - 97] -= 1 + + for cnt in charCnt: + if cnt != 0: + return False + return True +``` diff --git a/252. Meeting Rooms.md b/252. Meeting Rooms.md new file mode 100644 index 000000000..c84dee953 --- /dev/null +++ b/252. Meeting Rooms.md @@ -0,0 +1,47 @@ +### 252. Meeting Rooms + + + +题目: + + + + +难度 : Easy + + + +思路: + +学了一下如何根据attribute 来sort object `intervals.sort(key = lambda interval : interval.start)` + + + +AC 代码 + +``` +# Definition for an interval. +# class Interval(object): +# def __init__(self, s=0, e=0): +# self.start = s +# self.end = e + +class Solution(object): + def canAttendMeetings(self, intervals): + """ + :type intervals: List[Interval] + :rtype: bool + """ + n = len(intervals) + if n < 2 : return True + intervals.sort(key = lambda interval : interval.start) + for i in range(1,n): + if intervals[i].start < intervals[i-1].end: + return False + return True +``` + + + + + diff --git a/256. Paint House.md b/256. Paint House.md new file mode 100644 index 000000000..21576f90a --- /dev/null +++ b/256. Paint House.md @@ -0,0 +1,57 @@ +### 256. Paint House + +题目: + + +难度: +Medium + + + +其实这个题目有实际意义诶,至少我的故乡?在要申请啥东西的时候就把街上的房子全刷了。 + +然后这个是相邻的房子不同色。 + + + +其实我觉得paint fense更难一点 + + + +思路: + +数组 dp\[x][3] 代表第x个房子paint r/g/b的值 + + + +AC代码 + +``` +class Solution(object): + def minCost(self, costs): + """ + :type costs: List[List[int]] + :rtype: int + """ + m = len(costs) + if m == 0 : return 0 + elif m == 1 : return min(costs[0][0], costs[0][1],costs[0][2]) + else: + n = 3 if m else 0 + dp = [[0 for i in range(3)] for j in range(m)] + + dp[0] = costs[0] + + + for i in range(1,m): + dp[i][0] = min(dp[i-1][1],dp[i-1][2]) + costs[i][0] + dp[i][1] = min(dp[i-1][0],dp[i-1][2]) + costs[i][1] + dp[i][2] = min(dp[i-1][0],dp[i-1][1]) + costs[i][2] + return min(dp[m-1][0], dp[m-1][1], dp[m-1][2]) + +``` + + + + + diff --git a/257._binary_tree_paths.md b/257._binary_tree_paths.md new file mode 100644 index 000000000..c0fdea6ed --- /dev/null +++ b/257._binary_tree_paths.md @@ -0,0 +1,45 @@ +###257. Binary Tree Paths + +题目: + + + + +难度: + +Easy + + +Tag : tree, DFS + +类似的题目是Path Sum Ⅱ + + +第一眼看起来不像easy题目,然后堵了一下自己写的Path Sum Ⅱ自己的解答 + +同一种花样 + +``` +class Solution: + # @param {TreeNode} root + # @return {string[]} + def binaryTreePaths(self, root): + if root == None: return [] + result = [] + self.auxTreePaths(root,result,"") + return result + + + def auxTreePaths(self,root,result,curStr): + if root == None: + return + curStr += str(root.val) + if root.left == None and root.right == None: + result.append(curStr) + if root.left: + self.auxTreePaths(root.left,result,curStr + "->") + if root.right: + self.auxTreePaths(root.right,result,curStr + "->") + +``` + diff --git a/261. Graph Valid Tree.md b/261. Graph Valid Tree.md new file mode 100644 index 000000000..1e309007a --- /dev/null +++ b/261. Graph Valid Tree.md @@ -0,0 +1,69 @@ +### 261. Graph Valid Tree + + + +题目: + + + + +难度 : Medium + + + +思路: + +graph 为 tree 两个条件: + +- 这个图是connected +- 没有cycle + + + +偷懒AC代码,直接在323题,Number of Connected Components in an Undirected Graph上改的AC代码: + + + +``` +class Solution(object): + def validTree(self, n, edges): + """ + :type n: int + :type edges: List[List[int]] + :rtype: bool + """ + def find(x): + if uf[x] != x: + uf[x] = find(uf[x]) + return uf[x] + + def union(x,y): + xRoot = find(x) + yRoot = find(y) + uf[xRoot] = yRoot + + uf = [i for i in range(n)] + + for node1, node2 in edges: + # cycle exists + if find(node1) == find(node2): + print 'ha ' + return False + else: + union(node1, node2) + + res = set() + for i in range(n): + res.add(find(i)) + + return len(res) == 1 +``` + + + + + + + + + diff --git a/263._ugly_number.md b/263._ugly_number.md new file mode 100644 index 000000000..730b0bdde --- /dev/null +++ b/263._ugly_number.md @@ -0,0 +1,38 @@ +###263. Ugly Number + + + +题目: + + + +难度: +Easy + + +思路: + +因为其prime factors 只包括 2, 3, 5,所以比如如果能被2 整除, n = n / 2, 直到不能被2整除,然后同样对3,5检验,如果最终结果为1,那么就是ugly number,否则不过关 + + +注意一下边界条件,当num为0的时候,return一下False + +``` +class Solution(object): + def isUgly(self, num): + """ + :type num: int + :rtype: bool + """ + if num == 0 : return False + while num % 2 == 0: + num = num / 2 + while num % 3 == 0: + num = num / 3 + while num % 5 == 0: + num = num / 5 + if num == 1: + return True + return False +``` + diff --git a/264._ugly_number_ii.md b/264._ugly_number_ii.md new file mode 100644 index 000000000..ba1546b9e --- /dev/null +++ b/264._ugly_number_ii.md @@ -0,0 +1,140 @@ +###264. Ugly Number II + + + +题目: + + + +难度: +Medium + + +思路: + +暴力算法一定会超时 + + + + +先看一个非常🐂的帖子,当我知道python 除了有list之外还有collections就已经被刷新了一次了,然后数据结构 x 数据结构,就展示了数据结构的魅力 + + + + +看一下deque + rotate: + + +``` +import collections +a = collections.deque() +a.append(2) +a.append(5) +a.append(7) +a.append(9) #a deque([2, 5, 7, 9]) + +import bisect +idx = bisect.bisect_left(a,3) #1 +a.rotate(-idx) #deque([5, 7, 9, 2]) + +a.appendleft(3) #deque([3, 5, 7, 9, 2]) + +a.rotate(idx) # deque([2, 3, 5, 7, 9]) +``` + +这个rotate -是往左边rotate,看官网的介绍. + +>Rotate the deque n steps to the right. If n is negative, rotate to the left. Rotating one step to the right is equivalent to: d.appendleft(d.pop()). + +所以这样造成可以🐂的数据结构 + +用这个微调之后的fasttable来解决问题 + + +``` +import collections +import bisect + +class FastTable: + + def __init__(self): + self.__deque = collections.deque() + + def __len__(self): + return len(self.__deque) + + def head(self): + return self.__deque.popleft() + + def tail(self): + return self.__deque.pop() + + def peek(self): + return self.__deque[-1] + + def insert(self, obj): + if obj in self.__deque: + return + index = bisect.bisect_left(self.__deque, obj) + self.__deque.rotate(-index) + self.__deque.appendleft(obj) + self.__deque.rotate(index) + +class Solution(object): + + def nthUglyNumber(self, n): + """ + :type n: int + :rtype: int + """ + q = FastTable() + q.insert(1) + while n > 0: + x = q.head() + q.insert(2*x) + q.insert(3*x) + q.insert(5*x) + n -= 1 + return x +``` + + +还可以优化: +根据页面hint 来做的 + + +``` +class Solution(object): + def nthUglyNumber(self, n): + """ + :type n: int + :rtype: int + """ + if n == 1: + return 1 + else: + import collections + q2 = collections.deque() + q3 = collections.deque() + q5 = collections.deque() + q2.append(2) + q3.append(3) + q5.append(5) + while n > 1: + x = min(q2[0],q3[0],q5[0]) + if x == q2[0]: + x = q2.popleft() + q2.append(2*x) + q3.append(3*x) + q5.append(5*x) + elif x == q3[0]: + x = q3.popleft() + q3.append(3*x) + q5.append(5*x) + else: + x = q5.popleft() + q5.append(5*x) + n -= 1 + return x +``` + diff --git a/265. Paint House II.md b/265. Paint House II.md new file mode 100644 index 000000000..c9dfbc20f --- /dev/null +++ b/265. Paint House II.md @@ -0,0 +1,60 @@ +### 265. Paint House II + + + +题目: + + +难度: + +Hard + + + +思路: + +感觉不像hard 题,知道为啥hard了,因为can you solve it in O(nk) runtime + +数组 dp\[x][k] 代表第x个房子paint 0..k的值 + + + +用paint house 1 改的AC代码: + +不过这个时间复杂度是O(nkk)吧 + + + +``` +class Solution(object): + def minCostII(self, costs): + """ + :type costs: List[List[int]] + :rtype: int + """ + n = len(costs) + if n == 0 : return 0 + elif n == 1 : return min (costs[0]) + else: + k = len(costs[0]) if n else 0 + dp = [[0 for i in range(k)] for j in range(n)] + + dp[0] = costs[0] + + for i in range(1,n): + for j in range(0,k): + minVal = float('inf') + for m in range(0,k): + if m != j and dp[i-1][m] < minVal: + minVal = dp[i-1][m] + dp[i][j] = minVal + costs[i][j] + + return min(dp[-1]) +``` + + + + + + + diff --git a/266. Palindrome Permutation.md b/266. Palindrome Permutation.md new file mode 100644 index 000000000..49f78bd04 --- /dev/null +++ b/266. Palindrome Permutation.md @@ -0,0 +1,46 @@ +### 266. Palindrome Permutation + + + +题目: + + +难度 : Easy + + + +思路: + +hint 已经提示的很明显。数单字个数来处理 + + + +AC代码 + + + +``` +class Solution(object): + def canPermutePalindrome(self, s): + """ + :type s: str + :rtype: bool + """ + lookup = {} + + for char in s: + lookup[char] = lookup.get(char,0) + 1 + + res = 0 + + for char, cnt in lookup.items(): + if cnt % 2 == 0 : + continue + else: + res += 1 + + return res < 2 +``` + +​ + diff --git a/267. Palindrome Permutation II.md b/267. Palindrome Permutation II.md new file mode 100644 index 000000000..5243954ee --- /dev/null +++ b/267. Palindrome Permutation II.md @@ -0,0 +1,77 @@ +### 267. Palindrome Permutation II + + + + + +题目: + + + + +难度 : Medium + + + +思路: + +首先这个题目有个简单版本,那就是判断是否可以permutate 为 palindrome. 问题的关键是最多只能一个odd character. + + + +写的这么不elegant,我也是服气! + +AC代码: + + + +``` +class Solution(object): + def generatePalindromes(self, s): + """ + :type s: str + :rtype: List[str] + """ + def permuteUnique(firstS): + if len(firstS) == 0 : return [] + if len(firstS) == 1 : return [firstS] + res = [] + for i in range(len(firstS)): + if i > 0 and firstS[i] == firstS[i-1]: continue + for j in permuteUnique(firstS[:i] + firstS[i+1:]): + res.append([firstS[i]] + j) + return res + + lookup = {} + for char in s: + lookup[char] = lookup.get(char, 0) + 1 + + res, firstS, oddChar = 0, [], '' + for char, cnt in lookup.items(): + if cnt % 2 == 0: + for i in range(cnt/2): + firstS.append(char) + continue + else: + for i in range(cnt / 2): + firstS.append(char) + oddChar = char + res += 1 + if res >= 2: + return [] + else: + res = permuteUnique(firstS) + if len(res) == 0 and oddChar: + return [oddChar] + return map(lambda x: ''.join(x) + oddChar + ''.join(x[::-1]),res) + +``` + + + + + + + + + diff --git a/268._missing_number.md b/268._missing_number.md new file mode 100644 index 000000000..d86b99d54 --- /dev/null +++ b/268._missing_number.md @@ -0,0 +1,37 @@ +###268. Missing Number + +题目: + + + +难度: + +Medium + + + +等差数列前n项和 - 数组之和 + + + +``` +class Solution(object): + def missingNumber(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + m = len(nums) + res = (m+1)*m /2 + for num in nums: + res -= num + return res +``` + + + +第二种解法是位运算:位运算(异或运算) + +原理应该是就是两个数不同,这样才为True,待到研究位运算的时候扩展 + + diff --git a/270. Closest Binary Search Tree Value.md b/270. Closest Binary Search Tree Value.md new file mode 100644 index 000000000..b2aafe48a --- /dev/null +++ b/270. Closest Binary Search Tree Value.md @@ -0,0 +1,66 @@ +### 270. Closest Binary Search Tree Val + +题目: + + + + + +难度 : Easy + +最简单的算法是inorder一遍,得到有序的lst,然后O(N) 寻找最靠近的,但是明显不是很高效。 + +AC代码 + +``` +class Solution(object): + def closestValue(self, root, target): + """ + :type root: TreeNode + :type target: float + :rtype: int + """ + lst = [] + + def inorder(root): + if root: + inorder(root.left) + lst.append(root.val) + inorder(root.right) + + inorder(root) + + close = lst[0] + diff = abs(target - lst[0]) + + for i in lst: + if abs(target - i) < diff: + close = i + diff = abs(target - i ) + + return close +``` + + + +AC代码,跟binary search tree 寻值一样, loop 一遍树来寻找 + + + +``` + +class Solution(object): + def closestValue(self, root, target): + """ + :type root: TreeNode + :type target: float + :rtype: int + """ + close = root.val + + while root: + close = root.val if abs(target - root.val) < abs(target - close) else close + root = root.right if root.val < target else root.left + return close +``` + diff --git a/276. Paint Fence.md b/276. Paint Fence.md new file mode 100644 index 000000000..3b7373ed9 --- /dev/null +++ b/276. Paint Fence.md @@ -0,0 +1,65 @@ +### 276. Paint Fence + +题目: + + +难度: +Easy + +思路: + +先解释一下题目意思: fence 栅栏, post 柱子 , no more than two adjacent fence posts have the same color.(一开始看漏,没有看到more than,以为相邻就不能同色)。 + +本来想画格子找规律,结果走偏了,所以老老实实写递推关系式,貌似是这样的 + +- n = 0 : 全为0 +- n = 1 : 有 k种方式 +- n = 2 :有 k * k 种 +- 否则,第n个有两种可能, 跟 n-1 颜色不一样, 跟 n-1 颜色一样, fn = (k-1)fn-1 + (k-1) fn-2 + + + +画一下表:对一下递推关系式,正确✅ + + + +``` + n + 0 1 2 3 4 + 0 0 0 0 0 0 +t 1 0 1 1 0 0 + 2 0 2 4 6 10 + 3 0 3 9 24 . + 4 0 4 16 60 . +``` + + + +AC 代码 + +``` +class Solution(object): + def numWays(self, n, k): + """ + :type n: int + :type k: int + :rtype: int + """ + if n == 0: + return 0 + else: + if k == 0: return 0 + elif n == 1: return k + elif n == 2 : return k * k + else: + dp = [0 for i in range(n+1)] + dp[0] = 0 + dp[1] = k + dp[2] = k * k + + for i in range(3,n+1): + dp[i] = (k-1) * dp [i-1] + (k-1) * dp [i-2] + return dp[-1] + +``` + diff --git a/277. Find the Celebrity.md b/277. Find the Celebrity.md new file mode 100644 index 000000000..e6bc0312a --- /dev/null +++ b/277. Find the Celebrity.md @@ -0,0 +1,65 @@ +### 277. Find the Celebrity + + + +题目: + + + + +难度 : Medium + + + +思路: + +算法考试考过 + +celebrity 是 每个人都知道他,而他不认识任何别的人。 + + + +如果用图来看,那就每个别的人都有箭头指向c,而c没有任何出去的箭头。 + +O(N^2)的代码还是还是很容易想到的 + +但是我们可以有提升,那么就是可以check `knows(a,b)`,如果 a knows b,那么可以排除a是celebrity,否则可以排除b是celebrity. + +最后还要确认一遍是否这个是真的celebrity + + + +AC代码 + +``` +# The knows API is already defined for you. +# @param a, person a +# @param b, person b +# @return a boolean, whether a knows b +# def knows(a, b): + +class Solution(object): + def findCelebrity(self, n): + """ + :type n: int + :rtype: int + """ + if n == 0: + return -1 + c = 0 + for i in xrange(1,n): + if not knows(i, c): + c = i + for i in range(n): + if c != i: + if not knows(i,c) or knows(c,i): + return -1 + return c + + +``` + + + + + diff --git a/278. First Bad Version.md b/278. First Bad Version.md new file mode 100644 index 000000000..7d15e1ce8 --- /dev/null +++ b/278. First Bad Version.md @@ -0,0 +1,44 @@ +### 278. First Bad Version + + + + + +题目: + + + + +难度 : Easy + + + +思路: + +根据 search for a range 改的,这个binary search的边界也是令人着(chi)迷(dai)啊 + + + +这里使用 `n+1` 一是边界令人着迷,二是version是从1开始的 + +``` +class Solution(object): + def firstBadVersion(self, n): + """ + :type n: int + :rtype: int + """ + l, r = 0, n+1 + + while l < r: + mid = (l+r) // 2 + if isBadVersion(mid) and (mid == 0 or (not isBadVersion(mid-1))): + return mid + if isBadVersion(mid): + r = mid + else: + l = mid + 1 +``` + + + diff --git a/279._perfect_squares.md b/279._perfect_squares.md new file mode 100644 index 000000000..7fd6c3143 --- /dev/null +++ b/279._perfect_squares.md @@ -0,0 +1,45 @@ + +###279. Perfect Squares + + +题目: + + + +难度: + +Medium + + +状态转移方程 + +思路一: +dp[i] = min(dp[j] + dp[i-j], dp[i]) +会超时 + +思路二: +dp[i + j * j] = min(dp[i] + 1, dp[i + j * j]) + +已经不能更好了,但是因为Python的特性,依旧超时 + + + +``` +class Solution(object): + def numSquares(self, n): + """ + :type n: int + :rtype: int + """ + dp = [ n+1 for i in range(1+n)] + dp[0] = 0 + + for i in range(n): + j = 0 + while (i + j * j <= n) : + dp[ i + j * j ] = min(dp[ i + j * j], dp[i] + 1) + j += 1 + + return dp[n] + +``` diff --git a/280. Wiggle Sort.md b/280. Wiggle Sort.md new file mode 100644 index 000000000..4a239c466 --- /dev/null +++ b/280. Wiggle Sort.md @@ -0,0 +1,78 @@ +### 280. Wiggle Sort + + + + + +题目: + + + + +难度 : Medium + + + +思路: + + + +想的是比如bubble sort或者任何简单的比较sort,只是放数字的时候是按这样的大小顺序放: + +1, n, 2, n-1,3, n-2…. + +或者每个pass其实做两个sort,找出最大的和最小的。然后分别放在头尾。 + + + +这样的写法TLE: + +``` +class Solution(object): + def wiggleSort(self, nums): + """ + :type nums: List[int] + :rtype: void Do not return anything, modify nums in-place instead. + """ + n = len(nums) + for i in range(n): + # small bubble sort + if i % 2 == 0: + for j in range(n-1, i-1, -1): + if nums[j] > nums[j-1]: + nums[j], nums[j-1] = nums[j-1],nums[j] + else: + for j in range(n-1, i-1, -1): + if nums[j] < nums[j-1]: + nums[j], nums[j-1] = nums[j-1],nums[j] +``` + + + + + +但是貌似想复杂了,其实对于这个简单化,要求只有一个: + +1. 如果i是奇数,nums[i] >= nums[i - 1] +2. 如果i是偶数,nums[i] <= nums[i - 1] + +所以我们只要遍历一遍数组,把不符合的情况交换一下就行了。具体来说,如果nums[i] > nums[i - 1], 则交换以后肯定有nums[i] <= nums[i - 1]。 + + + +AC 代码 + +``` +class Solution(object): + def wiggleSort(self, nums): + """ + :type nums: List[int] + :rtype: void Do not return anything, modify nums in-place instead. + """ + for i in xrange(1,len(nums)): + if ((i % 2) and nums[i] < nums[i-1]) or ( not (i%2) and nums[i] > nums[i-1]): + nums[i-1],nums[i] = nums[i],nums[i-1] +``` + + + diff --git a/283._move_zeroes.md b/283._move_zeroes.md new file mode 100644 index 000000000..239b57188 --- /dev/null +++ b/283._move_zeroes.md @@ -0,0 +1,93 @@ +###283. Move Zeroes + + +题目: + + + +难度: +Easy + + +思路: + +思路一: + +这个题我很笨,但是思路是可以朝逆天的方向走的,一旦遇到不是0的就把它往前移动,移动非0完成,剩下的全部填0,看例子 + + + +``` +0 1 0 3 12 + +``` + +也算双指针吧, +首先cur = 0, idx = 0,为0,不变,然后idx = 1,不为0,前移,数组变成 + +``` +1 1 0 3 12 +``` + +继续idx 这个时候是2,不变,继续处理,碰到3可以变成 + +``` +1 3 0 3 12 +``` +这样知道变换完成,简直逆天啊,因为cur 总是小于idx,所以总可以保持这样的稳定性 + + +``` +class Solution(object): + def moveZeroes(self, nums): + """ + :type nums: List[int] + :rtype: void Do not return anything, modify nums in-place instead. + """ + cur,idx = 0,0 + while idx < len(nums): + # cur is not 0 + if nums[idx] != 0 : + nums[cur] = nums[idx] + cur += 1 + idx += 1 + + while cur < len(nums): + nums[cur] = 0 + cur += 1 + +``` + + +思路二: + +传统的双指针,参考这里 + + + + + +``` +class Solution(object): + def moveZeroes(self, nums): + """ + :type nums: List[int] + :rtype: void Do not return anything, modify nums in-place instead. + """ + p0, p1 = 0,0 + while p0 < len(nums) and p1 < len(nums): + if nums[p0] != 0: + p0 += 1 + p1 = p0 + continue + if nums[p1] == 0: + p1 += 1 + continue + nums[p0],nums[p1] = nums[p1],nums[p0] + p0 += 1 + p1 += 1 +``` + +相反,我觉得这样双指针反而没有上面的代码容易理解 + + diff --git a/285._inorder_successor_in_bst.md b/285._inorder_successor_in_bst.md new file mode 100644 index 000000000..a5a489be9 --- /dev/null +++ b/285._inorder_successor_in_bst.md @@ -0,0 +1,81 @@ +###285. Inorder Successor in BST + + +题目: + + + +难度: +Medium + +思路: + + +BST的特性,对于一个node,它的所有左侧node都比它小,它的所有右侧node都比它大。最小的元素在最左边,最大的元素在最右边。 + +一个node x它的successor y 是满足y > x的最小值。两种情况,如果node x有right child,那么这个right child 中的最小值就是它的successor,否则就要往上走,如果走上去的parent使得这个node是其左边的孩子的话,那么successor我们也找到了。 + + +因为状况可能是这样的: + +``` + 3 + / + 1 + / \ + 0 2 +``` + +如果是寻找0的successor,那么我们往上一走,发现0的祖先是1,并且0是1的左孩子,找到,否则如果寻找2的successor,那么我们要往上走到3的部分,2是3的左subtree,这样才能解决问题。 + +伪码 + +``` +function Succ(x) + if Right(x) ̸= NIL then + return Min(Right(x)) + else + p ← Parent(x) + while p ̸= NIL and x = Right(p) do + x←p + p ← Parent(p) + return p +``` + +这里伪码有点不适用是因为我们并没有这个parent指针,当然我们还是有trick方式的,就是我们从root开始走,直到找到这个node p,同时我们记录一路上看到的比p.val大的值,这样最后一个就是它的successor.其中最低的那一个就是他的successor. + +AC代码如下: + + +``` +class Solution(object): + def inorderSuccessor(self, root, p): + """ + :type root: TreeNode + :type p: TreeNode + :rtype: TreeNode + """ + def minNode(root): + while root.left!= None: + root = root.left + return root + + + def searchP(p, root): + if root == None or root.val == p.val: + return None + else: + succ = None + while root != None and p.val != root.val: + if p.val < root.val: + succ = root + root = root.left + else: + root = root.right + return succ + + if p.right: + return minNode(p.right) + else: + return searchP(p, root) +``` \ No newline at end of file diff --git a/286. Walls and Gates.md b/286. Walls and Gates.md new file mode 100644 index 000000000..8a23c2681 --- /dev/null +++ b/286. Walls and Gates.md @@ -0,0 +1,90 @@ +### 286. Walls and Gates + + + +题目: +https://leetcode.com/problems/walls-and-gates/ + + + +难度 : Medium + + + +思路: + +乍一看feel like all pairs shortest path. + +naive的想法是针对所有为0的点做all pairs shortest path,然后最终得到的就是把INF替换保留最小的。时间复杂度是0的个数* BFS + + + +naive的想法AC + +``` +class Solution(object): + def wallsAndGates(self, rooms): + """ + :type rooms: List[List[int]] + :rtype: void Do not return anything, modify rooms in-place instead. + """ + def legal(x,y): + return x >= 0 and x < row and y >= 0 and y < col and rooms[x][y] != -1 + + def bfs(rooms, i, j): + queue = [] + queue.append((i,j)) + + while queue: + (x,y) = queue.pop() + + if legal(x-1,y) and rooms[x-1][y] > rooms[x][y] + 1: + rooms[x-1][y] = rooms[x][y] + 1 + queue.append((x-1,y)) + if legal(x+1,y) and rooms[x+1][y] > rooms[x][y] + 1 : + rooms[x+1][y] = rooms[x][y] + 1 + queue.append((x+1,y)) + if legal(x,y-1) and rooms[x][y-1] > rooms[x][y] + 1: + rooms[x][y-1] = rooms[x][y] + 1 + queue.append((x,y-1)) + if legal(x,y+1) and rooms[x][y+1] > rooms[x][y] + 1 : + rooms[x][y+1] = rooms[x][y] + 1 + queue.append((x,y+1)) + + + row = len(rooms) + col = len(rooms[0]) if row else 0 + + for i in range(row): + for j in range(col): + if rooms[i][j] == 0: + bfs(rooms,i,j) +``` + + + +复习一下BFS的伪码 + +from wikipedia, 一开始有点小迷茫,那就是为什么没有keep一个visited的数据结构,但是随即反应过来,其实`n.distance == INFINITY` 已经是check它是否被visited 过了,我以上的代码并没有做这个操作,但是因为是格子状以及我仅在检查是否更小,所以也能AC. + +``` +Breadth-First-Search(Graph, root): + + for each node n in Graph: + n.distance = INFINITY + n.parent = NIL + + create empty queue Q + + root.distance = 0 + Q.enqueue(root) + + while Q is not empty: + current = Q.dequeue() + for each node n that is adjacent to current: + if n.distance == INFINITY: + n.distance = current.distance + 1 + n.parent = current + Q.enqueue(n) +``` + diff --git a/289._game_of_life.md b/289._game_of_life.md new file mode 100644 index 000000000..059a98caa --- /dev/null +++ b/289._game_of_life.md @@ -0,0 +1,111 @@ +###289. Game of Life + +题目: + + + +难度 : Medium + + +直接一上来就没有考虑solve it in-place,考虑的是便利,简直是born for 便利 + +首先我把board拓宽了,宽,高各增加了两排。 + +因为这样求neighbor方便,针对原来的borad,现在新的big 对于 1 -> n-1 的部分 + +全都有八个neighbor,用了一个2d array来记录nbrs,再根据当下的nbr来判断更新,因为不能一边在board上loop一边更新. + +AC的效率还ok: + +``` +class Solution(object): + def gameOfLife(self, board): + """ + :type board: List[List[int]] + :rtype: void Do not return anything, modify board in-place instead. + """ + def liveNeighbors(i,j): + return big[i-1][j-1] + big[i-1][j] + big[i-1][j+1] + big[i][j-1] + big[i][j+1] + big[i+1][j-1] + big[i+1][j] + big[i+1][j+1] + + if board == [[]] : return + row = len(board) + col = len(board[0]) + + nbrs = [[0 for j in range(col)] for i in range(row)] + big = [[ 0 for j in range(col+2) ] for i in range(row+2)] + for i in range(1,row+1): + for j in range(1,col+1): + big[i][j] = board[i-1][j-1] + + for i in range(1,row+1): + for j in range(1,col+1): + nbrs[i-1][j-1] = liveNeighbors(i,j) + + for i in range(row): + for j in range(col): + if board[i][j] == 1: + if nbrs[i][j] < 2: + board[i][j] = 0 + elif nbrs[i][j] == 2 or nbrs[i][j] == 3: + board[i][j] = 1 + else: + board[i][j] = 0 + else: + if nbrs[i][j] == 3: + board[i][j] = 1 + +``` + +谷歌了一下,大家都用到了temp 2d array嘛,哼(ˉ(∞)ˉ)唧。好吧,空间复杂度比我小。 + + + +很多的解法都是一样开了一个二维数组,即使没有像我一样扩展board.因为问题在于不能一边更新board 一边来做。 + +看了一下这边的思路: + + + + + + + +不开数组 + +我们可以使用状态机转换 o(╯□╰)o 感觉不知道在听什么 还是很迷茫的感觉, in-place AC代码 + +``` +class Solution(object): + def gameOfLife(self, board): + """ + :type board: List[List[int]] + :rtype: void Do not return anything, modify board in-place instead. + """ + row = len(board) + col = len(board[0]) if row else 0 + + dx = [-1,-1,-1,0,1,1,1,0] + dy = [-1,0,1,1,1,0,-1,-1] + + for i in range(row): + for j in range(col): + cnt = 0 + for k in range(8): + x, y = i + dx[k], j + dy[k] + if x >=0 and x < row and y >=0 and y < col and (board[x][y] == 1 or board[x][y] == 2): + cnt += 1 + + if board[i][j] and (cnt < 2 or cnt > 3): + board[i][j] = 2 + elif board[i][j] == 0 and cnt == 3: + board[i][j] = 3 + + for i in range(row): + for j in range(col): + board[i][j] %= 2 + + +``` + + + diff --git a/290._word_pattern.md b/290._word_pattern.md new file mode 100644 index 000000000..e6122ec87 --- /dev/null +++ b/290._word_pattern.md @@ -0,0 +1,42 @@ +###290. Word Pattern + +题目: + + + +难度 : Easy + +4.pattern = "abba", str = "dog dog dog dog" should return false. + +因为这个的限制,所以中间加了一个loop用来查询是否这个a对应的已经出现过了。 + +不过其实也可以用两个dictionary来处理,可以O(n^3) -> O(n^2) + + +``` +class Solution(object): + def wordPattern(self, pattern, str): + """ + :type pattern: str + :type str: str + :rtype: bool + """ + strList = str.split(' ') + if len(pattern) != len(strList): + return False + lookup = {} + for i in range(len(strList)): + if pattern[i] not in lookup: + for key in lookup: + if lookup[key] == strList[i]: + return False + lookup[pattern[i]] = strList[i] + elif lookup[pattern[i]] != strList[i]: + return False + + return True + +``` + + +另外看到一段非常简短代码,使用了map函数,有待学习 diff --git a/292._nim_game.md b/292._nim_game.md new file mode 100644 index 000000000..23cad3b13 --- /dev/null +++ b/292._nim_game.md @@ -0,0 +1,55 @@ +###292. Nim Game + +题目: + + + + +难度: + +Easy + + +对于总是优先开始的那方 + + +- 有一到三块,总是赢 +- 有四块,总是输 +- 有五块,总是赢 + +所以如果自己想赢,总是要迫使对方拿之后,给自己遗留5块,或者三块以及以下。 + +- 如果是六块: + - 拿一块,对方五块,对方赢 + - 拿两块,对方余下四块,我方赢 + - 拿三块,余三块,对方赢 + +- 七块: + - 拿三块,余四块,迫使对方输,总是赢 + +本打算用递归来看,因为对方也可以重复使用这个函数,但是会超时,所以就看了一下hint + + +- n <= 3 能赢 √ +- n == 4 总输 +- n = 5,6,7 总赢 +- n == 8, 先手如何选,总可以转成5,6,7 对方总会赢 + + +所以 n % 4 != 0 时候,先手必胜 + +简直是啊,有些游戏就是这样来必赢的啊,没想到你是这样的题目 + + + +``` +class Solution(object): + def canWinNim(self, n): + """ + :type n: int + :rtype: bool + """ + return n % 4 != 0 +``` + + \ No newline at end of file diff --git a/296. Best Meeting Point.md b/296. Best Meeting Point.md new file mode 100644 index 000000000..5f141f6a4 --- /dev/null +++ b/296. Best Meeting Point.md @@ -0,0 +1,67 @@ +### 296. Best Meeting Point + +题目: + + + + +难度 : Hard + + + +思路: + +提示是先从一维开始,其实一开始是略迷茫的,因为如果两个点,那么只要在这两个之间,一定就是最小值,线段长度。 + +不过倘若点增加到三个,那么就是第三个点处。 + + + +然后发现了一个很棒的stackoverflow page + + + + + +因为一开始理解错误二维数组的输入,以为是给的locs这样的数组,所以直接这样写了,然后发现给的是格子,所以但是还是偷懒这样写了。 + + + +AC 代码 + +``` +class Solution(object): + def minTotalDistance(self, grid): + """ + :type grid: List[List[int]] + :rtype: int + """ + res = 0 + locs = [] + + m = len(grid) + n = len(grid[0]) if m else 0 + + for i in range(m): + for j in range(n): + if grid[i][j] == 1: + locs.append([i,j]) + + + locs.sort(key = lambda point: point[0]) + x = locs[len(locs)/2][0] + for point in locs: + res += abs(point[0] - x) + + locs.sort(key = lambda point: point[1]) + y = locs[len(locs)/2][1] + for point in locs: + res += abs(point[1] - y) + + return res +``` + + + + + diff --git a/298. Binary Tree Longest Consecutive Sequence.md b/298. Binary Tree Longest Consecutive Sequence.md new file mode 100644 index 000000000..4c6bc841b --- /dev/null +++ b/298. Binary Tree Longest Consecutive Sequence.md @@ -0,0 +1,123 @@ +### 298. Binary Tree Longest Consecutive Sequence + + + + + +题目: +https://leetcode.com/problems/binary-tree-longest-consecutive-sequence/ + + + +难度 : Medium + + + +思路: + + + +TLE代码,每个node求,然后求最大值 + +``` +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def longestConsecutive(self, root): + """ + :type root: TreeNode + :rtype: int + """ + def consecutive(root): + if root == None: + return 0 + else: + left, right = 0,0 + if root.left: + if root.left.val == root.val + 1: + left = 1 + consecutive(root.left) + if root.right: + if root.right.val == root.val + 1: + right = 1 + consecutive(root.right) + return max(left, right, 1) + + def dfs(root): + s = [] + s.append(root) + while s: + root = s.pop() + res.append(consecutive(root)) + if root.left: + s.append(root.left) + if root.right: + s.append(root.right) + if not root: + return 0 + + res = [] + dfs(root) + return max(res) + +``` + + + + + +其实第二次递归,也就是dfs其实是有点多余的?因为可以边走边保存最大值? + +因为可以 + +> - recursion,在参数中包含当前的连续seq长度 +> - 如果left, right child的value是连续的,那么就将长度+1传入下一个call + + + + + +AC代码 + +``` +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def longestConsecutive(self, root): + """ + :type root: TreeNode + :rtype: int + """ + def dfs(root, curLen): + self.result = max(curLen, self.result) + if root.left: + if root.left.val == root.val + 1: + dfs(root.left, curLen + 1) + else: + dfs(root.left, 1) + if root.right: + if root.right.val == root.val + 1: + dfs(root.right, curLen + 1) + else: + dfs(root.right,1) + + if not root: return 0 + + self.result = 0 + dfs(root, 1) + return self.result + +``` + + + +这里值得注意的是这里的self.result其实相当于dfs的全局变量,也是利用了这个才做到边递归边记录边重置。 + diff --git a/299._bulls_and_cows.md b/299._bulls_and_cows.md new file mode 100644 index 000000000..8b6cbe468 --- /dev/null +++ b/299._bulls_and_cows.md @@ -0,0 +1,119 @@ +###299. Bulls and Cows + +题目: + + + + +难度: + +Easy + + +我花了很久时间来AC,因为想了边界条件 + + +``` +class Solution(object): + def getHint(self, secret, guess): + """ + :type secret: str + :type guess: str + :rtype: str + """ + maps = {} + for i in range(len(secret)): + if secret[i] not in maps: + maps[secret[i]] = [i] + else: + maps[secret[i]].append(i) + mapg = {} + for i in range(len(guess)): + if guess[i] not in mapg: + mapg[guess[i]] = [i] + else: + mapg[guess[i]].append(i) + + print maps, mapg + + a,b = 0,0 + for key in maps.keys(): + if key in mapg.keys(): + common = list(set(mapg[key]) & set(maps[key])) + #check for bull + a += len(common) + mapg[key] = [item for item in mapg[key] if item not in common] + maps[key] = [item for item in maps[key] if item not in common] + b += min(len(maps[key]), len(mapg[key])) + return str(a) + 'A' + str(b) + 'B' +``` + + + + + + + +两种解法都....... + +都这么短。。。。。 +我Python还是用的不行啊 + + +``` +class Solution(object): + def getHint(self, secret, guess): + """ + :type secret: str + :type guess: str + :rtype: str + """ + bull = sum(map(operator.eq, secret, guess)) + sa = collections.Counter(secret) + sb = collections.Counter(guess) + cow = sum((sa & sb).values()) - bull + return str(bull) + 'A' + str(cow) + 'B' +``` + + +bull = secret与guess下标与数值均相同的数字个数 + +cow = secret与guess中出现数字的公共部分 - bull + + + + +来分析一下这个解法 + +``` +def getHint(self, secret, guess): + bulls = sum(map(operator.eq, secret, guess)) + both = sum(min(secret.count(x), guess.count(x)) for x in '0123456789') + return '%dA%dB' % (bulls, both - bulls) +``` + +首先map的用法是,对于iterable中的每个元素应用function方法,将结果作为list返回 + +``` +>>> def add100(x): +... return x+100 +... +>>> hh = [11,22,33] +>>> map(add100,hh) +[111, 122, 133] +``` + + + + +用'1123','0111' 来测试: + + +``` +map(operator.eq, secret, guess) +[False, True, False, False] +``` +就是将equal函数并行应用在两个string上,然后后面的解法也是粗暴简约和厉害 + + +参考 diff --git a/300._longest_increasing_subsequence.md b/300._longest_increasing_subsequence.md new file mode 100644 index 000000000..bd1752b9e --- /dev/null +++ b/300._longest_increasing_subsequence.md @@ -0,0 +1,42 @@ +###300. Longest Increasing Subsequence + +题目: + + + +难度: +Medium + + +思路: + +典型DP + +递推关系式: + +对于以num[i]结束的longest increasing subsequence的长度 + +dp[i] = dp[j] + 1 if num[i] > num[j] else 1 + +最后loop一圈,求出最长的 + +AC 代码 + +``` +class Solution(object): + def lengthOfLIS(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + if not nums: return 0 + n = len(nums) + dp = [1 for i in range(n)] + for i in range(1,n): + for j in range(i): + if nums[i] > nums[j] : + dp[i] = max(dp[i],dp[j] + 1) + + return max(dp) +``` + diff --git a/303._range_sum_query_-_immutable.md b/303._range_sum_query_-_immutable.md new file mode 100644 index 000000000..32c459aee --- /dev/null +++ b/303._range_sum_query_-_immutable.md @@ -0,0 +1,47 @@ +###303. Range Sum Query - Immutable + +题目: + + + +tag : DP +难度 : Easy + + + +``` +sum(i, j) = nums[i] j = i +sum(i,j) = sum[i,j-1] + nums[j] j > i + +``` + +Python代码 + +``` + +class NumArray(object): + def __init__(self, nums): + """ + initialize your data structure here. + :type nums: List[int] + """ + self.sums = nums + for i in range(1, len(self.sums)): + self.sums[i] = self.sums[i-1] + self.sums[i] + + + + + def sumRange(self, i, j): + """ + sum of elements nums[i..j], inclusive. + :type i: int + :type j: int + :rtype: int + """ + if i == 0 : + return self.sums[j] + else : + return self.sums[j] - self.sums[i-1] + +``` \ No newline at end of file diff --git a/322. Coin Change.md b/322. Coin Change.md new file mode 100644 index 000000000..1246fa161 --- /dev/null +++ b/322. Coin Change.md @@ -0,0 +1,52 @@ +### 322. Coin Change + + + +题目: + + +难度: + +Medium + +DP入门 + +递推方程式: dp[i] = min(dp[i-vj]+1), vj 是硬币的面额 + +伪码: + +``` +Set Min[i] equal to Infinity for all of i +Min[0]=0 + +For i = 1 to S + For j = 0 to N - 1 + If (Vj<=i AND Min[i-Vj]+1 + + + +难度 : Medium + + + +思路: + + + +最容易想到的是针对每个节点做dfs?然后发现其已经被mark了就不管了,最后数dfs的次数? + +这样尝试,到n =2000 的时候 TLE + +``` +class Solution(object): + def countComponents(self, n, edges): + """ + :type n: int + :type edges: List[List[int]] + :rtype: int + """ + def dfs(node): + if visited[node] == 1: + return + else: + visited[node] = 1 + for node1, node2 in edges: + if node1 == node: + dfs(node2) + elif node2 == node: + dfs(node1) + + res = 0 + visited = [ 0 for i in range(n)] + for i in range(n): + if visited[i] == 0: + dfs(i) + res += 1 + return res +``` + + + +tag是union find,不用是否浪费? + +所谓的union find,应当不是每个做dfs,而是每个来看一下是否属于同一个set,一次dfs,然后loop 做union find + +[Disjoint-set_data_structure](https://en.wikipedia.org/wiki/Disjoint-set_data_structure) + + + +这里有一个很棒的[实现](http://python-algorithms.readthedocs.io/en/stable/_modules/python_algorithms/basic/union_find.html) + + + +AC代码 + +这里就偷懒了,利用岛是0-n,然后也只做了path compression,没更多的优化 + + + +``` +class Solution(object): + def countComponents(self, n, edges): + """ + :type n: int + :type edges: List[List[int]] + :rtype: int + """ + def find(x): + if uf[x] != x: + uf[x] = find(uf[x]) + return uf[x] + + def union(x,y): + xRoot = find(x) + yRoot = find(y) + uf[xRoot] = yRoot + + uf = [i for i in range(n)] + + for node1, node2 in edges: + union(node1, node2) + + res = set() + for i in range(n): + res.add(find(i)) + + return len(res) +``` + + + diff --git a/326._power_of_three.md b/326._power_of_three.md new file mode 100644 index 000000000..87a6ab083 --- /dev/null +++ b/326._power_of_three.md @@ -0,0 +1,50 @@ +###326. Power of Three + +题目: + + + + + +难度 : Easy + + +直接就上的递归 + +``` +class Solution(object): + def isPowerOfThree(self,n): + """ + :type n: int + :rtype: bool + """ + if n <= 0: + return False + if n == 1: + return True + if n%3 == 0: + return self.isPowerOfThree(n/3) + else: + return False + +``` + +有一个follow up,可否不用 loop/recusion + +看到了取巧的办法,因为是Given an integer,是有范围的(<2147483648),存在能输入的最大的3的幂次,即 3^19=1162261467。 + +只用检查是否能被这个数整除 + + +``` +class Solution(object): + def isPowerOfThree(self, n): + """ + :type n: int + :rtype: bool + """ + return n > 0 and 1162261467 % n == 0 +``` + + +结果跑出来这个running time 更慢||| diff --git a/328._odd_even_linked_list.md b/328._odd_even_linked_list.md new file mode 100644 index 000000000..b628ab241 --- /dev/null +++ b/328._odd_even_linked_list.md @@ -0,0 +1,112 @@ +###328. Odd Even Linked List + +题目: + + + +难度: + +Medium + + +想法:因为相对顺序保持不变,所以可以拆list,然后再组合在一起?这样是满足题目要求的,因为linked list不像array,我们操作的时候只是用指向,没有分配新的空间。 + +``` + +class Solution(object): + def oddEvenList(self, head): + """ + :type head: ListNode + :rtype: ListNode + """ + if head == None or head.next == None or head.next.next == None: + return head + + oddDummy = ListNode(-1) + oddDummy.next = head + + evenDummy = ListNode(-1) + evenDummy.next = head.next + + oddCur = oddDummy.next + evenCur = evenDummy.next + + cur = head.next.next + while cur: + oddCur.next = cur + oddCur = oddCur.next + evenCur.next = cur.next + evenCur = evenCur.next + if cur.next: + cur = cur.next.next + else: + cur = cur.next + oddCur.next = evenDummy.next + # print oddDummy.next.val + return oddDummy.next + +``` + + + + +看别人的优雅代码 + +``` +class Solution(object): + def oddEvenList(self, head): + """ + :type head: ListNode + :rtype: ListNode + """ + if head == None: + return head + + # odd used to keep track of the tail of odd nodes + odd = oddHead = head + # record how many swaps happend + even = evenHead = head.next + while even and even.next: + odd.next = even.next + odd = odd.next + even.next = odd.next + even = even.next + odd.next = evenHead + return head +``` + +intuitive and concise + + +``` +1 → 2 → 3 → 4 → 5 → NULL + +一开始 + + 1 → 2 → 3 → 4 → 5 → NULL +odd even even.next + + +1 → 3 → 4 → 5 → NULL + odd ↑ + 2 - + + +1 → 3 → 4 → 5 → NULL + odd + 2 - even + + +再loop一次: + + | ----------- + | --------- ↓ ↓ +1 → 3 4 5 → NULL + odd ↑ + 2 - ↑ even + + +最后一步,再将两个odd的最后一个和evenHead连接起来,完工 +``` + + diff --git a/334._increasing_triplet_subsequence.md b/334._increasing_triplet_subsequence.md new file mode 100644 index 000000000..e5e4c645a --- /dev/null +++ b/334._increasing_triplet_subsequence.md @@ -0,0 +1,71 @@ +###334. Increasing Triplet Subsequence + +题目: + + + +难度: +Medium + + +思路: + +用longest increasing subsequence来求,超时 + +``` +class Solution(object): + def increasingTriplet(self, nums): + """ + :type nums: List[int] + :rtype: bool + """ + if not nums: return False + n = len(nums) + dp = [1 for i in range(n)] + for i in range(1,n): + for j in range(i): + if nums[i] > nums[j] : + dp[i] = max(dp[i],dp[j] + 1) + if dp[i] >= 3: + return True + + return False +``` + +于是转而用Third Maximum Number的方法,维护一个当前最小和当前第二小,当碰到当前比较大,返回True,否则一圈走下来依旧不能满足,返回false. + +想一下,如果不是求三个增长,如果是求两个的话,那么一定想到的是保存当前最小值,那么一旦后方遇到一个比较大的,就这样处理掉了。 + +所以对于任何一个num来说,有三种可能: + +- 小于当前的最小值,那么更新当前最小值 +- 小于当前第二小值,更新当前第二小值 +- 如果以上两种都不是,那么是大于当前第二小值和最小值,于是这样就true + +所以是求四个增长也是类似的么 + +AC代码 + +``` +class Solution(object): + def increasingTriplet(self, nums): + """ + :type nums: List[int] + :rtype: bool + """ + # m - min, sm - second min + m, sm = float('inf'), float('inf') + + for num in nums: + print m, sm + if m >= num: + m = num + elif sm >= num: + sm = num + else: + return True + return False +``` + + + diff --git a/337._house_robber_iii.md b/337._house_robber_iii.md new file mode 100644 index 000000000..a081ba016 --- /dev/null +++ b/337._house_robber_iii.md @@ -0,0 +1,47 @@ +###337. House Robber III + + +题目: + + + +难度: +Medium + +思路: + +参考 + + +这个解法好像有点厉害 + +从root开始抢起来,最大能抢到的两个可能: 抢root和不抢root + +- rob_root = max(rob_L + rob_R , no_rob_L + no_nob_R + root.val) +- no_rob_root = rob_L + rob_R + + +这个递归写起来就很厉害了 + + +``` +class Solution(object): + def rob(self, root): + """ + :type root: TreeNode + :rtype: int + """ + def dfs(root): + if not root: return 0, 0 + rob_L, no_rob_L = dfs(root.left) + rob_R, no_rob_R = dfs(root.right) + return max(no_rob_R + no_rob_L + root.val , rob_L + rob_R), rob_L + rob_R + + return dfs(root)[0] + +``` + +对于每个node,我们return的是从这个node能抢到的最大值,以及不抢它能获得的最大值,这个递归简直我服 + + + diff --git a/338. Counting Bits.md b/338. Counting Bits.md new file mode 100644 index 000000000..e74a13253 --- /dev/null +++ b/338. Counting Bits.md @@ -0,0 +1,46 @@ +### 338. Counting Bits + +题目: + + + +难度: +Medium + + + +**O(n\*sizeof(integer))** 算法,其实就是把count of 1 bit拿来用: + +``` +class Solution(object): + def countBits(self, num): + """ + :type num: int + :rtype: List[int] + """ + def hammingWeight(n): + cnt = 0 + while n != 0: + n &= n -1 + cnt += 1 + return cnt + + res = [] + for i in range(num+1): + res.append(hammingWeight(i)) + return res + +``` + + + +DP算法 - to be done + + + + + + + + + diff --git a/339. Nested List Weight Sum.md b/339. Nested List Weight Sum.md new file mode 100644 index 000000000..a39800a58 --- /dev/null +++ b/339. Nested List Weight Sum.md @@ -0,0 +1,58 @@ +### 339. Nested List Weight Sum + + + +题目: + + +难度: +Easy + +思路: + +一开始没认真读题,直接上手开写: + +``` +class Solution(object): + def depthSum(self, nestedList): + """ + :type nestedList: List[NestedInteger] + :rtype: int + """ + def dfs(nestedList): + for item in nestedList: + if item.isInteger(): + self.res += item.getInteger() + else: + dfs(item.getList()) + self.res = 0 + dfs(nestedList) + return self.res +``` + + + +然后注意到要weight by its depth. + + + +AC + +``` +class Solution(object): + def depthSum(self, nestedList): + """ + :type nestedList: List[NestedInteger] + :rtype: int + """ + def dfs(nestedList,depth): + for item in nestedList: + if item.isInteger(): + self.res += item.getInteger() * depth + else: + dfs(item.getList(), depth+1) + self.res = 0 + dfs(nestedList,1) + return self.res +``` + diff --git a/341. Flatten Nested List Iterator.md b/341. Flatten Nested List Iterator.md new file mode 100644 index 000000000..14c4f8737 --- /dev/null +++ b/341. Flatten Nested List Iterator.md @@ -0,0 +1,51 @@ +### 341. Flatten Nested List Iterator + + + +题目: + + + + +难度: +Medium + +思路: + +懒就一个字,您的AC代码击败了全国0.34%的Python用户,AC代码效率这么低,也是厉害。 + +AC代码: + +``` +class NestedIterator(object): + + def __init__(self, nestedList): + """ + Initialize your data structure here. + :type nestedList: List[NestedInteger] + """ + def dfs(nestedList): + for item in nestedList: + if item.isInteger(): + self.stack.append(item.getInteger()) + else: + dfs(item.getList()) + self.stack = [] + dfs(nestedList) + + + def next(self): + """ + :rtype: int + """ + if self.hasNext(): + return self.stack.pop(0) + + + def hasNext(self): + """ + :rtype: bool + """ + return self.stack != [] +``` + diff --git a/342. Power of Four.md b/342. Power of Four.md new file mode 100644 index 000000000..dce04d62a --- /dev/null +++ b/342. Power of Four.md @@ -0,0 +1,33 @@ +### 342. Power of Four + + + +题目: + + + + +难度 : Easy + +继续照抄power of three + +``` +class Solution(object): + def isPowerOfFour(self, num): + """ + :type num: int + :rtype: bool + """ + if num <= 0 : + return False + if num == 1: + return True + if num % 4 == 0: + return self.isPowerOfFour(num/4) + else: + return False + +``` + + + diff --git a/344._reverse_string.md b/344._reverse_string.md new file mode 100644 index 000000000..ebaecf53c --- /dev/null +++ b/344._reverse_string.md @@ -0,0 +1,47 @@ +###344. Reverse String + + + +题目: + + + +难度: +Easy + +思路: + +不要脸的python AC code: + + +``` +class Solution(object): + def reverseString(self, s): + """ + :type s: str + :rtype: str + """ + return s[::-1] +``` + +因为python不支持item assignment + +所以如果非要用two pointer来做的话,那么会是这样 + +``` +class Solution(object): + def reverseString(self, s): + """ + :type s: str + :rtype: str + """ + lst = list(s) + n = len(lst) + start, end = 0, n - 1 + + while start < end: + lst[end], lst[start] = lst[start],lst[end] + start += 1 + end -= 1 + return ''.join(lst) +``` diff --git a/349._intersection_of_two_arrays.md b/349._intersection_of_two_arrays.md new file mode 100644 index 000000000..d3c1f5868 --- /dev/null +++ b/349._intersection_of_two_arrays.md @@ -0,0 +1,25 @@ +###349. Intersection of Two Arrays + +题目: + + + +难度: + +Easy + + + +Python一句话作弊 + +``` +class Solution(object): + def intersection(self, nums1, nums2): + """ + :type nums1: List[int] + :type nums2: List[int] + :rtype: List[int] + """ + return list(set(nums1).intersection(nums2)) +``` + diff --git a/350._intersection_of_two_arrays_ii.md b/350._intersection_of_two_arrays_ii.md new file mode 100644 index 000000000..bd43b8dc8 --- /dev/null +++ b/350._intersection_of_two_arrays_ii.md @@ -0,0 +1,46 @@ +###350. Intersection of Two Arrays II + +题目: + + + + +难度: + +Easy + + +sort之后用了双指针来走和看 + + +``` +class Solution(object): + def intersect(self, nums1, nums2): + """ + :type nums1: List[int] + :type nums2: List[int] + :rtype: List[int] + """ + nums1.sort() + nums2.sort() + + l1 = len(nums1) + l2 = len(nums2) + + p1 = 0 + p2 = 0 + + res = [] + + while p1 < l1 and p2 < l2: + if nums1[p1] < nums2[p2]: + p1 += 1 + elif nums1[p1] > nums2[p2]: + p2 += 1 + else: + res.append(nums1[p1]) + p1 += 1 + p2 += 1 + return res +``` + \ No newline at end of file diff --git a/353. Design Snake Game.md b/353. Design Snake Game.md new file mode 100644 index 000000000..b9b95757c --- /dev/null +++ b/353. Design Snake Game.md @@ -0,0 +1,89 @@ +### 353. Design Snake Game + + + +题目: + + + +难度: Medium + +思路: + +纯正单纯方式 + +在TLE边缘AC + +AC代码 + + + +``` +class SnakeGame(object): + + def __init__(self, width,height,food): + """ + Initialize your data structure here. + @param width - screen width + @param height - screen height + @param food - A list of food positions + E.g food = [[1,1], [1,0]] means the first food is positioned at [1,1], the second is at [1,0]. + :type width: int + :type height: int + :type food: List[List[int]] + """ + self.width = width + self.height = height + self.food = food + self.snake = [[0,0]] + self.score = 0 + + + def move(self, direction): + """ + Moves the snake. + @param direction - 'U' = Up, 'L' = Left, 'R' = Right, 'D' = Down + @return The game's score after the move. Return -1 if game over. + Game over when snake crosses the screen boundary or bites its body. + :type direction: str + :rtype: int + """ + + nextx, nexty = self.snake[0] + + if direction == 'U': + nextx -= 1 + if direction == 'L': + nexty -=1 + if direction == 'R': + nexty +=1 + if direction == 'D': + nextx +=1 + + # nextx, nexty has food + if self.food and [nextx,nexty] == self.food[0]: + self.snake.insert(0,[nextx,nexty]) + self.food = self.food[1:] + self.score += 1 + # netx, nety outside boundary + else: + self.snake = self.snake[:-1] + self.snake.insert(0,[nextx,nexty]) + if nextx < 0 or nextx > self.height - 1 or nexty < 0 or nexty > self.width - 1: + return -1 + noDupes = [] + + for snakePt in self.snake: + # print snakePt, + if snakePt not in noDupes: + noDupes.append(snakePt) + # print 'snake', self.snake + # print 'noDpues', noDupes + if len(noDupes) < len(self.snake): + return -1 + return self.score + +``` + + + diff --git a/364. Nested List Weight Sum II.md b/364. Nested List Weight Sum II.md new file mode 100644 index 000000000..d72cb1643 --- /dev/null +++ b/364. Nested List Weight Sum II.md @@ -0,0 +1,47 @@ +### 364. Nested List Weight Sum II + + + +题目: + + +难度: +Medium + +思路: + + + +跟 Nested List Weight Sum I 的区别是这个是从不是数depth,是数层的高度: + + + +比较naive的AC代码: + +``` +class Solution(object): + def depthSumInverse(self, nestedList): + """ + :type nestedList: List[NestedInteger] + :rtype: int + """ + def level(nestedList,height): + self.level = max(height, self.level) + for item in nestedList: + if not item.isInteger(): + level(item.getList(), height + 1) + + def dfs(nestedList, height): + for item in nestedList: + if item.isInteger(): + self.res += item.getInteger() * height + else: + dfs(item.getList(),height - 1) + + self.level = 1 + self.res = 0 + level(nestedList,1) + dfs(nestedList, self.level) + return self.res +``` + diff --git a/366. Find Leaves of Binary Tree.md b/366. Find Leaves of Binary Tree.md new file mode 100644 index 000000000..569296cb0 --- /dev/null +++ b/366. Find Leaves of Binary Tree.md @@ -0,0 +1,54 @@ +### 366. Find Leaves of Binary Tree + + + +题目: + + + + + +难度 :Medium + + + +按照它的要求,老老实实写了两个递归 findleaf 和 deleteleaf, 再组合起来 + + + +AC代码 + +``` +class Solution(object): + def findLeaves(self, root): + """ + :type root: TreeNode + :rtype: List[List[int]] + """ + def findLeaf(root): + if root == None: + return [] + elif root.left == None and root.right == None: + return [root.val] + else: + return findLeaf(root.left) + findLeaf(root.right) + + def removeLeaf(root): + if root == None: + return None + elif root.left == None and root.right == None: + return None + else: + if root.left: + root.left = removeLeaf(root.left) + if root.right: + root.right = removeLeaf(root.right) + return root + + res = [] + while root: + res.append(findLeaf(root)) + root = removeLeaf(root) + return res +``` + diff --git a/367._valid_perfect_square.md b/367._valid_perfect_square.md new file mode 100644 index 000000000..7bb7285d4 --- /dev/null +++ b/367._valid_perfect_square.md @@ -0,0 +1,42 @@ +###367. Valid Perfect Square + +题目: + + + + +难度: + +Medium + + +直接用循环做也可以AC + + +``` +class Solution(object): + def isPerfectSquare(self, num): + """ + :type num: int + :rtype: bool + """ + if num == 1 or num == 4 : return True + for i in xrange(num//2): + if i*i == num: + return True + elif i*i > num: + return False + return False + +``` + +然后发现有传说中的牛顿法 + +有待阅读,然后还有二分法 + +``` + r = x + while r*r > x: + r = (r + x/r) / 2 + return r*r == x +``` \ No newline at end of file diff --git a/369.Plus One Linked List.md b/369.Plus One Linked List.md new file mode 100644 index 000000000..92c64e78e --- /dev/null +++ b/369.Plus One Linked List.md @@ -0,0 +1,46 @@ +### 369.Plus One Linked List + +题目: + + +难度 : Medium + + + +类似题目: plus one,plus one 用递归和循环写了,对于linked list,因为most significant digit在首位,递归写起来不方便,用循环尝试,然后代码并没有实质上的区别。 + + + +``` +class Solution(object): + def plusOne(self, head): + """ + :type head: ListNode + :rtype: ListNode + """ + lst = [] + cur = head + + while cur: + lst.append(cur) + cur = cur.next + + carry = 1 + for i in range(len(lst)-1,-1,-1): + lst[i].val += carry + if lst[i].val < 10: + carry = 0 + break + else: + lst[i].val -= 10 + + if carry == 1: + node = ListNode(1) + node.next = head + return node + else: + return head +``` + + + diff --git a/371._sum_of_two_integers.md b/371._sum_of_two_integers.md new file mode 100644 index 000000000..675aa9724 --- /dev/null +++ b/371._sum_of_two_integers.md @@ -0,0 +1,95 @@ +###371. Sum of Two Integers + +题目: + + + +难度: + +Easy + + +思路 + + +谷歌答案 + + +位运算 + +``` +XOR +x y output +0 0 0 +1 0 1 +0 1 1 +1 1 0 + + +AND +x y output +0 0 0 +1 0 1 +0 1 1 +1 1 1 + +``` + +如果对x和y来做加法(x和y都是一位的),那么末位会是x xor y,进位会是x and y + + + + + +python没有左移,用c++来看 + +``` +class Solution { +public: + int getSum(int a, int b) { + while (b != 0 ){ + int c = a & b; + a = a ^ b; + b = c << 1; + } + return a; + } +}; +``` + +实际上看到答案还是没有那么明白的,还是动手算算 + + + +``` +a = 6 (0110) +b = 15 (1111) + + +1st +--------- +carry = a & b = 0110 +a = a ^ b = 1001 +b = 1100 + + +2nd +--------- +carry = a & b = 1000 +a = a ^ b = 0101 +b = 10000 + + +3rd +---------- + +carry = a & b = 0 +a = a ^ b = 10101 +b = 0 + +这个时候a 的值是2^4 + 2^2 + 2^0 = 16+4+1 = 21 +``` + +虽然convence了我自己,但是表示依旧迷茫ing + +也知道位运算需要待补啊 \ No newline at end of file diff --git a/377._combination_sum_iv.md b/377._combination_sum_iv.md new file mode 100644 index 000000000..88548d175 --- /dev/null +++ b/377._combination_sum_iv.md @@ -0,0 +1,77 @@ +###377. Combination Sum IV + +题目: + + + + +难度: + +Medium + + +直接用combination sum的思路: 超时 + +``` +class Solution(object): + def combinationSum4(self, candidates, target): + """ + :type candidates: List[int] + :type target: int + :rtype: List[List[int]] + """ + def combSum(candidates, target, start, valueList): + length = len(candidates) + if target == 0 : + res.append(valueList) + for i in range(start, length): + if target < candidates[i]: + return + combSum(candidates, target - candidates[i], 0, valueList + [candidates[i]]) + + candidates = list(set(candidates)) + candidates.sort() + res = [] + combSum(candidates, target, 0, []) + return len(res) +``` + + + + + +说起来标签是dp,也知道是dp啊,状态转移方程: + + + +参考: + + + +> +> +> 我们需要一个一维数组dp,其中dp[i]表示目标数为i的解的个数,然后我们从1遍历到target,对于每一个数i,遍历nums数组,如果i>=x, dp[i] += dp[i - x]。这个也很好理解,比如说对于[1,2,3] 4,这个例子,当我们在计算dp[3]的时候,3可以拆分为1+x,而x即为dp[2],3也可以拆分为2+x,此时x为dp[1],3同样可以拆为3+x,此时x为dp[0],我们把所有的情况加起来就是组成3的所有情况了 + + + +AC代码 + +``` +class Solution(object): + def combinationSum4(self, candidates, target): + """ + :type candidates: List[int] + :type target: int + :rtype: List[List[int]] + """ + dp = [0 for i in range(target+1)] + + dp[0] = 1 + + for i in range(target+1): + for candidate in candidates: + if i >= candidate: + dp[i] += dp[i - candidate] + return dp[-1] +``` + diff --git a/378._kth_smallest_element_in_a_sorted_matrix.md b/378._kth_smallest_element_in_a_sorted_matrix.md new file mode 100644 index 000000000..69ec45988 --- /dev/null +++ b/378._kth_smallest_element_in_a_sorted_matrix.md @@ -0,0 +1,61 @@ +###378. Kth Smallest Element in a Sorted Matrix + + + +题目: + + + +难度: +Medium + +思路: + + +两个tag : binary search, heap + +######先来heap + +1. 利用heap,先对第一行所有元素加入heap,每个元素下面同一列的元素必然比他们大 +2. 重复K-1次下面的过程 + - 取现在的root + - 将root下面的元素加入heap + +可以手写一个例子来看 + +参考: + + +``` +from heapq import * +class Solution(object): + def kthSmallest(self, matrix, k): + """ + :type matrix: List[List[int]] + :type k: int + :rtype: int + """ + if not matrix: + return 0 + + heap = [] + row = len(matrix) + col = len(matrix[0]) + + for i in range(col): + # heap store its value and location + heappush(heap, (matrix[0][i], 0, i)) + + print heap + + for j in range(k-1): + cur = heappop(heap) + x = cur[1] + y = cur[2] + if x+1 < row: + heappush(heap, (matrix[x+1][y],x+1,y)) + + return heap[0][0] +``` + +##### 必然还有利用binary search的算法 \ No newline at end of file diff --git a/380. Insert Delete GetRandom O(1).md b/380. Insert Delete GetRandom O(1).md new file mode 100644 index 000000000..401f3ee7f --- /dev/null +++ b/380. Insert Delete GetRandom O(1).md @@ -0,0 +1,159 @@ +### 380. Insert Delete GetRandom O(1) + + + +题目: + + + + +难度 : Hard + + + +我的naive TLE代码,关键还是在想这个getRandom,这就不是O(1)的: + + + +``` +class RandomizedSet(object): + + def __init__(self): + """ + Initialize your data structure here. + """ + self.container = {} + + + def insert(self, val): + """ + Inserts a value to the set. Returns true if the set did not already contain the specified element. + :type val: int + :rtype: bool + """ + # 1 stands for present + if val in self.container and self.container[val] == 1: + return False + else: + self.container[val] = 1 + return True + + + def remove(self, val): + """ + Removes a value from the set. Returns true if the set contained the specified element. + :type val: int + :rtype: bool + """ + if self.container.get(val,0) == 1: + self.container[val] = 0 + return True + else: + return False + + + + def getRandom(self): + """ + Get a random element from the set. + :rtype: int + """ + import random + keys = self.container.keys() + rd = random.randint(0, len(keys) - 1) + if self.container[keys[rd]] == 1: + return keys[rd] + elif self.container.get(keys[rd],0) == 0: + return self.getRandom() +``` + + + +也是有[stackoverflow问题界面的题目](http://stackoverflow.com/questions/5682218/data-structure-insert-remove-contains-get-random-element-all-at-o1#comment18171331_5684892): + +> Consider a data structure composed of a hashtable H and an array A. The hashtable keys are the elements in the data structure, and the values are their positions in the array. +> +> 1.insert(value): append the value to array and let i be its index in A. Set H[value]=i. +> +> 2.remove(value): We are going to replace the cell that contains value in A with the last element in A. let d be the last element in the array A at index m. let i be H[value], the index in the array of the value to be removed. Set A[i]=d, H[d]=i, decrease the size of the array by one, and remove value from H. +> +> 3.contains(value): return H.contains(value) +> +> 4.getRandomElement(): let r=random(current size of A). return A[r]. +> +> +> +> since the array needs to auto-increase in size, it's going to be amortize O(1) to add an element, but I guess that's OK. + + + + + +按照以答案AC代码 + +``` +class RandomizedSet(object): + + def __init__(self): + """ + Initialize your data structure here. + """ + self.hashtable = {} + self.array = [] + self.arraySize = 0 + + def insert(self, val): + """ + Inserts a value to the set. Returns true if the set did not already contain the specified element. + :type val: int + :rtype: bool + """ + # already in the set + if val in self.hashtable: + return False + else: + self.hashtable[val] = self.arraySize + self.array.append(val) + self.arraySize += 1 + return True + + + def remove(self, val): + """ + Removes a value from the set. Returns true if the set contained the specified element. + :type val: int + :rtype: bool + """ + if val not in self.hashtable: + return False + else: + removeIdx = self.hashtable[val] + if self.arraySize == 1: + self.__init__() + else: + self.array[removeIdx] = self.array[-1] + self.hashtable[self.array[-1]] = removeIdx + self.arraySize -= 1 + del self.hashtable[val] + del self.array[-1] + return True + + + + def getRandom(self): + """ + Get a random element from the set. + :rtype: int + """ + import random + rd = random.randint(0, self.arraySize-1) + return self.array[rd] +``` + + + + + +最后getRandom也可以写成: + +`return random.choice(self.array)` \ No newline at end of file diff --git a/381. Insert Delete GetRandom O(1) - Duplicates allowed.md b/381. Insert Delete GetRandom O(1) - Duplicates allowed.md new file mode 100644 index 000000000..9adb6cd32 --- /dev/null +++ b/381. Insert Delete GetRandom O(1) - Duplicates allowed.md @@ -0,0 +1,83 @@ +### 381. Insert Delete GetRandom O(1) - Duplicates allowed + + + +题目: + + + + +难度 : Hard + + + +一开始的想法是在380上面做简单的修改,比如用一个list来存每个数对应的location,但是这样remove会退化为O(N),然后看到: + +- 用 set 这个数据结构就可以贴近O(1) +- 学了一个新的东西`defaultdict`, 相当于 D.get('key',defaultvalue) + + + +这个defaultdict的好处就是添加的时候默认的值就是set,但是并不默认这个就存在 + + + +AC代码 + +``` +class RandomizedCollection(object): + + def __init__(self): + """ + Initialize your data structure here. + """ + import collections + self.hashtable = collections.defaultdict(set) + self.array = [] + + def insert(self, val): + """ + Inserts a value to the collection. Returns true if the collection did not already contain the specified element. + :type val: int + :rtype: bool + """ + valin = val not in self.hashtable + self.hashtable[val].add(len(self.array)) + self.array.append(val) + return valin + + def remove(self, val): + """ + Removes a value from the collection. Returns true if the collection contained the specified element. + :type val: int + :rtype: bool + """ + if val not in self.hashtable: + return False + else: + if self.array[-1] == val: + removeIdx = len(self.array) - 1 + self.hashtable[val].remove(removeIdx) + else: + # set pop remove arbitrary element + removeIdx = self.hashtable[val].pop() + self.array[removeIdx] = self.array[-1] + self.hashtable[self.array[-1]].remove(len(self.array) - 1) + self.hashtable[self.array[-1]].add(removeIdx) + if len(self.hashtable[val]) == 0: + del self.hashtable[val] + del self.array[-1] + return True + + + def getRandom(self): + """ + Get a random element from the collection. + :rtype: int + """ + import random + return random.choice(self.array) + +``` + +` \ No newline at end of file diff --git a/382._linked_list_random_node.md b/382._linked_list_random_node.md new file mode 100644 index 000000000..775a0b32d --- /dev/null +++ b/382._linked_list_random_node.md @@ -0,0 +1,79 @@ + +###382. Linked List Random Node + + +题目: + + + +难度: + +Medium + + + +tag:reservoir sampling 水塘抽样 + + +思路: + +n选k + + +这样来看,有k个元素,那么这个时候全部选中,当第k+1个元素进来的时候,生成一个随机数r,如果 r <= k,那么用它来替换第r个元素 + +那么r被替换掉的概率是 1 / k + 1, 不被替换掉的概率是 k / k + 1 (不生成r) + +k+2来继续: 被替换掉的概率 1 / k + 2, 不被替换掉的概率 (k + 1) / (k+2) + +所以最终被选中的(不被替换掉的概率是) k / n + +随机 √ + + +针对这道题目来看 + +- 一开始选head为choice +- 出现第二个,生成[1,2]之间的随机数,如果r = 2,则用新的来替换choice +- 出现第三个,生成[1,2,3]之间的随机数,如果r = 3,则替换 + +再写简单一点就是 + + +每次以 1/i 来决定是否用新的元素来替换选中元素,那么就是 i - 1 / i 不替换,它之前被选中的概率就是 1 / i-1 ,所以最终被选中的概率是 1/i + +这个对于linked list更优之处在于它不用reverse + +时间复杂度 O(N), 空间复杂度O(K) + + +然后AC + + +``` +class Solution(object): + + def __init__(self, head): + """ + @param head The linked list's head. + Note that the head is guaranteed to be not null, so it contains at least one node. + :type head: ListNode + """ + self.head = head + + def getRandom(self): + """ + Returns a random node's value. + :rtype: int + """ + choice = self.head + cur = self.head + i = 1 + while cur.next: + cur = cur.next + i += 1 + rd = random.randint(1,i) + if rd == i: + choice = cur + return choice.val +``` diff --git a/383._ransom_note.md b/383._ransom_note.md new file mode 100644 index 000000000..6d6e0cf2d --- /dev/null +++ b/383._ransom_note.md @@ -0,0 +1,37 @@ +###383. Ransom Note + +题目: + + + +难度 : Easy + + + +略微想了一下,用了一个dictionary来存magazine里面的单字出现的个数,然后来对应check是否可以用来组成ransomNote + + +``` +class Solution(object): + def canConstruct(self, ransomNote, magazine): + """ + :type ransomNote: str + :type magazine: str + :rtype: bool + """ + mapx = {} + for i in magazine: + if i not in mapx: + mapx[i] = 1 + else: + mapx[i] += 1 + + for i in ransomNote: + if i not in mapx: + return False + elif i in mapx: + mapx[i] -= 1 + if mapx[i] < 0: + return False + return True +``` diff --git a/384. Shuffle an Array.md b/384. Shuffle an Array.md new file mode 100644 index 000000000..bd3d126a9 --- /dev/null +++ b/384. Shuffle an Array.md @@ -0,0 +1,105 @@ +### 384. Shuffle an Array + + + +题目: + + + + +难度 : Medium + + + +思路: + + + +这就是洗牌算法吧,洗牌算法几种常见的: + + + +http://www.matrix67.com/blog/archives/879 + + + +也是有wikipedia page的: + +最简单的算法是很容易想到的, O(N^2) + +然后就是modern 算法: + + + +``` +-- To shuffle an array a of n elements (indices 0..n-1): +for i from n−1 downto 1 do + j ← random integer such that 0 ≤ j ≤ i + exchange a[j] and a[i] +``` + + + +这个感觉还是比较容易证明的,一开始生成的数字 1/n 概率 + +没选中,下一个 n-1 /n * 1/ n-1 = 1/n, 所以每个位置都是等概率的? + + + +这个有很妙的点: + +比如五个人顺序抽签,只要不uncover 结果,那么就是等概率的。 + + + +但是第一个人抽奖之后uncover结果,比如他没有抽中 → 那么概率就会变。 + + + + + + + +AC代码: + +``` +class Solution(object): + + def __init__(self, nums): + """ + + :type nums: List[int] + :type size: int + """ + self.lst = nums + + + def reset(self): + """ + Resets the array to its original configuration and return it. + :rtype: List[int] + """ + return self.lst + + + def shuffle(self): + """ + Returns a random shuffling of the array. + :rtype: List[int] + """ + import random + res = self.lst[:] + n = len(res) + for i in range(n-1,0,-1): + j = random.randint(0,i) + res[i], res[j] = res[j], res[i] + return res + +``` + + + + + + + diff --git a/387._first_unique_character_in_a_string.md b/387._first_unique_character_in_a_string.md new file mode 100644 index 000000000..db3256c39 --- /dev/null +++ b/387._first_unique_character_in_a_string.md @@ -0,0 +1,59 @@ +###387. First Unique Character in a String + +题目: + + + +难度: +Easy + + + +思路一: + +Python作弊法 + +用Python的Counter模块 + +可以参考 + + + + +``` +class Solution(object): + def firstUniqChar(self, s): + """ + :type s: str + :rtype: int + """ + import collections + d = collections.Counter(s) + for x,c in enumerate(s): + if d[c] == 1: + return x + return -1 +``` + + +思路二: + +利用问题的特性,因为只有可能是小写字母,所以可以用一个长度为26的array, 先数一遍char的数量,然后enumerate从左往右又来 + +``` +class Solution(object): + def firstUniqChar(self, s): + """ + :type s: str + :rtype: int + """ + cnt = [0 for i in range(26)] + for char in s: + cnt[ord(char) - ord('a')] += 1 + + for idx, char in enumerate(s): + if cnt[ord(char) - ord('a')] == 1: + return idx + return -1 + +``` diff --git a/389._find_the_difference.md b/389._find_the_difference.md new file mode 100644 index 000000000..a26bc73ae --- /dev/null +++ b/389._find_the_difference.md @@ -0,0 +1,47 @@ + +###389. Find the Difference + + +题目: + + + +难度: + +Easy + + +思路 + +用两个hashmap分别来记录 s 和 t 中char的数量,一旦t[key] > s[key], output + +注意这个好的写法 + + +mapt[char] = mapt.get(char,0) + 1 + +如果mapt[char]不存在,会默认给1 + + + +``` +class Solution(object): + def findTheDifference(self, s, t): + """ + :type s: str + :type t: str + :rtype: str + """ + maps = {} + mapt = {} + for char in s: + maps[char] = maps.get(char,0) + 1 + for char in t: + mapt[char] = mapt.get(char,0) + 1 + + for key in mapt: + if mapt[key] - maps.get(key,0) > 0: + return key +``` + + diff --git a/392._is_subsequence.md b/392._is_subsequence.md new file mode 100644 index 000000000..b7727173b --- /dev/null +++ b/392._is_subsequence.md @@ -0,0 +1,69 @@ + +###392. Is Subsequence + + +题目: + + + +难度: + +Medium + + +思路 + + +follow up question很有意思 + + +最naive的思路表现形式如下: + +超时 + +``` +class Solution(object): + def isSubsequence(self, s, t): + """ + :type s: str + :type t: str + :rtype: bool + """ + if s == "": return True + for i in xrange(len(t)): + if t[i] == s[0]: + return self.isSubsequence(s[1:],t[i+1:]) + + return False +``` + +因为直接操作string的昂贵以及递归的昂贵 + +同样的思路 + + +``` +class Solution(object): + def isSubsequence(self, s, t): + """ + :type s: str + :type t: str + :rtype: bool + """ + if s == "" : return True + + ps, pt = 0, 0 + lens, lent = len(s), len(t) + while ps < lens and pt < lent: + if s[ps] == t[pt]: + ps += 1 + pt += 1 + else: + pt += 1 + + return ps >= lens +``` + +AC + + diff --git a/394._decode_string.md b/394._decode_string.md new file mode 100644 index 000000000..a9eabe7f1 --- /dev/null +++ b/394._decode_string.md @@ -0,0 +1,70 @@ +###394. Decode String + + +题目: + + + + +难度: + +Medium + + +思路: + +感觉像用栈做运算。 + +s = "3[a2[c]]" + +⬇️ + +s = 3 *( a + 2 * ( c ) ) + + +遇到非右括号全部入栈,碰到右括号出栈直到左括号,这个就算运算符2 → op2 +然后检查,直到stack空掉或者碰到下一个非数字,这个就算运算符1 → op1 + +算出op1 和 op2 之后把这个res继续入栈。然后接着处理 + + +代码不是很优美 + + + + +``` +class Solution(object): + def decodeString(self, s): + """ + :type s: str + :rtype: str + """ + + s = list(s) + stack = [] + + while s: + char = s.pop(0) + if char != ']': + stack.append(char) + else: + op1, op2 = '','' + popChar = stack.pop() + while popChar != '[': + op2 = popChar + op2 + popChar = stack.pop() + + while stack and stack[-1] in ['0','1','2','3','4','5','6','7','8','9']: + popChar = stack.pop() + op1 = popChar + op1 + + res = int(op1) * op2 + + for char in res: + stack.append(char) + + return ''.join(stack) +``` + + diff --git a/400. Nth Digit.md b/400. Nth Digit.md new file mode 100644 index 000000000..6cc93ab3e --- /dev/null +++ b/400. Nth Digit.md @@ -0,0 +1,46 @@ +### 400. Nth Digit + + + +题目: + + +难度: + +Easy + +思路: + +这道简单题我服, tag是math,找规律 + +``` +1- 9 : 9 → 只占1位 9 +10 - 99: 90 → 两位 90 * 2 +100 - 999: 900 → 三位 900 * 3 +1000 - 9999: 9000 → 四位 9000 * 4 +``` + + + +AC代码来之不易,是参考别人的,这里的`for i in range(9)`, 其实无论`range`多少都可以吧 + + + +``` +class Solution(object): + def findNthDigit(self, n): + """ + :type n: int + :rtype: int + """ + for i in range(9): + d = 9 * 10 ** i + if n <= d * (i+1): break + n -= d *(i+1) + n -= 1 + + return int(str(10**i + n / (i+1))[n % (i+1)]) +``` + + + diff --git a/401._binary_watch.md b/401._binary_watch.md new file mode 100644 index 000000000..00f217e7f --- /dev/null +++ b/401._binary_watch.md @@ -0,0 +1,60 @@ +###401. Binary Watch + + + +题目: + + + +难度: +Easy + + +思路: + + +一看到位操作,我的内心是拒绝的。 + +我也有想这样的想法,因为其实可以的组合并没有那么多,干脆枚举算了,然而也没有动手来写,直到被发了题解的截屏。 + + +``` +class Solution(object): + def readBinaryWatch(self, num): + """ + :type num: int + :rtype: List[str] + """ + hour = { 0 : ['0'], + 1:['1','2','4','8'], + 2:['3','5','6','9','10'], + 3:['7','11'] + } + + minute = { 0:['00'], + 1: ['01','02','04','08','16','32'], + 2: ['03','05','06','09','10','12','17','18','20','24','33','34','36','40','48'], + 3: ['07','11','13','14','19','21','22','25','26','28','35','37','38','41','42','44','49','50','52','56'], + 4: ['15','23','27','29','30','39','43','45','46','51','53','54','57','58'], + 5: ['31','47','55','59'] + } + + res = [] + + #num = num for hour + num for minute + i = 0 + + while i <= 3 and i <= num: + if num - i <= 5: + for str1 in hour[i]: + for str2 in minute[num-i]: + res.append(str1 + ':' + str2) + i += 1 + return res +``` + + +关于循环那处,因为hour的led最多只有4个,所以这样写循环 + + + diff --git a/404._sum_of_left_leaves.md b/404._sum_of_left_leaves.md new file mode 100644 index 000000000..b6cda537c --- /dev/null +++ b/404._sum_of_left_leaves.md @@ -0,0 +1,45 @@ +###404. Sum of Left Leaves + + + +题目: + + + +难度: +Easy + + +思路: + + +典型递归,检查root的左孩子是不是node,是的话加上它的值,不是的话递归去求它的孩子们的,对于右边,递归的求sum of left leaves + + + +``` +class Solution(object): + def sumOfLeftLeaves(self, root): + """ + :type root: TreeNode + :rtype: int + """ + def isLeaf(node): + if node == None: + return False + if node.left == None and node.right == None: + return True + return False + + res = 0 + + if root: + if isLeaf(root.left): + res += root.left.val + else: + res += self.sumOfLeftLeaves(root.left) + if root.right: + res += self.sumOfLeftLeaves(root.right) + + return res +``` \ No newline at end of file diff --git a/405. Convert a Number to Hexadecimal.md b/405. Convert a Number to Hexadecimal.md new file mode 100644 index 000000000..5bcb3ec36 --- /dev/null +++ b/405. Convert a Number to Hexadecimal.md @@ -0,0 +1,114 @@ +### 405. Convert a Number to Hexadecimal + +题目: + + + +难度: + +Easy + + + +wikipedia两个page: + + + +[十六进制](https://zh.wikipedia.org/wiki/十六进制#.E5.8D.81.E9.80.B2.E5.88.B6.E8.BD.89.E5.8D.81.E5.85.AD.E9.80.B2.E5.88.B6) + +例子: + +4877÷16=304....13(D) + +304÷16=19....0 + +19÷16=1....3 + +1÷16=0....1 + +這樣就計到4877(10)=130D(16) + + + +[补码](https://zh.wikipedia.org/wiki/二補數) + +> 一個數字的二補數就是將該數字作[位元](https://zh.wikipedia.org/wiki/%E4%BD%8D%E5%85%83)[反相](https://zh.wikipedia.org/w/index.php?title=%E5%8F%8D%E7%9B%B8&action=edit&redlink=1)運算(即[一補數](https://zh.wikipedia.org/wiki/%E4%B8%80%E8%A3%9C%E6%95%B8)或[反码](https://zh.wikipedia.org/wiki/%E5%8F%8D%E7%A0%81)),再將結果加1。在二補數系統中,一個負數就是用其對應正數的二補數來表示 + + + +看给的这个-1的例子 + + + +0000 0000 0000 0000 0000 0000 0000 0001 + +1111 1111 1111 1111 1111 1111 1111 1110 +1 + +1111 1111 1111 1111 1111 1111 1111 1111 + +f f f f f f f f + + + + + +也可以参考这里: + +[基础03:原码、反码、补码](https://higoge.github.io/2015/07/02/basic03/) + + + +这里我一开始迷茫和晕了一下,但是随后反应过来,这些数字在电脑里使用二进制存的,而负数也是用二进制的补码存的。所以其实AC代码应当很简单。 + +参考: + + + + + +AC代码: + +``` +class Solution(object): + def toHex(self, num): + """ + :type num: int + :rtype: str + """ + if not num : + return "0" + + result = [] + hexStr ="0123456789abcdef" + while num and len(result) != 8: + h = num & 15 + result.append(hexStr[h]) + num >>= 4 + + return ''.join(result[::-1]) +``` + + + +每次看后四位的结果,把它存起来,比如还是是看4877 + +它在计算机内部的表示是: + +``` +0b1001100001101 +num & 15 1101 & 15 = 13(d) +num >>=4 0b100110000 +num & 15 0000 & 15 = 0 +num >>=4 0b10011 +num & 15 10011 & 15 = 9 +num >>=4 0001 +num & 15 0001 & 15 = 1 + +``` + + + + + + + diff --git a/412._fizz_buzz.md b/412._fizz_buzz.md new file mode 100644 index 000000000..7d9ee87f5 --- /dev/null +++ b/412._fizz_buzz.md @@ -0,0 +1,35 @@ +###412. Fizz Buzz + +题目: + + + +难度: +Easy + + +``` +class Solution(object): + def fizzBuzz(self, n): + """ + :type n: int + :rtype: List[str] + """ + res = [] + + for i in range(1,n+1): + item = '' + if i % 3 == 0: + item += 'Fizz' + if i % 5 == 0: + item += 'Buzz' + res.append(item || str(n)) + return res + +``` + +就是easy,不过可以参见这里,有一些讨论 + + + +我觉得这里一个用yield的想法还蛮不错 \ No newline at end of file diff --git a/413. Arithmetic Slices.md b/413. Arithmetic Slices.md new file mode 100644 index 000000000..6aff8c826 --- /dev/null +++ b/413. Arithmetic Slices.md @@ -0,0 +1,84 @@ +### 413. Arithmetic Slices + + + +题目: + + + + +难度 : Medium + + + +思路: + +tag 是DP + +数从 i 到 j 之间的这个arithmetic 数 + +我的方法时间复杂度比较高O(N^2),从 i 开始数它的arithmetic slice,每个i数一遍,到 j + +AC代码 + +``` +class Solution(object): + def numberOfArithmeticSlices(self, A): + """ + :type A: List[int] + :rtype: int + """ + n = len(A) + if n < 3: + return 0 + else: + res = 0 + for i in range(n-2): + for j in range(i+2,n): + if A[j] - A[j-1] == A[i+1] - A[i]: + res += 1 + else: + break + return res +``` + + + +应该可以优化到O(N) + +不需要每个每个开始数,可以边数边移动 + +可以参考 + + + +O(N) 代码 + +``` +class Solution(object): + def numberOfArithmeticSlices(self, A): + """ + :type A: List[int] + :rtype: int + """ + n = len(A) + if n < 3: + return 0 + else: + res, cnt = 0, 2 + for i in range(2, n): + if A[i] - A[i-1] == A[i-1] - A[i-2]: + print i, i-1, i-2 + cnt += 1 + else: + if cnt > 2: + res += (cnt-1) * (cnt-2) / 2 + cnt = 2 + if cnt > 2: res += (cnt-1) * (cnt-2) / 2 + return res + + +``` + + + diff --git a/414._third_maximum_number.md b/414._third_maximum_number.md new file mode 100644 index 000000000..fc3652b98 --- /dev/null +++ b/414._third_maximum_number.md @@ -0,0 +1,46 @@ +###414. Third Maximum Number + +题目: + + + +难度: + +Easy + + +思路: + +用三个变量来记录,max, secondmax, thirdmax, + +- 遇到比max还大的就更新,当前max降级为secondmax,当前secondmax降级为thirdmax +- 遇到比max小但是比secondmax大的也这样做降级处理 +- 更thirdmax + + +AC代码 + + +``` +class Solution(object): + def thirdMax(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + m, sm, tm = float('-inf'), float('-inf'), float('-inf') + + for num in nums: + if num > m: + tm = sm + sm = m + m = num + elif num < m and num > sm: + tm = sm + sm = num + elif num < m and num < sm and num > tm: + tm = num + + return tm if tm != float('-inf') else m +``` + diff --git a/415._add_strings.md b/415._add_strings.md new file mode 100644 index 000000000..bfa319cdf --- /dev/null +++ b/415._add_strings.md @@ -0,0 +1,61 @@ +###415. Add Strings + +题目: + + + +难度: +Easy + + +照抄2. Add Two Numbers的代码,超时 + +``` +class Solution(object): + def addStrings(self, num1, num2): + """ + :type num1: str + :type num2: str + :rtype: str + """ + if num1 == '' or num1 == '0': + return num2 + if num2 == '' or num2 == '0': + return num1 + if int(num1[-1]) + int(num2[-1]) < 10: + num3 = str(int(num1[-1]) + int(num2[-1]) ) + return self.addStrings(num1[:-1] , num2[:-1]) + num3 + else: + num3 = str(int(num1[-1]) + int(num2[-1]) - 10) + return self.addStrings(self.addStrings(num1[:-1] , num2[:-1]),'1') + num3 +``` + + + +换成迭代,并非递归再来尝试,看了别人的代码,真是精巧啊 + + +``` +class Solution(object): + def addStrings(self, num1, num2): + """ + :type num1: str + :type num2: str + :rtype: str + """ + result = [] + carry = 0 + idx1, idx2 = len(num1), len(num2) + while idx1 or idx2 or carry: + digit = carry + if idx1: + idx1 -= 1 + digit += int(num1[idx1]) + if idx2: + idx2 -= 1 + digit += int(num2[idx2]) + carry = digit > 9 + result.append(str(digit % 10)) + print result + return ''.join(result[::-1]) # 这里是reverse一下 +``` \ No newline at end of file diff --git a/416. Partition Equal Subset Sum.md b/416. Partition Equal Subset Sum.md new file mode 100644 index 000000000..1dee2d982 --- /dev/null +++ b/416. Partition Equal Subset Sum.md @@ -0,0 +1,87 @@ +### 416. Partition Equal Subset Sum + + + +题目: + + +难度: + +Medium + +记得算法考试考过证明这个问题是NP的,当时用的是subset sum是NP,然后来证明这个?如果我们能找到一个subset的sum是整个array sum的一半,那么问题解决。subset sum我们又可以继续转化,转成背包问题。 + +值得注意的是,这是subset sum,并不是subarray sum(这个明显要简单一些,因为subarray是连着的). + +subset sum也是有自己的[wikipedia page](https://en.wikipedia.org/wiki/Subset_sum_problem). + + + +当然,这也是一个subset problem,我们当然也可以用subset,加入和不加入,但是worst case O(2^n). + + + +对于subset sum的递推方程式: + +subset(arr,n,s) = subset(arr,n-1,s) or subset(arr, n-1, s- arrp[n-1]) + + + +画表可以开始,第一列全为1,是因为不选全部可以为0 + + + +``` + 0 1 2 3 4 5 6 8 9 10 11 +0 1 0 0 0 0 0 0 0 0 0 0 +1 1 1 0 0 0 0 0 0 0 0 0 +5 1 1 0 0 0 1 1 0 0 0 0 +5 1 1 0 0 0 1 1 0 0 0 1 +``` + + + +所以伪多项式算法写出来 + +AC代码 + + + +``` +class Solution(object): + def canPartition(self, nums): + """ + :type nums: List[int] + :rtype: bool + """ + def subset(nums, s): + dp = [[0 for i in range(s+1) ] for j in range(len(nums)+1)] + + dp[0][0] = 1 + # init the first col + for i in range(len(nums)+1 + dp[i][0] = 1 + + for i in range(1,len(nums)+1): + for j in range(1,s+1): + if dp[i-1][j] == 1: + dp[i][j] = 1 + elif j >= nums[i-1] and dp[i-1][j-nums[i-1]] ==1: + dp[i][j] = 1 + return dp[-1][-1] == 1 + + + + total = sum(nums) + if total % 2 == 1: + return False + else: + half = total / 2 + return subset(nums,half) == 1 + +``` + + + +当然可以小调整,比如一旦发现,提前return等等,但是时间上依旧是后20%,不知道时间上快很多的人是如何做到的||| + diff --git a/422. Valid Word Square.md b/422. Valid Word Square.md new file mode 100644 index 000000000..17cb1144d --- /dev/null +++ b/422. Valid Word Square.md @@ -0,0 +1,48 @@ +### 422. Valid Word Square + + + + + +题目: + + + + +难度 : Easy + + + +思路: + +就是对比一个矩阵内 xy == yx? + +try /except 真是好用 + +AC代码 + + + +``` +class Solution(object): + def validWordSquare(self, words): + """ + :type words: List[str] + :rtype: bool + """ + n = len(words) + for i in xrange(n): + m = len(words[i]) + for j in xrange(m): + try: + if words[i][j] != words[j][i]: + return False + except: + return False + return True +``` + + + + + diff --git a/434._number_of_segments_in_a_string.md b/434._number_of_segments_in_a_string.md new file mode 100644 index 000000000..2f478e20c --- /dev/null +++ b/434._number_of_segments_in_a_string.md @@ -0,0 +1,27 @@ +###434. Number of Segments in a String + +题目: + + + +难度: + +Easy + + +作弊神器Python + + +``` +class Solution(object): + def countSegments(self, s): + """ + :type s: str + :rtype: int + """ + return len(s.split()) +``` + +不过对于比如C++这种语言来说,应该是O(N),扫一圈应该也能得到正确答案 + +总之拿Python做string的题目就是作弊啊 \ No newline at end of file diff --git a/437._path_sum_iii.md b/437._path_sum_iii.md new file mode 100644 index 000000000..5d738d2b9 --- /dev/null +++ b/437._path_sum_iii.md @@ -0,0 +1,51 @@ +###437. Path Sum III + + + +题目: + + + +难度: +Easy + +思路: + +这题一看到,时间复杂度就把我给吓尿了,不是么|||科科 + +我的🐟👄的代码 + +是有优化,待做 + + + +``` +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def pathSum(self, root, sum): + """ + :type root: TreeNode + :type sum: int + :rtype: int + """ + # empty + def nodeValue(root, sum): + if not root: return 0 + # one node + if root.val == sum: + return 1 + nodeValue(root.left, 0) + nodeValue(root.right,0) + else: + return nodeValue(root.left, sum - root.val) + nodeValue(root.right, sum - root.val) + + if not root: return 0 + ans = nodeValue(root,sum) + ans += self.pathSum(root.left, sum) + ans += self.pathSum(root.right, sum) + return ans +``` \ No newline at end of file diff --git a/439. Ternary Expression Parser.md b/439. Ternary Expression Parser.md new file mode 100644 index 000000000..065f56cd7 --- /dev/null +++ b/439. Ternary Expression Parser.md @@ -0,0 +1,58 @@ +### 439. Ternary Expression Parser + + + + + +题目: + + + + +难度: +Medium + +思路: + +其实这个和算术运算蛮像,但是不同于运算,有operator precedence差别,这个是三目运算,并且需要检查是否符合运算规则。 + + + +运用stack 然后每次查看是否形成运算式再来做处理 + +AC代码: + +``` +class Solution(object): + def parseTernary(self, expression): + """ + :type expression: str + :rtype: str + """ + n = len(expression) + + stack = [] + + for i in range(n-1, -1, -1): + char = expression[i] + stack.append(char) + + if len(stack) >= 5: + op0 = stack.pop() + op1 = stack.pop() + op2 = stack.pop() + op3 = stack.pop() + op4 = stack.pop() + + if op1 == '?' and op3 == ':': + res = op2 if op0 == 'T' else op4 + stack.append(res) + else: + stack.append(op4) + stack.append(op3) + stack.append(op2) + stack.append(op1) + stack.append(op0) + return stack[0] +``` + diff --git a/441._arranging_coins.md b/441._arranging_coins.md new file mode 100644 index 000000000..5ef0dae95 --- /dev/null +++ b/441._arranging_coins.md @@ -0,0 +1,29 @@ +###441. Arranging Coins + +题目: + + + +难度: +Easy + + +可以直接O(1),公式: + +i(i+1)/2 = n + +解i + +i = ( sqrt(8*n+1) -1 )/ 2 + + +``` +import math +class Solution(object): + def arrangeCoins(self, n): + """ + :type n: int + :rtype: int + """ + return int((math.sqrt( 8 * n + 1) - 1 )/ 2 ) +``` \ No newline at end of file diff --git a/450. Delete Node in a BST.md b/450. Delete Node in a BST.md new file mode 100644 index 000000000..81c26c173 --- /dev/null +++ b/450. Delete Node in a BST.md @@ -0,0 +1,62 @@ +### 450. Delete Node in a BST + + + +题目: + + +难度 : Medium + + + +思路: + +从二叉搜索树中删除节点x的方法如下: + +• 如果x没有子节点,或者只有一个孩子,直接将x“切下”; + +• 否则,x有两个孩子,我们用其右子树中的最小值替换掉x,然后将右子树中的这一最小值递归的“切掉”。 +​ + + + +AC代码 + + + +``` +class Solution(object): + def deleteNode(self, root, key): + """ + :type root: TreeNode + :type key: int + :rtype: TreeNode + """ + def findmin(root): + while root.left: + root = root.left + return root + + + if not root : return None + elif key < root.val: root.left = self.deleteNode(root.left, key) + elif key > root.val : root.right = self.deleteNode(root.right, key) + else: + if root.left and root.right: + tmp = findmin(root.right) + root.val = tmp.val + root.right = self.deleteNode(root.right, tmp.val) + else: + if not root.left: + root = root.right + elif not root.right: + root = root.left + return root +``` + +​ + + + +其实这个代码还是需要花点时间来理解,需要画个图,理解这个root是每个stack return回去然后被接在原来的树上的,if 这个node并不是在node左右。 + diff --git a/453. Minimum Moves to Equal Array Elements.md b/453. Minimum Moves to Equal Array Elements.md new file mode 100644 index 000000000..064670f71 --- /dev/null +++ b/453. Minimum Moves to Equal Array Elements.md @@ -0,0 +1,72 @@ +### 453. Minimum Moves to Equal Array Elements + + + + + +题目: + + + + +难度 : Easy + + + +思路: + +naive TLE 代码: + +每次都是给并不是最大的元素加1直到全部相等。 + +``` +class Solution(object): + def minMoves(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + res = 0 + while(not all(x == nums[0] for x in nums)): + nums.sort() + for i in range(len(nums) - 1): + nums[i] += 1 + res += 1 + + return res +``` + + + +给的测试例子是 `[1,2147483647]`能不TLE么?tag 是Math,所以要用观察到的结果来做吧? + +所以就是每个和最小值来比,看到底要增加多少,这是观察,但不是证明 + + + + + +AC代码 + +``` +class Solution(object): + def minMoves(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + res = 0 + minVal = min(nums) + for num in nums: + res += num -minVal + return res +``` + + + +类证明: + + + +> 其实给n-1个数字加1,效果等同于给那个未被选中的数字减1,比如数组[1,2,3], 给除去最大值的其他数字加1,变为[2,3,3],我们全体减1,并不影响数字间相对差异,变为[1,2,2],这个结果其实就是原始数组的最大值3自减1,那么问题也可能转化为,将所有数字都减小到最小值,这样难度就大大降低了,我们只要先找到最小值,然后累加每个数跟最小值之间的差值即可 + diff --git a/461. Hamming Distance.md b/461. Hamming Distance.md new file mode 100644 index 000000000..1a8e05606 --- /dev/null +++ b/461. Hamming Distance.md @@ -0,0 +1,53 @@ +### 461. Hamming Distance + + + +题目: + For binary strings *a* and *b* the Hamming distance is equal to the number of ones ([Hamming weight](https://en.wikipedia.org/wiki/Hamming_weight)) in *a* [XOR](https://en.wikipedia.org/wiki/Exclusive_or) *b*. +> +> + +AC代码 + +``` +class Solution(object): + def hammingDistance(self, x, y): + """ + :type x: int + :type y: int + :rtype: int + """ + dist = 0 + val = x ^ y + + while val: + dist += 1 + val &= val - 1 + + return dist +``` + + + + + diff --git a/469. Convex Polygon.md b/469. Convex Polygon.md new file mode 100644 index 000000000..2afb7d070 --- /dev/null +++ b/469. Convex Polygon.md @@ -0,0 +1,88 @@ +### 469. Convex Polygon + + + +题目: + You can make things a lot easier than the Gift-Wrapping Algorithm... that's a good answer when you have a set of points w/o any particular boundary and need to find the convex hull. +> +> A polygon is a set of points in a list where the consecutive points form the boundary. It is much easier to figure out whether a polygon is convex or not (and you don't have to calculate any angles, either): +> +> +> +> For each consecutive pair of edges of the polygon (each triplet of points), compute the z-component of the cross product of the vectors defined by the edges pointing towards the points in increasing order. Take the cross product of these vectors: +> +> The polygon is convex if the z-components of the cross products are either all positive or all negative. Otherwise the polygon is nonconvex. +> +> given p[k], p[k+1], p[k+2] each with coordinates x, y: +> +>  dx1 = x[k+1]-x[k] +> +>  dy1 = y[k+1]-y[k] +> +>  dx2 = x[k+2]-x[k+1] +> +>  dy2 = y[k+2]-y[k+1] +> +>  zcrossproduct = dx1 * dy2 - dy1 * dx2 +> +> If there are N points, make sure you calculate N cross products, e.g. be sure to use the triplets (p[N-2],p[N-1],p[0]) and (p[N-1],p[0],p[1]). + + + +所以根据这个答案AC代码 + +``` +class Solution(object): + def isConvex(self, points): + """ + :type points: List[List[int]] + :rtype: bool + """ + n = len(points) + zcrossproduct = None + + for i in range(-2, n-2): + x = [ points[i][0], points[i+1][0], points[i+2][0] ] + y = [ points[i][1], points[i+1][1], points[i+2][1] ] + + dx1 = x[1] - x[0] + dy1 = y[1] - y[0] + + dx2 = x[2] - x[1] + dy2 = y[2] - y[1] + + if not zcrossproduct: + zcrossproduct = dx1 * dy2 - dy1 * dx2 + elif ( dx1 * dy2 - dy1 * dx2 ) * zcrossproduct < 0: + return False + return True +``` + diff --git a/70. Climbing Stairs.md b/70. Climbing Stairs.md new file mode 100644 index 000000000..10df88fcc --- /dev/null +++ b/70. Climbing Stairs.md @@ -0,0 +1,67 @@ +###70. Climbing Stairs + + +题目: + + + +难度: +Easy + +思路: + +Fibonacci 的DP版本 + +对于DP的不同理解造成不同的写法 + +- memoize + + +``` +memo = {} +def fib(n): + if n in memo: return memo[n] + else: + if n <= 2 : f = 1 + else: f = fib(n-1) + fib(n-2) + memo[n] = f + return f +``` +- bottom up + +``` +fib = {} +for k in range(n): + if k <= 2 : f = 1 + else: f = fib[n-1] + fib[n-2] + fib[k] = f +return fib(n) +``` + + + +感觉针对这个问题,我觉得bottom up更容易理解一点,其实就是倒着往大的长树, + +这里memo用dict,用array也一样。当然用bottom up还有一点,可以只存每次最后两个数,可以save space.,这样就只用到constant space. + +AC 代码 + +``` +class Solution(object): + def climbStairs(self, n): + """ + :type n: int + :rtype: int + """ + memo = {} + memo[1] = 1 + memo[0] = 1 + + for i in range(2,n+1): + f = memo[i-1] + memo[i-2] + memo[i] = f + return memo[n] +``` + + + diff --git "a/Binary Search \344\270\215\346\230\223\345\206\231.md" "b/Binary Search \344\270\215\346\230\223\345\206\231.md" new file mode 100644 index 000000000..0b07a1c98 --- /dev/null +++ "b/Binary Search \344\270\215\346\230\223\345\206\231.md" @@ -0,0 +1,91 @@ +### Binary Search 不易写 + + + +坊间一直有binary search不容易写对的传言,一写还真是||| + +值得注意的是这里的u位置上的元素搜索是不包括的 + +先献上递归版本伪码: + +``` +function Binary_Search(x, A, l, u) + if u < l then + No found error + else + m ← l + [ ( u - l ) / 2 ] //避免溢出 + if A[m] = x then + return m + if x < A[m] then + return Binary-Search(x, A, l, m - 1) + else + return Binary-Search(x, A, m + 1, u) +``` + + + +迭代版本伪码: + + + +``` +function Binary_Search(x, A, l, u) + while l < u do + m ← l + [ ( u - l ) / 2 ] + if A[m] = x then + return m + if x < A[m] then + u ← m - 1 + else + l ← m + 1 + return NIL + +``` + + + + + +或者这样,正确代码 + +``` +def binarySearch(nums, target): + l, r = 0, len(nums) -1 + while l <= r: + mid = (l+r) / 2 + if nums[mid] == target: + return mid + elif nums[mid] > target: + r = mid - 1 + else: + l = mid + 1 + return -1 +``` + + + + + +这样就不对 + +``` +def binarySearch(nums, target): + l, r = 0, len(nums) + while l < r: + mid = (l+r) / 2 + if nums[mid] == target: + return mid + elif nums[mid] > target: + r = mid - 1 + else: + l = mid + 1 + return -1 + +print binarySearch([1,2,3,4,5,6],1) +// → -1 +``` + + + +之所以binary Search很容易不对,是因为边界状况,所以觉得一上来应当检查边界状况 + diff --git a/Data Structure and Algorthim Review.md b/Data Structure and Algorthim Review.md new file mode 100644 index 000000000..61c9c7d68 --- /dev/null +++ b/Data Structure and Algorthim Review.md @@ -0,0 +1,101 @@ + + +### Data Structure and Algorthim Review + + + +- [x] Binary Search Tree + + - [x] 插入 + + • 如果树为空,创建一个叶子节点,令该节点的key = k; + • 如果k小于根节点的key,将它插入到左子树中; + • 如果k大于根节点的key,将它插入到右子树中。 + + - [x] 遍历 + + • 前序: 根,左,右 + + • 中序:左,根,右 **有序** + + • 后序:左,右,根 + + - [x] 搜索 + + - look up : 是否存在 + + ​• 如果树为空,搜索失败; + ​• 如果根节点的key等于待搜索的值,搜索成功,返回根节点作为结果; + ​• 如果待搜索的值小于根节点的key,继续在左子树中递归搜索; + ​• 否则,待搜索的值大于根节点的key,继续在右子树中递归搜索。 + + - 最大元素和最小元素 + + ​ • 最右和最左 + + - 前驱(Successor)和后继(predecessor) + + ​ 给定元素x,它的后继元素y是满足y > x的最小值 + + ​ • 如果x所在的节点有一个非空的右子树,则右子树中的最小值就是答案 + + ​ • 否则我们需要向上回溯,找到最近的一个祖先,使得该祖先的左侧孩子,也为x的祖 先。 + ​ + + - [x] 删除 + + • 如果x没有子节点,或者只有一个孩子,直接将x“切下”; + + • 否则,x有两个孩子,我们用其右子树中的最小值替换掉x,然后将右子树中的这一最小值“切掉”。 + + + + + + +- [x] 递归 + - [x] 入门 + + - 回文 + - 阶乘 factorial, 慕指数 + - 分形 + - Tower of Hanoi + + - [x] 排列 Permutation + + - [x] 子集 Subsets + + - [ ] backtracking + + +- [x] dynamic programming + + - coin change + + - longest common subsequence + + - edit distance + + ​ + + + + +-[ ] majority element + + + +- [ ] 随机 + - 水塘抽样 + - 洗牌 + + +-[ ] 荷兰旗问题 + + +-[ ] quick select + + +-[ ] median of two sorted array +-[ ] regular expression + diff --git a/Dynamic Programming.md b/Dynamic Programming.md new file mode 100644 index 000000000..102d032c3 --- /dev/null +++ b/Dynamic Programming.md @@ -0,0 +1,48 @@ +### Dynamic Programming + + + +- Fibonacci Numbers +- Shortest Path (no cycles) + + + + + + + +- subproblems + +- guessing + +- relate subproblems + +- recurse & memoize (bulid DP table) + +- solve original problem + + ​ + + + + + + +​ +​ +​ + +感觉DP有几类: + +- 容易写出递推公式的 + +- 画表更容易理解的 + + ​ + +* DP ≈ “controlled brute force” + +* DP ≈ recursion + re-use + + ​ + diff --git "a/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" "b/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..110950bf9b2bd29f84cf9ecb7494b50cc39a4531 GIT binary patch literal 117543 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 ZIXEJ|$lM;b2)}r^xG@ 2 -> 3 -> 4: 2 +1 -> 2 -> 3 -> 4 -> 5 -> 6 : 3 +1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 : 4 + +``` + +算法: + +``` + +def findMid(head): + if head == None or head.next == None: + return head + + slow = head + fast = head + + while fast.next and fast.next.next: + slow = slow.next + fast = fast.next.next + + return slow +``` + + + + + + diff --git a/Maximal Square.pdf b/Maximal Square.pdf new file mode 100644 index 0000000000000000000000000000000000000000..235cd3b86547102c2de81ebaedb59cd4f3f40b63 GIT binary patch literal 185749 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

nmjyQ;g|b;Y564!PqP2RUiNY>yl8W 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�FU!1x&BVxNlap@CYlh{`s}v_bF~3?L4m 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%0Du5VL_t(#fdh6f* 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

>P2TcZH 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 AYybcN literal 0 HcmV?d00001 diff --git "a/images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.md" "b/images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.md" deleted file mode 100644 index 8b1378917..000000000 --- "a/images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.md" +++ /dev/null @@ -1 +0,0 @@ - diff --git "a/images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.png" "b/images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..dbc5b0ef96052d9dc13492d055920dfdcb741b08 GIT binary patch literal 56719 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 literal 0 HcmV?d00001 diff --git "a/images/\345\206\222\346\263\241\346\216\222\345\272\217.gif" "b/images/\345\206\222\346\263\241\346\216\222\345\272\217.gif" new file mode 100644 index 0000000000000000000000000000000000000000..f190e62de9fa4b77f9ebfd9184131e4815d03b49 GIT binary patch literal 106607 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�=dUgBMD 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

    $0&C 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 literal 0 HcmV?d00001 diff --git "a/images/\345\237\272\346\225\260\346\216\222\345\272\217.gif" "b/images/\345\237\272\346\225\260\346\216\222\345\272\217.gif" new file mode 100644 index 0000000000000000000000000000000000000000..bfec4065ee557cf0883a8e6b2335189a558b63ac GIT binary patch literal 98897 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 I;3HrEZ-NdU3IG5A literal 0 HcmV?d00001 diff --git "a/images/\345\270\214\345\260\224\346\216\222\345\272\217.png" "b/images/\345\270\214\345\260\224\346\216\222\345\272\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..fa474c3d111210b93e4fa0f8951a14bde11fa07e GIT binary patch literal 77786 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 literal 0 HcmV?d00001 diff --git "a/images/\345\277\253\351\200\237\346\216\222\345\272\217.gif" "b/images/\345\277\253\351\200\237\346\216\222\345\272\217.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6f04ec9725d704c8af72546e26fdb33456bb66ca GIT binary patch literal 75585 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� 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 CRQ}Td literal 0 HcmV?d00001 diff --git "a/images/\346\236\204\345\273\272\345\244\247\351\241\266\345\240\206.png" "b/images/\346\236\204\345\273\272\345\244\247\351\241\266\345\240\206.png" new file mode 100644 index 0000000000000000000000000000000000000000..f08422cd7384cfe39ea5dc127f25b1f791670783 GIT binary patch literal 31763 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 bHCZ?~RhiUFSUiKkHIaY?lwh%d*0=uyvGX?4 literal 0 HcmV?d00001 diff --git "a/images/\347\233\264\346\216\245\346\217\222\345\205\245\346\216\222\345\272\217.gif" "b/images/\347\233\264\346\216\245\346\217\222\345\205\245\346\216\222\345\272\217.gif" new file mode 100644 index 0000000000000000000000000000000000000000..52e209b513e2de76eb8f920d4410b8f22c36bc81 GIT binary patch literal 115616 zcmeFYcTkgUzwdj88j1)g9TlZ_5S6MTDjh@wK~TU(2kE^e)Q~{v5JK<0x6lI$gkGd~ zklsP0Lk`dLuD#xOt+n@>b7uCLbI#03X7blPnJd>^_nmL~{1lYrB_uy;61ag5fWKb6 z+$=ky&)=%a27RFiTmVl`PellOF^n!QE)E~h)t^pxo~4Q}21?4ywJPj3Yj2%2IO035 zb@gJZ?NEOBq4UqYeNcatU zNHv2MsJAcHA?4@L@W|+xW||`MM$t?YVG|V<$*ga81R+V`swIRzU~T`!Vg!A}A|YLt z?=B%3>KW}~U&IZwaaz9jxRUuSh4kJEC~=22|8s!oemT$)#rEbo@PV;xU>tXs3cz2& zk1S9iXtYt`Jp$_C3`r{c^{I|>ZlslhVkXVUHf^7%TrAPYhrQTBC=hk=X~I||EoUJ? zJ;za=;{jSO{e)Ges$e`oHsnPq_S^eT3e1?c4Yi1lyqJw32Q10~1=i{QF&xja_Vs4d z&GfLkD5ClC_AqvpB0`#u^5S02hc^~1am&3akHvkz^beX0ylA}tR=TEgW3hB{~Ak#a;+ z<3-)c?^S1kJAE^*CkMN~x^!q78!jeyRyJmn8!s>Lc8l$^5F+L3+Ym5`?i}8S^3m#? zFSR_+yx+~Yrt|)c#yRr=tWK-*fouUh3owqDRXO5&DK1dBK-TI4TsY5kA^5@m+vX67 z<(ywgnNHnbp|Wx#zrtS3FfN8GBDEJIq`B4>BPm6BGs89Bnk_weqwKmA^WHduGx9?K zZ`LhCA<5-9Q-jyW;bv89T-PmVPnHuLdZ|~!9G7#m$(;`|E6I?eF_TCrz4A(mA9J25 z8n%vEO*eUjX3vOn;^jp~8=Eg>YMHO|MkJgbujM=lP+rf?w1cnbaiBZb^Y7G>Zxk?h zDsL3hO~5ybsMk9;iYZRXH%rdQR5nX@nGl<0v%FoKcRfT3< zTh*bi6x$f(Jmu}0$RNaa?Q3+`cHNQz`A+@gT$P=Mq%p)!qd{%gPSfxz#V+>Csmg9M z8XUaaV$R&X``wv`a_@(Yl6pF^qK5V|{1*TQB$`#vXE)pa`WJcdn(cY6N$HCLX>(|SV_8b`Ew6(}^qCCL z-D@#HzH}TP^Jpbn=vH6(e-)jN)xbPsd_?UB+?*${k`QNQ)(E`2IDe#zd48*2111yx zF~-zIj)O|nkDM~?#^a11yrQ-NZ#a^#vx9%I8kYvXh)VmTcl;86q4iotTjCQFgPpuc zW_Ykg@GF*{gSLBZ0}_@{3OH9u`;+y(P!FOnn^i8&LYKS9p*Z${MBaqm=3o`?lYaxC93B#SrV zQjY(*xcrbasK+X1Fm{0hA%5$jihUJr;@Uxn6!&niO;UN>9wozrSlvE3OBaCLl9s`ZrV0~#q+9k(ds zrNy+u^WlL=C#1rrjVy939IX9hh<5|~S{Z(?D{#AlPF%SIfbexkP$}g+@5$v7cZ*`- zgj^#j$yMpQpOMW4D5&2JWOAEGFWBbHD-sEOgXv7yf;lqM<*eN;I_=?P`a}(+{Ce?W ze&}TeN8ZasKJEO@k%~?SArRXJk{0`xP$q>Spp}Mie?K z*8&f_I*;v<=uE|gc$@rmxY+W(&a|e>4_}$0K(YLHan{i-+jPV5kFG=bBHvq|z_yYB z5FMW9Ot=fy?~!B{Ux~QQ)7hxjB4By2oB1vsR5hmAL-odyX_BAV5`|P;M+fQ3CEE?^ zf5$tfnRL+)^?4VG`JL5kO4Ygc2_t^r1KrY;?_x@VA@LO%+-hse`lo}a-ij>okjKO> zr$1AuDsvRn)-~f#hjP>_^K^RF-`1TDmmn((bV6|NCQnB&y_H4IJsSqIwIhvGRV9IH zo1a+pN3c(-%3^yqjiu{`JG`nYvemZCe@jh_^j1|>_gHCsuA7{rs>UELwru0ird9(S zYku}@JJp^2-0-TdU%9sJ^7CxwIHs!Mch8R34fokgDh$^4+Afske6B!9qJ^Q?<~4u) zJhkERcXoAK=&Sk##=fIgv0hu(Z}q>}ULCbRSGThbtzYDsJ?wbXYiC|uza;YQu z3LJ!0y?=__FE)&>*NwHSAC|>mY?{8Rn;7jqtg5@%GF_>dYX1VQoxIp~>8qPL>OE>a zyV!wTub(4*b=<;oxeI$$KS#q0ZIiy-3%gnq_p6gm{mXsS)k4JkPI}!hf2Uk;SY{GF z9gM#`$a&SUuG4oq7}@xzB(!1ExhNk{w0P#=?}f!Ol)!mYc+yKVgaHu@6#=nVK9~(4C}@HZ8_itA z2FenE*-rnAdV%Jz9%ZY-UTb%rUJy}3XiES*$kY=IKth}$MEyV*DTpw|YoZ!Lmg7Y< z=LJ&q25{bCv0f{&5M;L3Ml6(s2SRNF4LO1^AG?6Ypa9C75al(Z<3pPRS#gGLbNhyH z``#M!?qBgBq6U#-Jhw=_*JC{icwBkMypXY8Atqkb)PS0V>q}E$cNDs;0MS(hI2rxG z5O2L4Ki)BjIuD30$B$*qYf{0Rx*rOf^ZalOr7i(9#sWBTzQ3Fm6eS?r48Zd-zwv7C zkKjNgLm;vmpd9m~5CP;QTtC19ZYu^nU-i>qggnQr;-0`~S-^tI4Mgo^|1;GkYz=;kOQO&6hWipa-!EXMjyu6Qn^d?!|d zL=};~rpP5lWZW@wq8j-dh5W-4dY~J+K8B3T2|aZ|UaorXG9tUhkwmUxU|wV)DvWYG ztkWcniYc6y*PU82oZdA&ODCMMCY)8$jbc2UjVYq(DE!{L2red9X4eQlvvA&;2%+(? zMeeY?(a!JLxFK4hK`gp_f)7 zQ%I9#nB8u7`jO-XVuJiPM+2|brYw+oKVJ{>$U%T7P+_BiA=%K-+(1voOru)F%bJYa zObUsksPBs2Mse`N>KHmjWHA^-QsVi23>~49B(EFTEt&1>f(~WOdCi1?>iGuNWScXm zTavp~D+T19p#2#`2uxvziV0ETu@*`JUveNn-XTujIrT!jxh@}hRgyttRx%^9{a8^Y7rCy=>u@Zt zc!kf^hcB{23YM%8GtV9NB?!6&Lt0CejXS5jb}944c|$r%zmX-Uql#J1GN)j1m3bj9 zOr?5pfq!@t>T8o;@I;s55Xx)*-!Mrjx=^Y~)W~r_X^wy9X)d1X%%x#0hTJ6@TbuS| zJ<*E?l&~H|Chf;0og?W2HPg)|1V`7Cmv1{4`0&6P82zHiLu?U1QcV&+&iguJ>F(8Y z2<@GY%Gz5?r77|IAYFBhF?1hSX|R@?i2_K*T-sKnDe6kbl+Y9uple|@Z*wqt;B2ir zB&jJN&kRq}3pByiGN0w3O?+u|vx!_PRZM-*3J{QNZ4{616EcW$m$#sdcTs*#H?y&~$<@2T(BK@?I$%aj-k~x*s1?k4tca6&wv8(Zo zk~NK+8xh-QjeJZ^`xX%g`c3z8i!rsaleKQ_btU*1ohZN6C{doAo*5?mY7XSCuf@6r<1r!zBvH2@DjnrUO3h_;bxmZx`nuT@u*{b%i09f6z{QKl6#5cZde5Vd zdJNGSSJ8%uQ_1)0Jb~m+_&nV#An5S^nBeu=J;ydD>gHyvfTin&dCUv6ZzfNDrBbw- zDuR+R?|`&?rMjkGshX81TBF-@nX%G=G4ZBpS%gZdnnc5$F&_sDKi#@AE}rOUmaG(W z?<6v05;<}<`h<) zu{M7_+ZfSYz6mvUiGD*Fh@te!V5%_~4;FRlm>%z(cJ=i?K`b378gyXC-*px`7u&5; zn$_3oDFg6T$n#+@V+eH3!)Hac_Z2FS2pgxunq?^hu}q1zGYv_@k!WmEg6Al&>-zM{ z*1ksgC|ic?ocBrR!>rv4RnB`~fm`9neG96P^G%2|Z-Z<%N#!ZzI=KIXOP`fe@6+Js z^Md}p0?+F>Tyq&=4YYXwzlcDOKg;`U1stq1G*P{8RO471x8{w|0xP)Y#s&6O5 zt>-0%TMZTu+!@t+%k_QLDG;KpSsb{?5wH)xM4eM^Hw$B&^q3FBarO87D)IMdP-3eN z?+*v}de2*9#K$dOR-?JKbkKix2Ttd-Mr08wchD8B1ny>#yq5I=& zWlvor#ayv*qoD#GDAMzE;+kRQTOnDSA$`@ql#pTSmy1$Ci<(psuML)*T$Xfay!9HF zW=EF{yaGYDmlsu*!bgXPk7h5pM?BHP$?qCTCtc52%90pBfvDx^m0EE#Y|_g3t+kf( z?(EG3xMe@ot;nZE|JP=B|Dx)uoeN}b(`PXOO=tkM)aYI3?tR$nwUz)|vFyv{fnU4K zOm56OWNp9$YJn>PzRJ0%R_P|K+X%Oyd|gv$U;c!r`D#Foe+Ro~MnmSytV zd9oOKv>meXYgGBSjCJTHqqkhr%EP9iN%iG#*2}VY!i}CBT<1NI?+bgGe9&5bp!(E9 z9e;r5g&%0%LB2NplcMxTH#t?W>Cb}mAA_BduP;Df3=fUH4^5K~&6^G_XAiCMhcH| z3{PUbPf*Dx=%$l|*^?yvNy?qmw5O*ThNoHHr#Z=|dC6=Av!_M)(~>)9Wlzs449}{( z&oIenwM}RBvuBO?Gwhx7mZ#@G4A0xV&#&}KXVZE2?0GN#y#LO{;M0pC!;2B`i?QU3 ziKdIG*^3$c#oV3Cg{PN`hL_9Um#fK_>rIy_95(#2%fJ6n*vsaTY^H! z@wD;RK;qEkk6k}vk=1w(+AsWje(0sN1u@8XriVX!TWx?e%3pohPl)H?agj>+;!`Pi z>9bqOU+e6gZYR;A7*F-q6IbrvVQ|$*+%Ns!8Yz=k@J!UEc%tzJ;bu*~>E6AzU}kZ< z&DA}2To{|ZtL^s;SObN}YKLNf4*@F$$IY4wh{)aR7E;5DqDJ-ucb^zBs|9mMeho4S zL#g?dt0|FlYG!K|nmguI6}%0Nvg!EpKG+bwNNoXbi@v6%>~_xc=Z7|pe7>K+CqJG~ zQdT-g`&%1F!gE+3(i=jS$2K2}IPzf~dFdg{rB+WGnh60a773#?tZ8LB;{*1OdZIOA zNDby(j*?v6n?ke*kVs7?b>Nu!+Xn4-wX8>!Lrq44XcF&5YB2$h#dS)a9DIG-IHw|- zN$Ixs(bncfwf)Za#hG?1BDaF6ZS99}hFJHF+Jb-q(}3u1%SWj>!(j8o-C(owYgUXB z5*%$1@;w^`3pjO}pU<`X$8$b3e5lE1v=LCbJ06&YHxi39wyY*u&-~zw+?9@z)VVTW z=${jI^p7yocdpI_QxCeNhe(cK*pV{pW9(s1$=BG!pV3QZgp0$)lWdlPxdw>el(6|I zmxZ$_NcQ9gws49Ne*`~73Y2xA93MU$i1>nZpoK&|?4tmxR zkQUQ-MW!}i8Ha$7=h2jdQ4hn90bgRn`A#L4r{~Q?A{pfQFU1`l*fW_u$xBxrG3b`` zaK6fTZ7K3BLsXz@+`LY(`mKapVHE$1O&6zU!gL{$yHSMzi-$-H8GpUVcl^3Y34iND8PQfceGk#L8{*j^9!&1%qPV*V z89RosT{h7U-u(LeU4rZ~<8?w^GGaXsCq2Y^B{%BD`W~O1i}hay{7b`g4Il(w5?KG$ z@UU_HPaB@upl9a${QsljN$$_lQposV6qI|_@VGV2mAI%1#rLgNxb=8xPwrwo)Qgja z15iu4rDu2u)W_G)KOhhm1V;piAVb5#BO;@sV`5SN*6^gHrln_OW@YE(=H(X@78RG2 zmX%jjR#jtaYU}D78k?}qE#H5%wzcCrI=i}idi(kZ2LI9Uj89BXP0!5E%`f~~Tv}dP zU0dJS+}hsR-P`|t@aOR8_~i8L{NfT15R$VhmZUWMf^YoQ@T7hZq-Ix6P%KSrMKFq) zPvJ__+e6u&!&#NeGCCr8-r)1zca&vz#fp6HOi(J%>WP>5yWz?1OP2K|zolG}Gmx$r z$@ihNBKK#uM!IsMa%J9dzHYhsbZ2G$XtB|E_^rPho^sQlc^|r}3MZ>=esw0QR2NOx zx%^(A?y4@HZGsR|+*ZYu%zua7;5X>Tl>Yjw;Ym`hDO>77iCN5a*OagHr94O6R;#U8 z`)gW`U^Xq56;SR3;==bh;SMsYnVP|Jk8ymBIvy_)dK;ytw z!$W`k!yC^8Q^f;TUsBolsD#2vsc1gUVSQh7=*l?>X(OB+g#H&IazsvO$O@Tzo-Bx% z5)0%|(I`Sd#IBk~&xk0A%!$&i4Z^aCZziOel10mxD3CLpuknykYPtDjJP--X1|u~4 zc}ZwAM4Hp$C#dB z`kTq|GkLjbFlD$&S?eV~Z*#<>;KDRA6=k!0*P@! zKjd_po!7senwP_<*tLE;in(r$phn%M>|4o`J?p-UafCSX?mcY^E1z`9rh3!a*ro~nv%nNN?;7zY@mzng$(>7b^Tb((6 zI8}41usF${!m|2J@h!d$^IxtOLxxA4b~9)9)C<6QNJ_z<$zuA_BiVyY#M9zN1=%ZH zx>R`-y)1?bliVo2i$7x~#TSQD&N~-JbAiH_$BVJwE>Bjoi!V<%tGx$^cH4#V=Le(T z@E6A`#rVtfqa8dRpiBWs6|t9+Sk5cBhbtb3=B|~uVMjMDMIb$rz?@6AX0F8;bbz|$#z-wt3v$#T(Q6i9KRpgfNZ0#d93Z|y)d zU?a;AaE7(qZ$ zG(h4_4$kYYAT9F2ctS9icmmcYA@>G4P3dzhou|wE(@*4}$7etwOkMGw9l`7OCiizF zR5`g`2bWN?KYF~T>Ug^xYOBijkmgv!jKm=#|I1hL_#mu0Gky@5c32V>#P;y0YX(~p ztw?i{_gm`?g;QFxi(i|29dNHd^XB8vikV9NKFqIS<5L;;%xc=`YaRrXeK2BtX5RMt zG$KBXQjU0WRWX5!Hf-85ojo0=W-T>H0C!+lOdlJ3*jthGI)p>8Z%m1pSu?DL$c#0F z@1@@T%Dkcib4gFPAHtos5o_lg94vaR#Oj)8ZI6|Ypviu0TSfBVdHzdImUjrb!;;bW zYY)#l#z^#N!ecW97{tzWBKIqcTV)E(b)>t6%ML3`mQpP~t4vNviB?wi6k6*`OirI3 zRx>yx+XSjiEifMmDlUKsdP}B$NyXlz242`FPZAJ_d;;NzUOpo%;|D*tJ*u0#R_xNQ zGP939s$W$rb{p+7P_<+r8M7+(XzJ%+bkQN%`zp7$+%U=LlGivEZ2w z_Z!{5=e94<7YWxK8&1eVq&C zoi=QMAuBOkh-?c(W3$)1?EFo?<2G*G9+|NR%iZ|YcFrnms!x`LobA{Sv*S`qlh7^h2|0W2IoDjL~m;g-=S-nk?c6c!!3!DG*x@kp-zPofX? zf08OP|GiW}%69$-sq#QRL)$3eKTDOw#**2;q{>qr64C0{hCBbiRQca6RT6nuX9`)K zf1A1KK}tHqQe94RB~=W2>uZR9^$0vjR`-;2Fdode_~w;3ez?<-?EEU`*7?!iVvnyv zvg(D?-X5GxzS`hfQo$%f}@k5#QSt#WE%;S-aBR!p`ntv zD?%x>GUs2THFhVE+Sv3KtRBXAJE+bDbq8LXGnPOwT$)4ScvWLT?7%QttOJYPJR}&R zh58kOqk%vPB)4;B$)A>m6NkNbfdS#Rie>UuL+-A2~!$s=I=E^y~;mZEv(;M^- z5%}m412&G`oF)tXEJ7*6PF^T1lP+9FX$3VD9mGy@3BC6tS)|0(gpk0fgvXv=24c#q zIa33W5D26|l2qD^WQpzDsF&%~BElfd+3LzZi8`M&((`SS#{82lTypae+qtLYMeA#) z@F3iu)qLK1w739&YmxINU#AlFX8AP<7Qu=^_qv6lNCJlO^NodVUH`&}aK0>8T-j9UKgkyt7C z-79mn`MXb+RM0^vv#o!(|KrV&2M??6fv|%b+_pKKukig2L%Jq~e@5OrZ~YlH3KXo8 zkU!OMVxkBwbYhCVw0$(9!xF(hNL?T(Kkc+qcr@d2v~@HKAr(5F^J8eFn-ONSK3?Fe zzva6i(%tjoN3f3d$r8$>=n4RG-ac7L@fEbhuOcVrBv`ZYlqYlPPfOicb4U4Isovy^ zNUvd5iq5v{kG9Wtu%yE0yMC>=rT4@u5`BK%ncS6P>5J``A>`g>meZk^ZB7r*d3`+Y_ZwWJ zR+Km!*!hoAB@U#6mF05KAiYz;ctpVCj}J2P6=Iz0rq0H)p9lJJ*|3pmt(H@F-nD+9 zs!JjE52+$cnf4Ek}e_{9V*c6+8 zvU^v~?w{=5e{gozb+aGHuAJS!v3vjBd~?fAcS#}ugk;f1NTzTExic^C$i z08bFlKb?M#%g51)GHc4do%or*SHeq-@O(A9a^ z#mH0^`L6uMa;}VTc>d+|t-LM#|8n}z1I+8x^2JLvxX=eYUkx1`tqx{sgcKo^>00~qB#S>4<~mw*7a8dLT#L687>_XS3sB9k zVxO#Hnr$iMakl%_9q6K^9t>*Iwdp%lQ}nQu9vVlT>ev8``IPCi2>Sl?f=j}Z>- zDmaNJB)xGDLVwGxVr?)-39-%k1_F@M7_jhf_Lo#FpG)ChE=7K=+o+NfZk_j0fRHpzpF1fEVxvb}G9xTSN*FF@d z0U#H4ua%E4uV=+BIB?4k%?FHEGQRdX2_a2&VeG{9!)1!H*`EuW2R6Gu-F8X#c@U%f zKAh~&YBHSq{yXYmEo*MhXAg{Br=mfUS$ zn3zj)Ke2q$v5>g;qa!uiqvg#?xEaZWdJ-=)d1&(I&TJlO-!#dY^fk7LWs@lLW0Uk3 z#%}5vY;MZP%vW$_s`OiEKB^o)^}Ias3_V6t;tKf`2m$vLn!kwi1$8sHdY?~@=;k@x zr$~O)&EhIK$mb_)V{R5GyvZXgfG1|uz{+amTm}UaSKNyiENOvbEh-v60Yx><$S?pi zjGoKKJmJ9tRhuLhAd=n%W+?F_LFyJ5KjZ$avZ4j??Nz}7Ore|{!eT>#H=qW!g7iz| z>iKn3_Q*%d`UMC_jYg-xh!S#NceSUG z?JC&AJfAWDUEBkgZSDg7zR4fuCOb($Os4B0T0W_#AwqJ)sIH)6JVJH9i65W8J&wO$ zC;VeM?R=xrpf16x^vpVBi-D1X1zg>mzQj-Cq{l~+0l(>VR8 zT2~dt^4;97>Ke;p-3~L@pxCQwLK-~MxF#miUfgJK!={^fJ~KDO4K`wS`{p%+Y0?NPJS z^=XF~*CF3od={#kZhh3wANtY4-iL6k%(%Lc!u;Bogu29wA;$;47a=Chs&Ug}I-)~& z)h(=9M!Ml&`5}8&UtRT^35u&8Ei5hCB@(;*hkAISG@a)K5e%8ZgZz%+%H)Y3Ju%&xLe3ps2B-V6SjsGsK&9?a%)e1M)vWs= zHU4jF^C)RySr4+6dd&5HqsO|l9#wbrSiAj>pQFr{XjkgBb1RPvQO)M+FzR)x{e2az zXUnW8y>hlrjWNy1esa{&=XLr!dD+tV9_hNW7;umRR?CrN;8S;4?+7g02f!K212cZ(Sp5^;lI+!9db1fX$^yY|cz#LmUSWxtUp?_pT$Oy=8;Ic0~)ghw>D$6np zbzig0f<=alMmD!B@};MLk?SYA#^Y4A7Un^t?73o0T3e_s7(|S&|s=jO~ux% z)F7;PSH&>x9?)prApAxx_+7?*y27v87SL?6Ul}AvjrU*X+w8D>pt&6IbDNO*$YdwI-rb4Rq70bE38lB8;3}_uolCg;m*T=8xP3onF zj380Gf`DSX8=&;#pfFI)(#uIt21Jd_D0E)_Bz-o1IMm|G)03bp%nj7XXfpxWEo=9) zzgf<9wQakVMy6Uu#RB55vaZ;;%TeTw$tHswo;?!P`WcSd5skKqfmG%+)b(da>YUdK=r?2pB1RpoVmMSMSh*Si+BG<;os;02;n86g(Jko~t^(`j3oPv%df4>M1KtN<BE|OtB71f%flWUEV>Q<6=GHT-?WFA+Gk`OejAyyIGA7+0iIi4XS4t z1z$r2pP(X`;-bjnVkF~Y-^HP7;?U!9aVK#JWauO&bcQ54ix-{q?oD|Gx?mh#bb>Bn ziZ7FluXq<<M**)?f3E@{0cX>&Yj`y^?XDS2Nq`QTmh zp=rm{|?j=KVE%xU-BfadVj>o#dT=(Ou4S5#S=P-hy$dKw>jI(?@NkE{n1Gr>QN z))^21^Z?)gGT#3fnq$cN*P*#;(;YwEj@WqP zIQE1T!z9_%Or3P?tUSl`{36wy;xbfWd6iUYb?u{?x<=84rWS$b@84V7ns6O;UES5a zedPm##Y4mSqhnbUld01)33KzYzZS!mR}gFK0h?QXJGEx*VT`SDvSwT~?Cu zP+x2INj$&%BHL!ZHh^mSSuo?bdoSJSg=e~QUf*d)UdTWN9BjTsMQ|nKQ&h*laCWf^ z8PW&wz6r*m9ZVOdQteHUNl(53*YrN~3^2)u5}f56-29ovoh+x#>uBDU_x9tb9w~c% zo%p!M#y!3m?(wpxeQ9)gPF4d|*5NH7bq8D@-a75Hp!3B;G8%P$6J&9^l!Rp%(%5S! zM3-u}zqzabHO1#XNf(OWqOpFwga$+)^6y3~|4^0VkJ)hX=Ro6W=8C^7)g(1(-1aP1 z;pp&Iy~OtXj}U%^#^*Km%Tfu#fyn2zw(G-%r0rhM&z!a&))SK6F*vv0f6$$*ApE?+ z`fzLdPT=+Dmma4=o3m|rxhAX2laqE92p?F24N5|blf(Ov)AJblQk|0CHKUco8Tm5s zq3-%z*BiSVaL1hSULc*1ZW@d`B4^f*g<$NSx9|c3yQf%-4!gT}S}eP(w9hEJ^V3fZ z9FEWBbU5r4?!_+Js2q-PSiLHv&op_%{C3Gmhal#wq5k^t(g(vqI^*}BYqgCvz%RmP zU_xbN>GAhll+qI(4F;trN-cDxCq3CG%Se_ZP|iq^r-f&vD&Ol|v?jV5@B~#$G6NYq z55djWghaqZMhXaE2BF`YFMNw57r|PkF1OvY3DIQE%|CO+nF6^JBk}<2fXs+ddoj3jWjNBCf!qH_GN}LOcnnVEXFrIF@6~>yK6A9xEn)1m{_l7U4~u3-LT$PzCRt4B=g+}+ zu6T@hL(tCu6_4={4yLi;p+?9-tr#l4@(bCXy(A*x{xo?T33b`wpyUApo7t*h%TivW za9Q_i_^)cZ_qx`fFpiWZ2=7OSXW6uqsVjf|Szoz8fM2vhr}i5>T8 zbg}QPIk4g%Yzg#alko%~r&hx2H>YCQ2&X>mPWn;n*+6~B1r(lHPSUj}2h53L31Poq z+JLSz+T=h2?u?i~118NRegz0yOAy%5FJls|ZVSPh;RoZGdoKK%ChWvY%o2tXs(gyj za565XWTXh6;xGRfz1eJzg6d}J@DKNDZbeRp*QEKpwSGrI{7HyAllaXb=?ZZban6D+ zUyJ+-vFdj2r<7YUU+@@&%@G}?IVoWZ>SSO1 z9`wSBZBB$R3jsDl$Ma36Ei7ix(#**eJI!?^YY0mO0#s{AznOtLts=KV%{?L$Oqlyn z%Y{>Kxwo$SVe4Hw1YBeiAAlW>HO}SirOdaY!Wz%#2B8%{W)xkLB-U_yn`Or^G@7QQ z96VH<&wYv{x5#U{e}2yf-D_HsRcgSP(#XEfl$n2iBJ-^u@g&ziTa6UFZeK;8>-f__ zlhJ&lc*ukW_q8Q5K^%&Z+_YVq{dNh2QoklOoBh(`>%@5_#x};o4uOGdI%#wK zsEk!rv2$#*nL$34F=QdX5Oq#GxW{TD*F9XGB16%kMtzTJn&SH-&It-CKL_EP?;0(3 z+mn%AVh1aaDo80}yeW_3$r7fC1`$)o&t)Dhsi=t5O-H$mO4|^N2y@Yn5D94Wk*Lne zo#xS0oN^P;JMMZq54<7b5Xr`?nriIU^y|LYCWx`!6pmXbPb6^6rTt@O^5o}@owOmz zfD=y1Qm9%{$+Gw=KqJFT@XDj*t9WXwg4cg8IdH8)ZhHtLN_HbQ$V>e9l7L{*yRxj* zCG-#0vB95$(^*#(6HsRrNgDP--wh5X=iTtFi-8pqBXxnN+Ob zzKI`yfh9QPQ3o^HqZjIbJ!t2J+T{IA7~_CEnw0Ew)D#QduK#?0%~jns>t{k65f6dh zT9?D4-zl*kT(=2JG~ROkjO{8|CP*7sev6C*7_3%=eRCD;mGO{N8Y5F#U&#SWWh}sO z4IpZh9FR7)&m5~?eeywB(}~L-#BnP}!mv{#!K)&J76wSuC~GP6X(hXO zwcu5D0Do(qUI)|9(4vEc8^dNs`FZV75-|dURxVY#_+GnOtpef790~XF0VCt+!co?o zPu%c#!A07cTrUL#SCsW$+~*AKa51PAMnku#G1;NVUm5{m{cjcbzLplcC) zyCH0w*Hekc#BMsQir+N?-fmaMd;Hks_s!K|S+OnrQ(r2{BBB<&eltbmBL4-$=7OG_ zM5r3)DxfMemumbocB^2WpY*()%H1JdjmutQgIC*|?=W`3l3zMxe1Xrtx&|JcC(lr_ zOYVRa;Ej>U4JgiR6HnJbu&iv)PKT0TcR_pvmXv6D_E+W75ev zyKHK`S=oYUf>jb<-hi2=R`GBKz-gcP(RJ-=;HKNsJ3OQ<9;=9`>3kgbIaOda&qdj3iDmf+9uw8YDGxAcC>KY zDSL7<1c219sO`8-UQOKgRyQ79P28USOGjzX=;$=a{q8k@WhNRe^>FNh)m1&Un z&S}4n`ky3s&vn8Q>`=MaPJ+p;jeVyxqL^Oi2r;=OsuFhsC!|y1E9~~WJLe6rk^33; zo;zBzCo@oMfI`5Xz>*X@|M>~z`_cJgpg3f}nF{D+Z}=_ys%9+c2`H+Zb?s`#cvWfk zbYyb!kLY!ozHh=iDMuGar`A$UFO!{J#q@u>h(GDtYOqg|ezG2R9YV+@0!_X1;ZI(u z+X|tq$9A>n%x8u=LJcpMa$)b2!EC9)cTY}7xPkp4d`%xAn=_EoF!QF&|DZ}U6x z$A_ctqNJ|)E9-X@3H&W8h~ygi6FqvfB6I ziZ7JZ;a9BlGYN;My7scpE-Z|GqJh4H41Q@0Zm&%IHpD%jUfH{ z1l$Mvf)xX}biP@P1zZF;esj5+lyr7*33NdP(!~b2jRkrg2OhTtLL^{*u)l&D7z*Y& z3SJ$8A+J&z#-Ip^zfzhQmmt(tN`nbX82c-wiPu#~lYnRF!n1IsARG8gHc%dpx+FZD z)H;gTatL0bi>PuzU{Hu!45EGvF_$8rFM`k!)hMJvXnYB7R3x|-7Ti4++4I!y8bf+{*tDs0Dh|-_yr@$j!J#06aPUAiPAPy!|-&gi`> z6ILW`y5Wnu5#QV+R?rb^wGkVm5nCq_I~WE}{3mOB6sj2E5k8sfG%r^sb`Y;F>X9K!Xy%owxKMbek{` zv8l!akH&9$xEQaRMaK?J)$$!xye+bi_-?r2upCSDx}9F5GQ%2~^s1J7A;o#vdKpuB3+5#B z+*-wGb8vZ9GLV!uE15wYg)3QMqH8PJQSv+m5`-O}VVMxsBw~=igC{k1QUK3d{_A*~ zwSxRyeWYjM7d>m*v}&Gpsf>P`^^)3eh3lmaM{DbEgof)9u^&96DI#ifHC-xd5nbP? z{3L&U^X*q{+ZP7HhwoptRB_s2v^l>umDW6GYr9$GzNL(PdHKBVVAyuM@#I_4cGHje zic+5a>4VbHz6%M5H=9RAJ8eW_8$0c!3aSIm5e(A0Z3ZUZp^hh4C*>jkNZiJOK!6-n z`nRf!b(${X_r&f0W^scO@jJwzgTnztV<3h=P~uNbRYvCZZ@gTpgW;s2fo?0-Wp!vp!P z-7*e@0q&rsU!m)N=_gbt`;XgB|CAj0X~O?C$HMBL^(V)I!aM>Pj>QkC{5!{DSlaww zLhgds#q8pXk&Y$6<9Lpi9p zAg5e9A4}=II)t@)Lglof#%e?>%4eO|u*{DDImeDL;IjWGkJVXK|)1CjrA6n;nCnpVH=5wP<}) z0u2~F_i#~vv0t7;hJ|^LGthe;y`p;`zlfGU{RP6IpBdu!)tGIhJ*3Z&>*ne`f2nGGvwNA1^GO8n9N z&x)KS2VYdhHV+0h6!;FmKGu10IP{lt=+WrYgcnC+R(T~y9JwLp-_-pS&tefm=tf7-OuZzuy_50<#V z>66Rlj8Hqt#n+5&@4lth_`0tJq}WMrl=m`7Zla1y>(|p3ewITQS_gJ`Xl0uz8N;#sFuZKzyu+b53;P!wi(;#y!_GfA7E&aGbmreU7FxD8Am^ zK#Jr*Sf+Q@)n%x%CJPe~MaRnh!K#BNKr;mIY7RE8LyvxwX2|PTEP|YgD)>y5F_09N z8v@qds**xsL2u0fy8IqZp6FMolzAwAi}FjBiin4FtV{`tAnB$(m_FMw840y2mvTlb znJ$aKQg;_fRRpab2C&W~$|#RVC*76HrWp)spwSluf0kxqtr?S18YT zxHO5vdoFXmGGCcZR0!gxiu$_fEI};Td`6*S8$l z-PFqBNffzzbnFkWL+|^s45ci1TVB0apd#N%5&yuaP$`mTz?{JakUucj(NP)#kk{fC zZ`eGfQtS@{9|qp_DSEQ3tV7J>9Pr-B%J8^nq)A?|)b~oU$r8b6E6q`vY{T_?gZVlg zl1JsYd3m35s*I82mR)scpM56Qt5@@^Iy3c3iB&(T2nb#dgRv&rIbCk9V{0MGL%yjAc#e2Y9~F)?{>)7lRE$r?-I|U|Fu6(5%*D6k z<{vm^epsrrAX?oPKpSyKLFNGwuRAuV3k-0m&Jh@#v_bpJ0>t{}h`mnQnTX5(#<4KD zwz;d2n(}6xycdip53^KVpqYSnhTQy$`D-nd{?+(m#1&D2s*5bN)bCZ9F#j}>DIeWw zw?;(8t31_t&bRK^Kuamo{yB_3T^y59ybQ;ieRjoP0x)~9AL{h{$vs1lR$FZ01WwpI zzy`c0W^znWQ2lm=1lCVm?UblOWOY+T4}ZZ>IKFCQ5lRB%GsV4>0f1Ypgo~%2scN0# zIbq)jje$?NE07GSm!KPNYy+TLnS6Q^n3hXj8}Z2vK%X8URLvNAuD6FxS7r;a!T791 z0ds!XD*gs^WpyAfR>*ibQ z*ic%)x!NhdQQBH~`LzF_)S5wTNJ%PQ6P{w;qG#tGLNP

    z7}L4-IK*l;U?Y!0U2J~~RD0<1K3wnX4^g@)QW$ycbLA~@f)Sp#d#7_>XMs1QithY0 z^9pKc-I8h~N-yT^?%v~j*maI`_9f_G&S)7a(BXd{@w-6hxAOV=rhLBKDl90!+%9d{ zzuc+p<@ml^J7x8K55DnB|G)qJ0D-}Ib=XB_ef8gHeUbYApXaMEYoz|apyKD{Zo|P( z+2uq8x_|-ug(sT1t)GMfFX$hQyxMwWi!EKeF${HL+{^J5weQ_mn8@Z(PMLIbSO1}k*dTww_w*rvB?%?L(1Si; zM1bU}LEIG;@);1KCjtgnuN`rQXa9t=oR+Qs2><*`2K?^O~!im#&rSY=GRl<^g#iyyDE zp$UNG1#2Qw=WyFIL~4?|F~bS}ptL+~q{mP$3Wvfgx1Yxu5~zi=1v7nq_=+*3VVgw4GvcoJ z(HYbR1>6TSz4YAI)zM2NdHlaXS7=P)D$}zU7bAe$cwQR=9lP-sRLJN!fqIWwN+zlQ z>Ev++7D0j3y^B61=$ciOYshhbK$$@)E|?Sz%J8UP{(d=e@ExA*7krp~Ve+qw#a44@ zo)!1%EJp{)?CG(UVF7OSx66d)w*)Yt@`>wTOI{9bqGP%C`#CA3%Hi!2WE6Kj^E^q@ zKEn4;st63NMYNj{zKBXcCgcd;6L<&d zAF2p^H~tRtpOwE<5h;m?drn-a1U9;uY|w710Kiil_ucitbPrAx0<6Qfa(j`#<5_@B z6o!z&4>|zM;aTO;+Pp+3!Qai&hWx%if1#Ao8+iS*BK~YgA5+$)n`pDzhiqw;bz>T# zNotdP-2CqD0sj!H+F>+1t|2Wk&_jTUNIPkUJ|WH=<)8slu?~$niCugBp4w$#(QcyQ zLi>&Oud6bmWjCM6h>S|;JOsDxZcve34q3MyC{EV?so?|&ZW-}Nv!kaq#q{j4tD5c(p>3h%L9 zunzA|wPcNT=}&1pZXg~5sA~j9W}K=}=@eF+zRxrZpE@M$$rxgCJpm+*s>*&)8I$)4 zj9)p{dS0-v=q&Qj$+T5veV<>sFEcYEG-(^b_v0P8_2n{mI;8qLySKpWl+H=A zMFIMYIZ!2Me>=4)cgft!SvaChHT9iiiRRiFnnR5G&^vNpjgL%=U!$wsk0PE>E!}VU zhPVzLF%MmV%_bQ^5^+2i^)p(Q49W#UTXC%zoL!cmdNxMj=&a+|b99d7GnAc_E($%O z?5CzeLADkzTv)q1c z3b~OjTAiJQjSj6TY0}Idot`Yuq&v6I&5cv5^5pRa88nq7!|E4k+tk_5q~1|{4L!3P zcr|*#l<}hrajWex@YTj5@%4G%tG1()J4b6zt}n($ZH{wZ{n*yL+uhUNcG@udaxvQ#26y$(Qj?}CpIaDa7lWQ2SiP)KOS%4Xe zgvnb{tJ4z`XHqLoRa2HJpUME6{QyJ1d^2ieGaL!ik_6o-RU5{0hr|S51gYN}Rnxct z<9J>lAto0bW{V#Q-Y=)T_l@6%Oj`8SzY|D6-Y6Z|Rm>am9jSX=NTy8}(V-HBKD|B8 zESq+y1R!>DV;`~r5EAoE@HRQOwB@xtK6Pl_u(qkU5;E3((4f1U;M1$({f5k)CP+^m z!-)uHw#eu#DPesvX(ZUA@6l(sd>Z85Yt-mu(`V$!!Dx>O1WGxX$})LJlLuYv@ET|Z zTEsb-Y7|;NU$-_mHEam5*E;nfV)9>q>3`ht)}_b%HLssHzll$R12f#_?Yf_MVyHFD z%uglg6<_!r1Jl+X>)lC<-~a$1uy_bJDn7Lcdl`|>XayjADc}(PX=5s7E3U+dOWyEv zM_+mj@206hhRGn&mtj|LobK{Rff%FEU%nIR@gCfWJe`Un+z2{ccgLNHB2o7uR*xp{ z_asY-rc(F3GZRhQ??Lf6hGC1NSSf}%DTbvnh7Dk`YK6f4*m zD>M`P^deS-B2H8wPFy_>@rg_=DlV}qPO?Alfhi_oQquyF*oN0t5YR`$X9=B;cIe)Co~FQ?$``|70^l64IU zWi&93h%%B0i;GWysX&rbToTifDpCNB(rG-b2QL#Ce0y?tbCP zZU_fy`i-c6qj4hTjhnxNbsF$G=+Y4r1BG6V>pfbKdm&oD5IZD2G`Cx%(~>EZnL2Fn z2OoVn<80=;`(h!Pbj*hSK^e|?lnwY1VU>x?cO|M7^KSFXcdSHi-d1KHP|#;I#8$QF zH*|Pj{8B%5DK9BG$+#()GF59ppdcEeZ?l^2a#U21hBPk}zJ7;9 zU#CTt6!Lf(cJFG4k(jg?10_b^6Umpp{dAc^ov{0GAsrOT(B-Njo_}IpQ%dY=i3;iM zK9E=9e*I`ABKP9slIzf8QwiNaU^YiMncpwg)v`YCMFw(h?5*|i>6}qB(!5|fD0epJ zv^eav;94^5xaek%2U$|R)poiV(8~^44j~(X%mh8-;9ZP){S&eplOyb~{!Vj*e?6Xa zq!D{vG*YKwGs&9zPkAOP^7df*Z&+7P9oK)14E?`OTv@^#M}S$G+2Q-2<(>Z=+Wa%? z`b%8NZ@>NDv97wr;s)K7btRJ(S{+uc8advWHRNN(!h^h)nzaVTj}y(EtY(`a2itWr zd>nX9H+d%R^uc07&^(Jy$uw73i~Bv91)Qm`IGu@)=IXBaAFhlB3p6BBB~@U-DT$G&6I#rYJ+*O<8EA}|_{rjzaI zqSs8IW;dHW(&Q(`DO3$E`Cq!tX|g)(mn!j`X3_* zUo4cBCpOrismz16;HBm+HP%dK@N;dd&%K?8*)h<&Sf8Tuu}H7JqxqA|uwr&=s2$qg zVh;RZM~t6Qd4zdCrSxm7Knrd){-aN9J{>%fA8l!baTFc8@Aqm}d^}3n+5PlcRQPaQ z$=dv6;(U{e2RTOA>etN?v|ERV9VGm}I7axNb-ur)5kbGw2xfwen>6B@P~`VC;z{kw zB2mU+6UFP!v1WzlPbxxlQu+@Kj~e+7u8#jUGUNpbm_)I4KV`P8cyajoe>fS@}_M0wSe}2K2c^Tz5nUM|B*x) zd2@0Md?49hoi_;M`ny&4FWj6;)N0J;2kJ_Y#)tPI)H3y@Gc_ikinRyp%jOzvRtC~! z8p`LJA;;VEgAEn`zHB)P11S(Lsp%z2qe}iBW4{EEBWD}c|MA^~kQM7cXs$nW9r+LA zvEG*Gjq%t(<_~R7ZBeO4@TXEIqNx=?^l}GBXqN@)e2Giik_fiYrPhiwb@j zy+Uf5=~~iS5$&CgUESqXeZ2z}-NQF&KY!bJ$He=OGhu`M)eBX#H)+4$)W&4T+K$ub z{l%Kyn-$yVo1N!hPp`BN<^k=KJCc=4f*xB(MUVOv`q~4BD5X;+35iAh$O@k`xWoE1U*Lna7fV^_4o@>%wAz~AdScL9?N1H zHk(iK6>=z*Szd386!4Xq&AV1^k5*`Hy!}C5U#f1b+>w5t&uM11!A2&pm6T6QGs^LJ zoBA=|mjx5&<{#9u@Lbgl{}eRRM0nLZc8`Zod+NwHRtFP3#M6^5l-IJ;#6r`nC^k)` zGI-K;<{KaLPDUxcPfwevGn@4{SXoG$<~?}P2%-mSRqxs9~G`ri~>*^;Lk3Ni+FqwM(fPLFvd2PYzg>!Xzj`eYrbM5K%wLUfD zk~wfnMgz&bU8r}hs(Y`VmIb5y+mhe%uEdvHKeY?ra*$fV#R6yoOr!(p76AQV<{sW9 zsRu_k`k`D$b<5C)+lTt${5n%hVFL2RZz00yTNuI57noP0lMdk|F^uH>t5~;{X+`4{ zpKfK#D&{M7psGtt!Q$zKYVX6Ayo*rcm6U>?#~URljwG1x$KNt)- z*E8rPXPEHD9U9kC(`W~hlJvK?3hjI+5saD9=^_S^w*(L&C@8p@4|3y^mqY-3Jub5X zfSkZAmKzU%Vy2yPLp8#D9zO?zqC%dRHsAx>#ra?^vm$bU09w)ozEhB;g|8=qma76S z0imNFvR%UhJ7<`ZKC38{p}ZGOL1cj(N;WdRUT#6F8o{&{wTiCWB2An6=GF|Z#{QPf_1NRPWNJ|F zQK{Ea-*DNlKXap#DpVd%kTZlbEt``e576E;^;9naTG- zQujwKzSroX!xAs<)3aN+S_qK=LUQe{aki)*N0<-P%IwGK)u=&)p}zOPD5P3T)z{-M z%<%*_*=kdLwo3x#Q9mnbve#`g-({~^=J=NCvx7TM?K&l{FkBBN$wly^*}SXd9~k00 z5W*Uf;1oWVeq}9uGG*-bWANh>?~4y)3Q^F_qBE=Nd0bh&Zv!u#(;&-?nq|=WkkFq_ zBalVQy3K6*3cjD=DU@@(Q}7vEIb&rpov*wwe(a%Tr?Z{eg=t2?diGbS95otWO$vne z6f0b5c4^K;r&}tb$9x&tvWS;n3Kw}>d6LpDj2S(Ab}>9^oR>mPxH<*T=vDw_iRoY& z1U7vy+XrK-A;w!y>*Ivw?U?Pg(TE$w`Z}z96JzIpD4~mUwOE-INzNQ8sI^`bK0WXq zeUx+hGEsD=$kxqL=<}^UKEY|MJ(KI#I)iGMVz^F<4y|HI{Ui#{*0SWye8p){G+{M| zC!@+bHEAD=c&-vwGE6t5wJP8HLfaPB6a`F!K(*yXuYYY*dr- zb;$IBEfp}OZS358jeXknT$I9A0fF`yQ-(fO^scLKYTA+m@$ICSd@QN{qSuk3pEcvf zUj_7#7JW)PaoCXDc`ff=Zy&B3%EVSB@ySW2Fppc?_^Gbhr~Tpae3F55`B%kC+2!NH zJl#5XE@nRFQ%>aF%VUm>pyZCU`&O(rT&&VCFj4M$Qlf`fqSh-tS)F`RY9jX^nvA`$ z=5^_RXfncUdX33@sD)27QDgz&qPV1v02k0TZRoh@ zyls{Cq|NC*S?lCBi6ga*j}(Pi<#48 zksuG-ol(cG@ss%EPpMznZ?PgkmDh+WBK9v2H8rYwMJICc>X&&&9Y1<6*p;WQ70Xi( ze(Lc#3b`X>CKo%aRuaHtAvL_kJ{Lckgbb|ZJhpKo1wW;}oX885+tt7GHyU(!*XYUj znX!oa+5)*fGtKX_(>I!o;XNz28%;(7yf%?ATph?- z`snTuqSvgZ>hT-1$oDRYu+xX(!J44Aua@3_TOWt441Pu7OMESa4)cEdbdD;JVt~@? z6nf8yOYVZddEN10%r&vi(yGRE1+VIUv(?G!SCz(=a*yfQoWTe9x18(Oq~EmqdRnAl z2)1FR?`3exuA;CC4D9GT>k#i+?@9BiN}g3h)Km17ew=Eq9o;VYv40jEn>MpQQ69V! zx&R)mAFr0PS}hrbwDQ7QL#*8!IV&I=Iy!KLHg{W|D@~WXKfe{eYTZ^Hy_{_Rc~TkK zx@&B$ipd6m>wACf*^hpo|E_a}IPf_1;zX|TU7x>y)%G<$@@nl#`^A`X+qaBoKQ>=q zUrvsCp2Tx{@4H@WD>>`4I>ZEFm}KJlLmwzA*Xj!MuqMeYlu?@uz`#34mtPhnw7&z0YUy%;%w+ z_dSU3bBOO#i0_hw?_wYz738Zp?ITy{qh{iT%j{2s>CJ`-LJ+>U^@WhsiWKfUU!SHANuVZYfFx!*=h_TJkKrfTxq#NU8XX51l9%D;B z2b5jnZU5UC+v+0WCdL+kIjF;&Twsu-n;6@D2IhGIgHj~=%&1@}BnG%7VgL`{kaFJ| zON_WkyrqEJzx*&tJ*nLO4(02lD0S4tqKA##C?o|mzrTfOf#?BUfavBeWXbXEG;@Mc zNco1;-;QeQ-{5!)h)jh|R!Xn;xpokXql7V&VW}6=6=N*72Zzm4=DCjDNK$MKR$PQ- zN@i?gn#m(aJsi(lVa5j;9>!izynTEH{Ed(S_uEjFaHUB4Xsy`zgvdlSSV~NCx?)a?+=<_dJ_!FBeC&VXedclD^4;-=6FlKQ4r7!$!tnYV zm3YF~sHpL+tQT>-(Hbwz$*K&;>!UR#tnYUClkml8N!c@fxXx2btsXT zN3*>|vKV&CJJIZt4Rl{(;>=?>q?=j3R*&z*aLTrGgFca1#B#~M7bHAZ-i>{z&?{PF zrp*#iO--ar*L+(Nd93p$-B!Yx z{$oBK&E(drwid|dzn_nvM!918?Wi{EUz?9Vzw@WLCXgFuO&a?*4du-z(*hKbpUm=qN`sl0TSU(FHnyl3Q%CFQ0$ z`oECp`(KWR{gr6BZ;MToDA#CAP~P4IqhhuNpt07o&D6Ym&#^gc?=#zg)7In9+OV&Q zZQu@ALefgZyNo)Kp|Vx}$tt#fQPyo10T<1a)aFjgL*?_KG8M4UPPp3p{V_ zsdb$=Y!Yg0ml#WK>SdRTQ+o*&Qa{@6ut#&%age#oZWpyQeN>=4aXewJu~%E9@{l=> zUnrwj{NDUNYIkPuZuVA0`ZDgyAK#-wgGo>N%CcAY?gN?^vfexFI0-%1^yj21UV9IX zGo|iT8)8cmx!Gu;-2atfKi2!(b`lAkN| zE#=q^2kwaZysj^V1lZ+o=U+aS*@dL`JMD7k*RXmOziweI#?R!eH-qFYUMm)v@5(5a zkYCR#mUbL=npfNaf@v#na0m9E_KLWNSLR7;72V}cies{Pv=|lR)bP7$g;%Y15Lh-G zL(SZgK{l*Kx4FEJED8@JOc2x?8d7@66qFF7Ufn3+_Rh^Nho zN^Tjg<^_zrD8h#|M;DtVLIR|}>_uou3kog}!#_>2 zvlFJ$3h6*X$G8%%kCBD$et!WJWgq4pYX}uw^Y6OXQxS3R{e3`wy*PTmb-+jDRV3qS z84`@}^y^|{N&Vauk{;=*1dd$Og6fZc{LTH}YFV4l{jNd~y#cahsUazIs6>(#7Yd`ld7O zbM->f*$5K)ooK(toXmNjTlkZxPx83oq>>&#W_d=uiyuc@pTo(&J6fTl=-m}VgDp%Z zXC-tmlJ|SARBD1a+Gs_wfqWX%!$P(z<%wkaTRqk_vX>|#++m!CY{Gcgk|>oC;E*R~ z^lJq@$*aEJ{1RKzH!r&H1Yi5XtFpLjW;&%*#)<)77|{vXWG$nrKR}TUnWLGXuM574 zdc^*~q_|)GC8I5JWb+OXcr{vH^f`z=v`B)gNbG`Wpf++)Ogs@HvZGtpct;PQ#ekA5 zkmOXOz?0j^thsgES*8ek*goFNB7uyy9=05Zmc3_!eIm0s`jF9W?YhMleAolYp-+IQ zCX$H!h@ve5bI_R-2TT@l+GTf8!nB@g=phAr#UCU?UdftDE&Nda;D($bIU=Bo*(4s` zWU*0_hY@_0{!wykc?}Q5a@=nL(=Il^(S3p1DioO}P-kU*E2u;Km&-p=g=M)@0SgqVy4IQ z&kesb3_)@DeZy~^JpcFr05p!Ln8&B#FP#WQ^v`QeuZHo05DSqp-SYfMk8?@8*PiQr zt)(Lzftt1NX5exxU>T}x!B6rx_|~gb(~r-!^*vIOyH%C zZB+WZ$@?F8fqLIhT&-_c!2VY)3=n7}7i3u=p0E846+j&gI?t9b2n2|nppZ7tueS=$ z-I?f~#NJz20Ux;{yHS75r1;K;&kY^>;Ax-je!FNJ7(DuJfe##zx+Bkj)3T(0oF_{I zP>Y8kTcv$%YBErTfSz;y910wn>V?r&+Cd?wv&4WK;$;I!_R0yp=Fm7 zoz!;I?%Jns9@Ndg-8{~uTRdmrznOpyyJjyX?}2-tHoZ{v&^vmvpAkOLQ6p-#$hNds zLeezVSL$)Xq_e-I=)5;^BK;=(NvwMK;MuwlNRg+}CHYwSuG^(Aa{5{4)=qF1+|Rrg{}@T&BK zu}*st!oAo@9QIHx!qse_zA%6P!mjnTQzxGXr@AwDf{j@I`#H4t7F8bG`5&6qNT{8? zanPJIdik#SJ=ZT>c(y&KryQkSocLZih;CbnsoO@QImq`~C#%_fm2@^Nut9}b6_eOj z8@X@sITShjozyvDPuWyV0n7;AyGYrW`P;q$`!InmQq`=GxdA9@-r;DE*y;e)&Q`oG z<_ab*5%GS8y(BdJwx0POY$U{~YPRT1e%=UhCXa5X2mG$KGqVK4~xQ;@aTk zD--XA`NESr-;Vmib-2z|amvxo-{wFq2wOei6RJHwlluVNnwZJn>xCVQvpF}K{c|q6re z&F@|n{$n~E&=(H63P&P~Kz5BlO^iTkhyeFRV9Z3|UPa*VL=cii5(!2UCq|MsM3QJk z;(-7(WKpz&QHTwn(e^?e9LFlV#y=E{ zWlIFuqDR^6!~;g-^#Y^3SfYS7zz0|Hfn@PIeF=cJcu%r;gR6KPnuH+qcnz`ybFxIJ zARvG&flecV#x>55B`N$W)+#W*$TS+;D;5WmgdPzW>zY6SN%A90W-yI?Z5r>Fm;{W7 zLllRUnF8G(0Ta;yHCM5gg>i1tfErVPePSGdCIwX~-jXFn?JB`m5cs+<)^P_wf}1+l zmpU&UwQv<%Rv5R59;MTebeI_BRv0yk9yOE54>wI3FN~#6j2o1Wvfqiv;RfCj0OB1I zQ)hPKEw7TJ3u9Hu5Vi9OIC`-)4H?~yBLN{@9JyvO zkfpN-rUORP90OCBTvHeV(}6Tu`D6ec)AX{LESkhvwZ3$<#6)bNtZ|kU7)vsMCRLg| zDpVs;#}q)!4d}W`4)2S-Mvv=vO+YqFbB#`7zRsm7%wp<`6`qX~mdQig&2TWyV%JD@ z5KP6v%`|SvGtfvaV@bi2Nw>v_2byJdXe3LM=f9E8Qy|YDy-Im+nomleVP6!do0MQX zo5Mw(1Pn^oD@xMG$cuB0iX%_T)rd|tOGtAo%rT2f)GR7UDk@@)zRPbcD!nc$Cyy#2 zFRs=s))OkOMfA^;$KrvQfA-Ilf9w$Y*o8q=;`9-o^s|3{aQ5Q~w<$xp>F_Q_kRQm1 z&Ww9m+ZJNRh)bXBS29*4IE{fiFH~YNYRn5L5rUR-w3WVt@-k`4ATEMtNCNe992EPzhBK$Tg!io+KH;6KCDxIg8-O95t`Tkm#g_pE1ay~35Dp2 z))M$h)Wkh=370F-KVT{Te$Yl<=IGVmfLOa z$c_3)9%^<6t714&@>dS@#Y|{g%?Nx|gD1=DpKE8>n8aj1^%i+r`N*`iSi@f~b*9=P zs+y&@_2Bc_-a@nBrjv!R0DL6?MlrITTz$Gh5_yjkN9S^HWa1g0TI%;p$FeU?1~H2l z4VM9PkCH|2B5oIs_gNY*C_WgtEu8TV`(uiVc73-l*?J>>A;`E4MFUEa-gyzTT#|Yd z5hYOioO(>DejsFAU)De~B8~9zcHCYOrSS7z2|$Sj#|1E-BI&zw2<5D*G4+s+h9u3@ zj|Mwe6s$cJ(7ntS7wh1ohY^#z8hS~`)zU{xUtbzNc{0Y&Aog6ybpxUy)9_AMmGL|m zqA@AJ_*5qiT`2)rB&{E9)QGN_WY;*I6Ym)J(kSg_w9lB6FsI!})8z-*aGD>;)i~<{ z>zXF}j0R)piKl|hMpj%uooU|DtA3V*1kc^!ysXkS)50Br{s%<|5&gS@`K_8^Mf!b3 zVa2s!1m>kHqm8s>`E?79qdxcX9NyogSZQ-nQ~uO+ko0skeUe;y^^yD zZDS9|TIJsXroR&k&u1;_5E(L?UXF`-hbha8h4$xAXEs>BQa3tNb_PE_PC^6(3x+vX zhxOj%<^spN_*j58vQEjBBwmr6`8BEBq4-)B`>^lbwvBffaOX*a$g>RJ{I<587tO8w zgp~tIP2hs?wz4fQ`c|JKl>(8Q2W=N3e`d%=o*fQn)4u;Ueys466F)}D^?V8`+Vx_V z@ZP`5klkHc{kZRue)ofpnGB!0d+<>i6J!T_k5N>vAAMXHe47)ax|#q z1zuQrdS1^VdN^RX7==qYGSe3tR8CTF!XlV2Ye*)Ru~g?@>xQ4D#n_;U5_Yb*Nl6$& zBXGpnS8=dRz)384Xq@k9>9UyrS>157WcM9GjBSVsp#;8;jU=IfE&8ZzHsuzAzw}4l zFuYgf`XoHKKJmUk7%on(qUQhJmqtygL_+8^GU8Vh)B4lNdP(`Xl>mmz%sWkWf4*z3 zz`93bOm7**d8+ZEZklb&l;alF@ zY8J*4f8?aNwtR0yUVCU#iUB%=1_T5D>a=?X%mI`GvJh(Xk=}o|4z7a*6UXrRx3pd* zq~=d;?H!$nlt3@MuYX|hH#ZlepYh+xZl{1D5O{fJr#~(o!p-#)dFvPF^NZV164;Dz zwEYpx&dE}GEm2CxphEaaGNeOgckuA!@GgPcM!m8kq>Das1^=Pli)cG~BGvp)Y)*TP zq)a4K1N!X}?8~nug3W>u**tWAqEdFNgVKKX)>SPA8yRCcEDv`#2}YG5NEm4ZOap_2 zlM#!AmybA^Q4qrz?`=9BYbpj$+&f~7)a<14Wa~U@tdDhKq;G9_#olHMlB5#9ZAvBV zY#}k%tjxJD6a~_EKSj94m1)r+$NWhD;xeZna=@CnkuuP~vVh zz_2GnM%IirYtRA1kIzq0g}X@=e2?1l8!~DMleLMGySiMP)W$~Y3j%Mi(V2DqS8N4@ z7J%mN82yBgk}Asugb&EbG)st0+^(|Zc%az{h7;)AWZo#G?K}%XCohE=ORdb@X*=#? zr(Rl7(LR&+%}om)@xc$l&=vMLBPY{fDk~6{mQs`BGugp?t?1A5@L{g>PJh2k5xzYL zdreHUMn7=~)jiS&N)s{^l1wh11)2^s?aH((jcZ(@;V^9@+cG#%?^4*s7#r$b^gLi`EtNQ*A% z)a5UYB7Qso8Wl2P3aY%2(X*=y~#OwV7 zB9xKloW}M`vcsh5R)oAlCR&K=BBGwVb___@p(NP&Ch>+J`!QN#>NcOM0J#&oP zco$_ zzhHm=O)7ZFHw0s@{3{6a80&oKU0pK(s6W*VKzdeLT!|t`bG;h`JN&pDNbtwG z+%@pmaoW+_qXGb}JGI>g^_r;dw{asl1d($IGWZWnt2_h_>gaGGJ044m{L|Ls!+ZlZ zvfR)^IOfRtfrVnY&{uqm5tjkW;^FHnlcOQQdEnr@@S)*Sn(Leg!Ew{~6sA_ErI>hm z;97?P*}^_a?U1sfC4K+^M5|Q0g~#oH#GO7nMhqK88GTpylJc4lT-6&J{_Y@pW(Pl? z9~(mnY7?z}fNvuh#|v<=-%Fhy&V!s5%3I)?w9O1N0-IKpELguRu59`NkV48na5SYK zWc9W)9^!n+$kw@sZX$dmJ!*-Zut0dC_6blL>NJG80PrUfyW3Sh2`;Nbc&PXQ<n{qGAwtRXTbq{KdC}if|}a4h@<#;!r(}2$0L6CFz4p{^d|@$gBLH0?wSz@Oytg!T;@^4TX2hcG_QzZx`?8BhAsoX1zyCvTxi z0QgtMPydQ(y!!Bt_L{7f&$5lMt~5)RD5i}bN>F%Hsp7DAUt`f&7k_)8Tkaz?bj1BU(l6^Ql7Rj%fK{W zR^Y1^vU;#8w9}{*Q>*4dpKl>!K_`++9RN6_Z4%kn%Au^2DFVL5TK9uqB7Nfp-cQ{I z;NwDv8_!B?5NJUuvzc@i;uL`cb^v?wYXI~yfHsv)frI>YXV`e*J&xVyvj^@#8**s%osP$$Bf7cDj@NkIMsuk?)3x&W z?6;;BLJkROx0f0H2vT4Ti=6V!m)_FztUv|}Ku6F_K7L$1?srqiXjwg5U4Eby)q#SJ zFzhp^rhS=c&$g^-8JU#79-Hsb^F^{2TKPp|U`q*-0Q(9$^i?k1;*r9Gq_<0qdeyB9 zHtJ8`YjD?pX{2_l2z>6gT+mq4ovma>5@!mqVjpJkAMaBP%Qr*xqQPme z^3>8!EtfRkeNj;z&|%DvvmRJy3UBCBQ>gr1@4gzcLGTT?Q0Q6i-z50;{h+%y+TAKfm)%K;Tn7f<%bx_#2KIW3@1 z_Fk!W^AL{jJ!WuMP_(YnZl+d0x=FXS@-q40>t_iIw6^mP4I_1qbd6FCkMj%i4vtUp zNJ^KIOU>4c$&1#>Dbf$lNG>i{F3rfQs1?e0FNm#c5l(EAY3&rKYOCq$i)dK~zR zFCG2TQW{*-*=_E7WIPhZo!|V3F~SHP<5d)^PJgwjcg6sOd|uxHO*&p(%S<&8zi3cE z)p7cpw3G2n`jbr1lb4U#QF9d5`c;K%4#nztORa|bYs#iF504i~&1<=5s~muAsAGKW z+6@u$W3e)VIeLU{H>Vpn&X!RFyx{wM?V^#1vKbU0^zIVUly^r;B_PAS0SjqL;nth#Gsg{n9{m@9A z%+&YNCw_Y~AIwRDl5DSzmQxw;mkoS(-A>tfegDBkJJS*j^7AfT@L~gP#r$E5mU0dHt{lQQlTOl(f;9#=qSaP8A>-D3E2&z}g%7f#uv} z%&nlIekCHWubzhT@tEOSsNx3vjRgUyU^Seb`YOl|jGsv3@rVyj{}OlCML*_cT;QDV z>)}_6!J5N$a!FEdSGg*0MOYr#-zDzgM|7emZlr6qUS+1(t0)`$Jdv59OSfTNW(s+R zF;(EPNF@A8y2hF`8}J&s1nE9aOy@>K{~SYU^r8t`jR(O2+Dx?WxKtksp>& zlp45On3azM!!U8G>2PIx)*w`GF4od$_5hVsg=w!`gIIXvt^yHyTB;P{E8ed9j1Q+w z{(>q*W7}+sNnN+*y0;f(lE%iKlSMAgn(14ad@pF}2Znk2_?T>QOYN#~e(U^SKAyoo;tJA38Iiw#3fP(+?*WrEreaHCSK|f(9r#`>qoP$$JJ4=DC_j`BGNu zX?g`5+MhqF0RVw|P>2e$9-_ngIy2>Kk!%yP*etkO-WLp}$>5t>5yE(^fDDNsKovw; zj$Xneu=v<6!vf`#F@H7+00AHSo`q>z$MVfdxV07}H9OHOd)FJN|T-o>Z6X$L3T#+ue6n%eO9vywSR_DBC{Xn4QmO4ZuGvYarKjEUWX)D2^ld0ADNKwV~!n_FRp}5?= z#Q1UgB$#b9D9ZXRm`3Fkoa=gQqkLj03ZrhMly7nT{}KA~SO%FB_s@m>puC&Y?Ic(a zE1R@es;7+S59kZL=eJVH5EP`%zbx#A08*~D-xhW#7Cq4?=E%Ry780xQKWB@-u#<~T zDE`arC7 z5BG$U{;Y*D)Z^pHB;PF#* z<@sRgi%8OY`CA|oPf^BU`q2nKlyvOdBt(*4Aw@MaH!mYQC%^b(MB%HFiptP3m8!aW zyPDdDmR7?i8k9zB*N<0|ZZ*kJmyKv{_I z`R0@Un6Z&Gl4P0On8%ydh3YVkg(9wEH4dfpAGb1->JvWi#;sO09Sdjc9(7!Q1lL)m zR-qm2>U7p}4Yxp315zn?%U1{_zEkUB4VS6(L~Qi?Qj%HA^@ngccU!2R>N%!}x-nuY zJZc`j&mwRr+woYgu3#zbkW6@Oznu<$>0_vJjg^0i+9#i(=eytwp)n!UZJrvkctGfv1ywyG4y$A@lp8dY$=6Rsz$@Sst`;*h{lT@^Du@;Za z6X4krKhR6^z9y2Jclw?A4Ha0~ON9u$B7|StlMW+bt;+BY-G~qUKvwzcZNO-VK)U}* zWWfXfna2V8A6P+`Ga;ZJsgOYSG$VtD6q{RF<}`=Qcwyq#UTeWTL|3xmao^!@BV>pr z3}di93(N$LDbHX=e-li+AEP<;=v_hyrR#&lI-8l4_&8V~Bkc9qWgffHrute+Zh;0- z^0$US<3QV}bK^wVm>)y1cWKs^*?Yb%2QT0zq^Cj};)sMk;2cDSNEg`{&e zf_D3|0(ocS3io~bS?O|UuUQ!jf^v4v(uQS>GwXMRSj*s4yP0LtU-~tz5}jn&GrV*g z*gv-MIB!;kklu{ll>~0cShAE_4ZN(LWpK~0^H9g6tW4>UDivLJt2?Brz_~f3*|hRK zF!*{tX4z`nRZR8?_Jv}k#lsZySo)yR`B({kfQi!&v-d%{>-MR!O;_-Ka0S^9>iUON z1f3GcHun|39M>~sf3|gGk!3%Gh@P!> z5IwvEuwY474FO<2M#P)Jw?j@ZtgI_CL9<<<_3uSrIx7Nz%%g3yiV$3gn{V+-9XR;N z0wjZsiz|4CnrT4b_BN4Xym*3GV zxzqXKzZ!pX3$|z)efeW%N&&h)R=k9#gimd}BL|hyOY(e=Mvu&=Z-%3dxmV=e1|}DS zB{fD=va2Jb>vei#12Vy)QXRN)quvc%_E|I_{OSJBmk6w$t0ZzB1y=yRAI_**u`!uEq_ ze{(qG0a$@w{*LO1Frs&MS}grP7FGWIZwjdYHI9PoFP&lkjHAFzk1QGebHM*!>BeZCk@YWtmPp@bslh5fsnUF*MguJL<=TQWCsGwNR&+*a{s6n+nm zf9&8{8%+Kg97oUIluCnmV^EomZ9UGCLi`%LBL!lJaI#D)#!#Vf(a+$x8Qcq8M%oti zU53v>1ON4kEh0Ehrhj|h%uEUw1Bh@Y2AcSpjk&2i>#Y-PZu&>eJ9Ug=pR z43EG)w7iIA?vh z)E2*tGi=7MvkH&KBrCm*v7O;at|K$A6*}7+bG_>6c;cS9Hrkm@bbsL{5xhBI`6)FG z?{aaKDY|ZE5$pPTeo|{EY-!|X>-hVZbkYm#fKX4>W8;iF>boH(Jt!{6<#QN*(x$H$ z(d=g$pKpTdx_+8U;4B`n3T!37&Y~d8pFGpWH-Php$|@mK&vs7`rEd4CH=hd7AiQai z`FSX$2$rpSx^bxysd5WnXBC$eTaPxPY%qvAQr_{2))aDn8}FcAXs9n-gu+OGnCRii z1bS_G$(F4w#wiXRJDV;#a)pfdG~xu~(;YJr%AP6CwRDWqwkb1?M_6HYwk$^DHm=}5+9xZgXVfGgN58?eNGt?nk3LTbw)>Ie<27rJ;>k60 zsSq4vpRR__);tn7Ac7rrfUkJJYEWD@uPo&dgXS(Onp1YCJcV$etK#Xd%t7_^wOL+{ znHd{vT__}j6Jv4lm=hJF0J_^uCrJV=u5z3{Dr;eEC<8^JVp*5nKOC@b-g&?cYQ0Bt zvWCzkExdsI0@_|Z`;rga&~evXeQNtO2gO4fqj4)?c&FP(4T!etnv>sg{XK@e+4&@6AacA7*j}Gn|9+x}~4@EC!M!@0E!rq`n z=afG~4VSX*XQAP!?&kutb@b|#Q*k6X&{gns@=VK%k268d4Fq=04$j6uAboVf;NAlR zFhlRti7ifWdTvfUhA-ICzNdTO60#cCWPcZy?QUi@wIkCk$e4OxnRGeP&vPT6FIe|- zzxY35Z2GY(StH{KjEIj9BXNEQV`Y$t4biowb)4}-%TO;@>5PF$ll<~xNK8_1T0n#u zOrFTZPtq^HEtV;@f^V8eMO%d7=@^S@Et}lSpzTfw@~S@!Q)w9l{uqzKX(LjW67GfF z3~-}KcnYSC_;5(KeDi~`13wPehwgDE#&fAMf?6A2ZgxE^V*&9w30zONnKYEFttV)# zHvS?x03;_D2u5=^=%fh>YNmZg6cype>qAS}^a4W2ryTU9lNQU~USx~xAqW?l?mC4Z zc!$?91jPLFB1O@twb3nP#i0a6J_U~oQk zyC+8rYBvG$x8jCFtM!?);V+bh9)_o;tTFME4H8a%=3QJ%Lyy@38MQ8dV8qS9&MEXU zh=V2#x_k3h^$l6M{a26bM5@7)ujv3w**%bq5{Xi2M&L08LdyO1sQ#P#(Yt?oKic>$ zmpimj&KMyk&wk4ja2$fTGJ2e%ws94$~@v5=52Qi<>Xk|%Uls1#cCDqm)z zNb{^n3(Wct;bc`tR_ZcTtou*H$$Cgxzl4)DdUAUW$pa#UtgM73HYg9@m4=U)8}Polgh%EfY6s*thvF{Fg*myBpX=x@ zht0ML`+W^UqFLYUx%eb=XdOBsYY3Xx=&2QX_~H4&(pKD5TZ2_iiRqJl6^h2@>25Z+ z&+fWs)N_+>TEC{+bLee0s`aJz?C0MrHX~bd95q)stc#yJusN!kpFOK>s0p?r%WhiO z5pk{^xD9umyIH*S+^_vQbmVz6mydQ`*M^pMHgiochxTyyr`f+G-SOuq)h}0Xf`l(&T0b>5cZ9cf*LA`}dIsA2 zhW!QyM#gPG&;zXr?BSGaPf|{vWnK!_=@s()1QnS;=Cpz=gk-Y1?A>fDKr2G-2_F1FGMwNi zkv2oB5Fohgf*KCd708UBo+x-5LQAWG8cBL-q7VreG)0XeUNzc?m7(>?j?;<)=Em$P z1?nVxH%WLGYvT8CGwMa{RcA839n+SW*`)DSs^)0JbnxcMm2diKHw!b4`mX76rUvdT zS;lAXS>J5QLlzdIz{!T~TverO@|;1NS>yOsGFCGz1f_GQkT`O8B;KM@$Twd#iM3eH z)r@tmq{NK{lvv;9##n~eP?S;9l^0=_SWkqRrc}~AC&n$ zG?J-b4>K>V-_`^aefZR|b5IxbgX~?iyr(;;C0t)?C+|E8%JuYVO;@60=c?{U-D2`x2q`>Y;kO{8WX-`YhwvGo%y?!3=q+(?kl#`LUa z_{BcNlU;`DB0YJ${1&tZKt*~b0tHIk@Ca^J3vdHAaM}#=?zS?DS6w$U(dO!R(hVXS zkx-R}ucn_eMYw^|M;2>Wy6N>GAoOqVsrHc^!eGF1{`d2neg2;BQQAc_+y*jwO9ucr z$YsK-Lc#zjYx|sM!}j|}Um+)n$ZcKPoEEyM!To4dcGAM$CH4eXGS3{Iya*;8oHOM>uh~Qd#Xvl>|TB23lt$~#EZlA z#;F){m#pVU%^D#FU_Id0H)+j^NA0Otm8tg0iZ3^g%pBrNq zZ>$1GvQf~iAFyNXk2(@vYJ=7<#4o9EN!QFXHyhPqcYQ1smRKRH*Kl=ArcE!u3U8W= zW!Te4jNA{z9LAgvnR~P!AA3O`^`47d1XE0QIIDyV5xNFoA_?#~l?LOToAe6n!H+Cg zXrxYdd*KzfJfxXbIzMbyK7D!0<(6qc%aOAoaz7*7Pj_DBA)~a!n?X*eu#YtOmM8GF z@59cm)vL_5cu(;5xn0|14Bpm93Q18z5`7DEit<>v5FzrU!K}Q|_1d9sF@-pv;@Ck- zNq#UDr`MvkUTJmT;|Hl#WKMhJ{9j{-p9ry}nNs8nw7;(Qyhe;=*aZ+YnNctDZyDg< zZrK0V#^XT|1g&Q=gb(yShn?VGGmg_ktH%v zF_+n2iL%X(B_WtGzmH{;jpsGxy!$E!vU9Vu=e6}iC05P@bBovKb#2(CHvY2ntK=8I zq0i$7<~M($&qGTc@)78B&5K5|X$1PbZeZciZORY;E_3OXT|7-90T^Nb;>p8C5Z0Ce zRDUC4d~^-uA|A2fsQdq1Qd*NlBE>%@*!jHbZGLABR>%Pf0BM@Oal3%YRI0U zoB{c-UP)_U9zYHdj*$BN|1U5DvU75OWd>AM75tjnw*aOCpny2UXKVU@;j{fVVKw|A zeEr8hPHx=!KRS2>kX3$R5d3@|#owMMECUvb@J;-A=k{01V8)+!Ziu?ApLcGEx~<>t S-2R3^@ZU**G(>#m!v6#A139+< literal 0 HcmV?d00001 diff --git "a/images/\347\256\200\345\215\225\351\200\211\346\213\251\346\216\222\345\272\217.gif" "b/images/\347\256\200\345\215\225\351\200\211\346\213\251\346\216\222\345\272\217.gif" new file mode 100644 index 0000000000000000000000000000000000000000..d5975d0c6c403fb48f7341b8babb28d8afac4a9e GIT binary patch literal 146405 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/)cky#93;=TPv5HZ)%jl26U*4D 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

    r^KcUdu3E>*v|8 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 #_89u!(q%TM^2iob>AOU+rkXuV3v|pL?^i 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 UpH_VFbXIUOl8O=~VxRo~A8spv5C8xG literal 0 HcmV?d00001 From 700b527d2fe4df4dda2311946db9f2f04ea401b2 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 15 Jan 2018 13:37:20 -0600 Subject: [PATCH 368/473] =?UTF-8?q?Update=20python=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=85=AB=E5=A4=A7=E6=8E=92=E5=BA=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...53\345\244\247\346\216\222\345\272\217.md" | 370 +++++++++++++++++- 1 file changed, 369 insertions(+), 1 deletion(-) diff --git "a/python\345\256\236\347\216\260\345\205\253\345\244\247\346\216\222\345\272\217.md" "b/python\345\256\236\347\216\260\345\205\253\345\244\247\346\216\222\345\272\217.md" index 730fdef0f..b45d9c9ff 100644 --- "a/python\345\256\236\347\216\260\345\205\253\345\244\247\346\216\222\345\272\217.md" +++ "b/python\345\256\236\347\216\260\345\205\253\345\244\247\346\216\222\345\272\217.md" @@ -1,4 +1,16 @@ -### 直接插入排序 +## 前言 +八大排序,三大查找是《数据结构》当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法。 +常见的八大排序算法,他们之间关系如下: + +![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E5%85%AB%E5%A4%A7%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E6%80%BB%E7%BB%93.png) + +他们的性能比较: + +![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E5%85%AB%E5%A4%A7%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E6%80%A7%E8%83%BD%E6%AF%94%E8%BE%83.png) + +### 直接插入排序 (Insertion sort) + +![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E7%9B%B4%E6%8E%A5%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F.gif) 直接插入排序的核心思想就是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。 因此,从上面的描述中我们可以发现,直接插入排序可以用两个循环完成: @@ -19,3 +31,359 @@ def insert_sort(L): if L[i] > L[i+1]: L[i], L[i+1] = L[i+1], L[i] ``` +### 希尔排序 (Shell sort) + +![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F.png) + +希尔排序的算法思想:将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序。 +同样的:从上面的描述中我们可以发现:希尔排序的总体实现应该由三个循环完成: + +1. 第一层循环:将gap依次折半,对序列进行分组,直到gap=1 +2. 第二、三层循环:也即直接插入排序所需要的两次循环。具体描述见上。 + +```python +#希尔排序 +def insert_shell(L): + #初始化gap值,此处利用序列长度的一半为其赋值 + gap = int(len(L)/2) + #第一层循环:依次改变gap值对列表进行分组 + while (gap >= 1): + #下面:利用直接插入排序的思想对分组数据进行排序 + #range(gap,len(L)):从gap开始 + for x in range(gap,len(L)): + #range(x-gap,-1,-gap):从x-gap开始与选定元素开始倒序比较,每个比较元素之间间隔gap + for i in range(x-gap,-1,-gap): + #如果该组当中两个元素满足交换条件,则进行交换 + if L[i] > L[i+gap]: + L[i], L[i+gap] = L[i+gap], L[i] + #while循环条件折半 + gap = int((gap/2)) +``` + +### 简单选择排序 (Selection sort) + +![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E7%AE%80%E5%8D%95%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F.gif) + +简单选择排序的基本思想:比较+交换。 + +1. 从待排序序列中,找到关键字最小的元素; +2. 如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换; +3. 从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。 +因此我们可以发现,简单选择排序也是通过两层循环实现。 + - 第一层循环:依次遍历序列当中的每一个元素 + - 第二层循环:将遍历得到的当前元素依次与余下的元素进行比较,符合最小元素的条件,则交换。 + +```python +# 简单选择排序 +def select_sort(L): +#依次遍历序列中的每一个元素 + for x in range(0,len(L)): +#将当前位置的元素定义此轮循环当中的最小值 + minimum = L[x] +#将该元素与剩下的元素依次比较寻找最小元素 + for i in range(x+1,len(L)): + if L[i] < minimum: + L[i], minimum = minimum, L[i] +#将比较后得到的真正的最小值赋值给当前位置 + L[x] = minimum +``` + +### 堆排序 (Heap sort) + +#### 堆的概念 + +堆:本质是一种数组对象。特别重要的一点性质:任意的叶子节点小于(或大于)它所有的父节点。对此,又分为大顶堆和小顶堆,大顶堆要求节点的元素都要大于其孩子,小顶堆要求节点元素都小于其左右孩子,两者对左右孩子的大小关系不做任何要求。 +利用堆排序,就是基于大顶堆或者小顶堆的一种排序方法。下面,我们通过大顶堆来实现。 + +基本思想: +堆排序可以按照以下步骤来完成: + +1. 首先将序列构建称为大顶堆; + +(这样满足了大顶堆那条性质:位于根节点的元素一定是当前序列的最大值) + +![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E6%9E%84%E5%BB%BA%E5%A4%A7%E9%A1%B6%E5%A0%86.png) + +2. 取出当前大顶堆的根节点,将其与序列末尾元素进行交换; + +(此时:序列末尾的元素为已排序的最大值;由于交换了元素,当前位于根节点的堆并不一定满足大顶堆的性质) + +3. 对交换后的n-1个序列元素进行调整,使其满足大顶堆的性质; + +![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E8%B0%83%E6%95%B4%E5%A4%A7%E9%A1%B6%E5%A0%86.png) + +4. 重复2.3步骤,直至堆中只有1个元素为止 + +```python +#-------------------------堆排序-------------------------------- +#**********获取左右叶子节点********** +def LEFT(i): + return 2*i + 1 +def RIGHT(i): + return 2*i + 2 +#********** 调整大顶堆 ********** +#L:待调整序列 length: 序列长度 i:需要调整的结点 +def adjust_max_heap(L, length, i): +#定义一个int值保存当前序列最大值的下标 + largest = i +#获得序列左右叶子节点的下标 + left, right = LEFT(i), RIGHT(i) +#当左叶子节点的下标小于序列长度 并且 左叶子节点的值大于父节点时,将左叶子节点的下标赋值给largest + if (left < length) and (L[left] > L[i]): + largest = left +#当右叶子节点的下标小于序列长度 并且 右叶子节点的值大于父节点时,将右叶子节点的下标值赋值给largest + if (right < length) and (L[right] > L[largest]): + largest = right +#如果largest不等于i 说明当前的父节点不是最大值,需要交换值 + if (largest != i): + L[i], L[largest] = L[largest], L[i] + # 执行递归操作:两个任务:1 寻找最大值的下标;2.最大值与父节点交换 + adjust_max_heap(L, length, largest) +#********** 建立大顶堆 ********** +def build_max_heap(L): + length = len(L) + for x in range(int((length-1)/2), -1, -1): + adjust_max_heap(L, length, x) +#********** 堆排序 ********** +def heap_sort(L): +#先建立大顶堆,保证最大值位于根节点;并且父节点的值大于叶子结点 + build_max_heap(L) +#i:当前堆中序列的长度.初始化为序列的长度 + i = len(L) +#执行循环:1. 每次取出堆顶元素置于序列的最后(len-1,len-2,len-3...) +# 2. 调整堆,使其继续满足大顶堆的性质,注意实时修改堆中序列的长度 + while (i > 0): + L[i-1], L[0] = L[0], L[i-1] +#堆中序列长度减1 + i -= 1 +#调整大顶堆 + adjust_max_heap(L, i, 0) +``` +### 冒泡排序 (Bubble sort) + +![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F.gif) + +冒泡排序思路比较简单: + +1. 将序列当中的左右元素,依次比较,保证右边的元素始终大于左边的元素; +( 第一轮结束后,序列最后一个元素一定是当前序列的最大值;) +2. 对序列当中剩下的n-1个元素再次执行步骤1。 +3. 对于长度为n的序列,一共需要执行n-1轮比较 +(利用while循环可以减少执行次数) + +```python +#冒泡排序 +def bubble_sort(L): + length = len(L) +#序列长度为length,需要执行length-1轮交换 + for x in range(1, length): +#对于每一轮交换,都将序列当中的左右元素进行比较 +#每轮交换当中,由于序列最后的元素一定是最大的,因此每轮循环到序列未排序的位置即可 + for i in range(0, length-x): + if L[i] > L[i+1]: + L[i], L[i+1] = L[i+1], L[i] +``` + +### 快速排序 (Quick sort) + +![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F.gif) + +快速排序的基本思想:挖坑填数+分治法 + +1. 从序列当中选择一个基准数(pivot) +在这里我们选择序列当中第一个数作为基准数 +2. 将序列当中的所有数依次遍历,比基准数大的位于其右侧,比基准数小的位于其左侧 +3. 重复步骤1.2,直到所有子集当中只有一个元素为止。 + +用伪代码描述如下: +- i =L; j = R; 将基准数挖出形成第一个坑a[i]。 +- j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。 +- i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。 +- 再重复执行2,3二步,直到i==j,将基准数填入a[i]中 + +```python +#快速排序 +#L:待排序的序列;start排序的开始index,end序列末尾的index +#对于长度为length的序列:start = 0;end = length-1 +def quick_sort(L, start, end): + if start < end: + i, j, pivot = start, end, L[start] + while i < j: +#从右开始向左寻找第一个小于pivot的值 + while (i < j) and (L[j] >= pivot): + j -= 1 +#将小于pivot的值移到左边 + if (i < j): + L[i] = L[j] + i += 1 +#从左开始向右寻找第一个大于pivot的值 + while (i < j) and (L[i] <= pivot): + i += 1 +#将大于pivot的值移到右边 + if (i < j): + L[j] = L[i] + j -= 1 +#循环结束后,说明 i=j,此时左边的值全都小于pivot,右边的值全都大于pivot +#pivot的位置移动正确,那么此时只需对左右两侧的序列调用此函数进一步排序即可 +#递归调用函数:依次对左侧序列:从0 ~ i-1//右侧序列:从i+1 ~ end + L[i] = pivot +#左侧序列继续排序 + quick_sort(L, start, i-1) +#右侧序列继续排序 + quick_sort(L, i+1, end) +``` + +### 归并排序 (Merge sort) + +![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F.gif) + +1. 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个典型的应用。它的基本操作是:将已有的子序列合并,达到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 +2. 归并排序其实要做两件事: + - 分解----将序列每次折半拆分 + - 合并----将划分后的序列段两两排序合并 +因此,归并排序实际上就是两个操作,拆分+合并 +3. 如何合并? + - L[first...mid]为第一段,L[mid+1...last]为第二段,并且两端已经有序,现在我们要将两端合成达到L[first...last]并且也有序。 + - 首先依次从第一段与第二段中取出元素比较,将较小的元素赋值给temp[] + - 重复执行上一步,当某一段赋值结束,则将另一段剩下的元素赋值给temp[] + - 此时将temp[]中的元素复制给L[],则得到的L[first...last]有序 +4. 如何分解? + - 在这里,我们采用递归的方法,首先将待排序列分成A,B两组; + - 然后重复对A、B序列分组; + - 直到分组后组内只有一个元素,此时我们认为组内所有元素有序,则分组结束。 + +```python +# 归并排序 +#这是合并的函数 +# 将序列L[first...mid]与序列L[mid+1...last]进行合并 +def mergearray(L, first, mid, last, temp): +#对i,j,k分别进行赋值 + i, j, k = first, mid+1, 0 +#当左右两边都有数时进行比较,取较小的数 + while (i <= mid) and (j <= last): + if L[i] <= L[j]: + temp[k] = L[i] + i += 1 + k += 1 + else: + temp[k] = L[j] + j += 1 + k += 1 +#如果左边序列还有数 + while (i <= mid): + temp[k] = L[i] + i += 1 + k += 1 +#如果右边序列还有数 + while (j <= last): + temp[k] = L[j] + j += 1 + k += 1 +#将temp当中该段有序元素赋值给L待排序列使之部分有序 + for x in range(0, k): + L[first+x] = temp[x] +# 这是分组的函数 +def merge_sort(L, first, last, temp): + if first < last: + mid = int(((first + last) / 2)) +#使左边序列有序 + merge_sort(L, first, mid, temp) +#使右边序列有序 + merge_sort(L, mid+1, last, temp) +#将两个有序序列合并 + mergearray(L, first, mid, last, temp) +# 归并排序的函数 +def merge_sort_array(L): +#声明一个长度为len(L)的空列表 + temp = len(L)*[None] +#调用归并排序 + merge_sort(L, 0, len(L)-1, temp) +``` + +### 基数排序 (Radix sort) + +![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E5%9F%BA%E6%95%B0%E6%8E%92%E5%BA%8F.gif) + +1. 基数排序:通过序列中各个元素的值,对排序的N个元素进行若干趟的“分配”与“收集”来实现排序。 + - 分配:我们将L[i]中的元素取出,首先确定其个位上的数字,根据该数字分配到与之序号相同的桶中 + - 收集:当序列中所有的元素都分配到对应的桶中,再按照顺序依次将桶中的元素收集形成新的一个待排序列L[ ] + - 对新形成的序列L[]重复执行分配和收集元素中的十位、百位...直到分配完该序列中的最高位,则排序结束 +2. 根据上述“基数排序”的展示,我们可以清楚的看到整个实现的过程 + +```python +#************************基数排序**************************** +#确定排序的次数 +#排序的顺序跟序列中最大数的位数相关 +def radix_sort_nums(L): + maxNum = L[0] +#寻找序列中的最大数 + for x in L: + if maxNum < x: + maxNum = x +#确定序列中的最大元素的位数 + times = 0 + while (maxNum > 0): + maxNum = int((maxNum/10)) + times += 1 + return times +#找到num从低到高第pos位的数据 +def get_num_pos(num, pos): + return (int((num/(10**(pos-1))))) % 10 +#基数排序 +def radix_sort(L): + count = 10 * [None] #存放各个桶的数据统计个数 + bucket = len(L) * [None] #暂时存放排序结果 +#从低位到高位依次执行循环 + for pos in range(1, radix_sort_nums(L)+1): + #置空各个桶的数据统计 + for x in range(0, 10): + count[x] = 0 + #统计当前该位(个位,十位,百位....)的元素数目 + for x in range(0, len(L)): + #统计各个桶将要装进去的元素个数 + j = get_num_pos(int(L[x]), pos) + count[j] += 1 + #count[i]表示第i个桶的右边界索引 + for x in range(1,10): + count[x] += count[x-1] + #将数据依次装入桶中 + for x in range(len(L)-1, -1, -1): + #求出元素第K位的数字 + j = get_num_pos(L[x], pos) + #放入对应的桶中,count[j]-1是第j个桶的右边界索引 + bucket[count[j]-1] = L[x] + #对应桶的装入数据索引-1 + count[j] -= 1 + # 将已分配好的桶中数据再倒出来,此时已是对应当前位数有序的表 + for x in range(0, len(L)): + L[x] = bucket[x] +``` + + + + + +## 运行时间实测 +10w数据 +``` +直接插入排序:1233.581131 +希尔排序:1409.8012320000003 +简单选择排序:466.66974500000015 +堆排序:1.2036720000000969 +冒泡排序:751.274449 +#**************************************************** +快速排序:1.0000003385357559e-06 +#快速排序有误:实际上并未执行 +#RecursionError: maximum recursion depth exceeded in comparison +#**************************************************** +归并排序:0.8262230000000272 +基数排序:1.1162899999999354 +``` +从运行结果上来看,堆排序、归并排序、基数排序真的快。 +对于快速排序迭代深度超过的问题,可以将考虑将快排通过非递归的方式进行实现。 + +## Resources + +1. [算法导论》笔记汇总](http://mindlee.com/2011/08/21/study-notes-directory/) +2. [八大排序算法的 Python 实现](http://python.jobbole.com/82270/) +3. [数据结构常见的八大排序算法(详细整理)](https://www.jianshu.com/p/7d037c332a9d) From 5b6c4dc007cfe075efdfe10e1a15ccc1851b9da5 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 15 Jan 2018 14:55:08 -0600 Subject: [PATCH 369/473] Update 345._Reverse_Vowels_of_a_String.md --- 345._Reverse_Vowels_of_a_String.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/345._Reverse_Vowels_of_a_String.md b/345._Reverse_Vowels_of_a_String.md index 238022466..380c1b513 100644 --- a/345._Reverse_Vowels_of_a_String.md +++ b/345._Reverse_Vowels_of_a_String.md @@ -27,7 +27,7 @@ class Solution(object): vowels = 'aeiou' string = list(s) i, j = 0, len(s) -1 - while i < j: + while i <= j: if string[i].lower() not in vowels: i += 1 elif string[j].lower() not in vowels: From 85f43a69b75bc3753c53126e90834b746e53a9bd Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 15 Jan 2018 15:14:09 -0600 Subject: [PATCH 370/473] Create 760._Find_Anagram_Mappings.md --- 760._Find_Anagram_Mappings.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 760._Find_Anagram_Mappings.md diff --git a/760._Find_Anagram_Mappings.md b/760._Find_Anagram_Mappings.md new file mode 100644 index 000000000..fe69ce141 --- /dev/null +++ b/760._Find_Anagram_Mappings.md @@ -0,0 +1,31 @@ +### 760. Find Anagram Mappings + +题目: + + + +难度: + +Easy + + + + + +```python +class Solution(object): + def anagramMappings(self, A, B): + """ + :type A: List[int] + :type B: List[int] + :rtype: List[int] + """ + if not A: + return [] + res = [] + for i in A: + res.append(B.index(i)) + return res +``` + + From eb41696499bcfb6770a1d876f90df238ef9338be Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 15 Jan 2018 19:40:33 -0600 Subject: [PATCH 371/473] Update 031._next_permutation.md --- 031._next_permutation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/031._next_permutation.md b/031._next_permutation.md index 35c92949f..69d810cb1 100644 --- a/031._next_permutation.md +++ b/031._next_permutation.md @@ -92,7 +92,7 @@ class Solution(object): idx = i break if idx != 0: # if the number exist,which means that the nums not like{5,4,3,2,1} - for i in range(len(nums)-1, 0, -1): + for i in range(len(nums)-1, idx-1, -1): if nums[i] > nums[idx-1]: nums[i], nums[idx-1] = nums[idx-1], nums[i] break From 37063d09f20f729e92f1981332251aeda0bf984b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 15 Jan 2018 21:20:15 -0600 Subject: [PATCH 372/473] Update 208._implement_trie_(prefix_tree).md --- 208._implement_trie_(prefix_tree).md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/208._implement_trie_(prefix_tree).md b/208._implement_trie_(prefix_tree).md index 1a442748c..8ee06db58 100644 --- a/208._implement_trie_(prefix_tree).md +++ b/208._implement_trie_(prefix_tree).md @@ -56,10 +56,11 @@ class Trie(object): :rtype: bool """ node = self.root - for letter in word: - node = node.childs.get(letter) - if node is None: + for i in word: + child = node.childs.get(i) + if child is None: return False + node = child return node.isWord @@ -72,9 +73,10 @@ class Trie(object): """ node = self.root for letter in prefix: - node = node.childs.get(letter) - if node is None: + child = node.childs.get(letter) + if child is None: return False + node = child return True From 2dbb3fb12c49de99efe45599d4276ae063ce27c5 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 15 Jan 2018 22:44:37 -0600 Subject: [PATCH 373/473] Update 279._perfect_squares.md --- 279._perfect_squares.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/279._perfect_squares.md b/279._perfect_squares.md index a6daecc2d..df9450d5c 100644 --- a/279._perfect_squares.md +++ b/279._perfect_squares.md @@ -35,29 +35,29 @@ class Solution(object): return dp[-1] ``` -但是这个方法贼慢,有时候提交甚至会超时,有时候又不会。。。。因此想别的办法 +但是这个方法贼慢,beats 12%, 有时候提交甚至会超时,有时候又不会。。。。因此想别的办法 ### 思路二: -Static DP +Static DP, beats 90.39% ```python class Solution(object): + dp = [0] def numSquares(self, n): """ :type n: int :rtype: int """ - dp = [0] - while len(dp) <= n: - m = len(dp) + while len(self.dp) <= n: + m = len(self.dp) inf = float('inf') i = 1 while i * i <= m: - inf = min(inf, dp[m-i*i] + 1) + inf = min(inf, self.dp[m-i*i] + 1) i += 1 - dp.append(inf) - return dp[-1] + self.dp.append(inf) + return self.dp[n] ``` ### 思路三: From 726bf955d8ae72fe0c4ebe7b8ba1e643330bbaaa Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 15 Jan 2018 22:47:08 -0600 Subject: [PATCH 374/473] Update 279._perfect_squares.md --- 279._perfect_squares.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/279._perfect_squares.md b/279._perfect_squares.md index df9450d5c..2e012d1be 100644 --- a/279._perfect_squares.md +++ b/279._perfect_squares.md @@ -33,7 +33,6 @@ class Solution(object): dp[i] = min(dp[i], dp[i-j*j] + 1) j += 1 return dp[-1] - ``` 但是这个方法贼慢,beats 12%, 有时候提交甚至会超时,有时候又不会。。。。因此想别的办法 @@ -59,6 +58,13 @@ class Solution(object): self.dp.append(inf) return self.dp[n] ``` +这里有个问题现在还没搞明白,以后再好好想一下,写成```return self.dp[-1]```提交就失败, +``` +Submission Result: Wrong Answer +Input: 1024 +Output: 4 +Expected: 1 +``` ### 思路三: From 47ae790f61732c6ef9f6647b668537c290a61049 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 15 Jan 2018 23:09:16 -0600 Subject: [PATCH 375/473] Update 279._perfect_squares.md --- 279._perfect_squares.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/279._perfect_squares.md b/279._perfect_squares.md index 2e012d1be..f4d8bd50f 100644 --- a/279._perfect_squares.md +++ b/279._perfect_squares.md @@ -58,6 +58,20 @@ class Solution(object): self.dp.append(inf) return self.dp[n] ``` + +进一步简化可以写成: +```python +class Solution(object): + dp = [0] + def numSquares(self, n): + """ + :type n: int + :rtype: int + """ + while len(self.dp) <= n: + self.dp += min(self.dp[-j*j] + 1 for j in range(1, int(len(self.dp)**0.5+1))), + return self.dp[n] +``` 这里有个问题现在还没搞明白,以后再好好想一下,写成```return self.dp[-1]```提交就失败, ``` Submission Result: Wrong Answer From 62cef32a89d6852c4a608963f58c133f5935c2ea Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 16 Jan 2018 15:44:40 -0600 Subject: [PATCH 376/473] Create Google.md --- interview question/Google.md | 59 ++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 interview question/Google.md diff --git a/interview question/Google.md b/interview question/Google.md new file mode 100644 index 000000000..d14b8fae0 --- /dev/null +++ b/interview question/Google.md @@ -0,0 +1,59 @@ +### 第一轮: +1. Talk about the work experience of you + + +2. 算法题:给一个number,例如21200, + + + +Idx: 0 1 2 3 4 +Number: 2 1 2 0 0 + +- 0th位置有个2,并且整个number里面有2个0; +- 1th有个1,所以整个number里面有一个1; +- 2th有个2,所以整个number里面有两个2; +- 3th有个0,所以整个number里面有0个3; +- 4th有个0,所以整个number里面有0个4 + +满足这个property的number是self_describing的 +叫你写一个函数 +def self_describing(self, number), return 这个number是不是满足self_describing,True or False + + + +3. 算法题,面试官自己工作中的,写了一串, +- 问你是```BFS```还是DFS, +- 问你是```recursive```还是iterative,recursive方法有什么limitation +- 不管结果,你给他的代码转换成```iterative``` or recursive + + + + +### 第二轮: +1. talk about the most challenging work that you have been worked on + + +2. HashTable 和 BST的比较,你知道什么说什么,时间复杂度,实现,插入,删除,查找 + +3. HashTable 和 BST 的concurrency对比 + + + +4. 算法题 + +首先,morse_code = { + 'a': '..', + 'b': '.-', + 'c': '...', + ‘d’: '-' + , + , + ......... + } +给你一串words, +- 例如['ab','cd'],这时候因为words里面的两个word的对应的morse_code是一样的,所以我们返回他们的morse_code,即['...-'] +- 再例如有很多words,有着相同morse_code的words很多,你要返回所有相同morse_code 的words所对应的那个morse_code,例如['...-', '..'] + + + + From a314012c72fb4f46976d3fee6bbfe2caf0d1ac4d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 20 Jan 2018 03:11:55 -0600 Subject: [PATCH 377/473] Create 121._Best_Time_to_Buy_and_Sell_Stock.md --- 121._Best_Time_to_Buy_and_Sell_Stock.md | 39 +++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 121._Best_Time_to_Buy_and_Sell_Stock.md diff --git a/121._Best_Time_to_Buy_and_Sell_Stock.md b/121._Best_Time_to_Buy_and_Sell_Stock.md new file mode 100644 index 000000000..a51720281 --- /dev/null +++ b/121._Best_Time_to_Buy_and_Sell_Stock.md @@ -0,0 +1,39 @@ +### 121. Best Time to Buy and Sell Stock + +题目: + + + +难度: + +Easy + + +思路 + +All the straight forward solution should work, but if the interviewer twists the question slightly +by giving the difference array of prices, Ex: for ```{1, 7, 4, 11}```, if he gives ```{0, 6, -3, 7}```, +you might end up being confused. + +Here, the logic is to calculate the difference ```(maxCur += prices[i] - prices[i-1])``` +of the original array, and find a contiguous subarray giving maximum profit. +If the difference falls below ```0```, reset it to zero. + + +```python +class Solution(object): + def maxProfit(self, prices): + """ + :type prices: List[int] + :rtype: int + """ + if not prices: + return 0 + res, max_cur = 0, 0 + for i in range(1, len(prices)): + max_cur = max(0, max_cur+prices[i]-prices[i-1]) + res = max(res, max_cur) + return res +``` + + From 18de1226a573aaae606ff8d2ea50232f7f2b46f2 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 20 Jan 2018 03:22:32 -0600 Subject: [PATCH 378/473] Update 121._Best_Time_to_Buy_and_Sell_Stock.md --- 121._Best_Time_to_Buy_and_Sell_Stock.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/121._Best_Time_to_Buy_and_Sell_Stock.md b/121._Best_Time_to_Buy_and_Sell_Stock.md index a51720281..352650cba 100644 --- a/121._Best_Time_to_Buy_and_Sell_Stock.md +++ b/121._Best_Time_to_Buy_and_Sell_Stock.md @@ -19,7 +19,8 @@ Here, the logic is to calculate the difference ```(maxCur += prices[i] - prices[ of the original array, and find a contiguous subarray giving maximum profit. If the difference falls below ```0```, reset it to zero. - +参考[Maximum subarray problem](https://en.wikipedia.org/wiki/Maximum_subarray_problem), +[Kadane's Algorithm](https://discuss.leetcode.com/topic/19853/kadane-s-algorithm-since-no-one-has-mentioned-about-this-so-far-in-case-if-interviewer-twists-the-input) ```python class Solution(object): def maxProfit(self, prices): From 732d93aad48cfa0fd638315810f1d91ad6b92c0d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 1 Feb 2018 19:11:17 -0600 Subject: [PATCH 379/473] Update 078.Subsets .md --- 078.Subsets .md | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/078.Subsets .md b/078.Subsets .md index c0092653e..949a472f5 100644 --- a/078.Subsets .md +++ b/078.Subsets .md @@ -1,4 +1,4 @@ -###78.Subsets +### 78.Subsets 题目: @@ -9,7 +9,7 @@ Python代码 -``` +```python class Solution(object): def subsets(self, nums): """ @@ -23,31 +23,11 @@ class Solution(object): ``` -可是我不能理解,为嘛我写的这个不work. - -⬇️ - -我的不work因为不能同时改变list和iterate list - - -``` -def subsets(nums): - """ - :type nums: List[int] - :rtype: List[List[int]] - """ - results = [[]] - for num in nums: - for result in results: - results.extend([result + [num]]) - return results - -``` BackTrack 标准解法版 -``` +```python class Solution: def search(self, nums, S, index): @@ -64,4 +44,4 @@ class Solution: return self.results ``` -对每个元素,有两种可能,加入S和不加入S,写起来思路还是很清爽的 \ No newline at end of file +对每个元素,有两种可能,加入S和不加入S,写起来思路还是很清爽的 From e2b4b3066bb61235bc9ab3bc41ed60bf28d2a3e3 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 1 Feb 2018 19:11:28 -0600 Subject: [PATCH 380/473] Update 078.Subsets .md --- 078.Subsets .md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/078.Subsets .md b/078.Subsets .md index 949a472f5..e5b100563 100644 --- a/078.Subsets .md +++ b/078.Subsets .md @@ -1,4 +1,4 @@ -### 78.Subsets +### 78. Subsets 题目: From 4b4e2483419c7c9b0855b28c6f0daa446b6e69cf Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 1 Feb 2018 19:37:08 -0600 Subject: [PATCH 381/473] Update 090._subsets_ii.md --- 090._subsets_ii.md | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/090._subsets_ii.md b/090._subsets_ii.md index 9a1cdafd4..8f842080e 100644 --- a/090._subsets_ii.md +++ b/090._subsets_ii.md @@ -1,4 +1,4 @@ -###90. Subsets II +### 90. Subsets II 题目: @@ -9,6 +9,7 @@ 思路: + 参考别人的 现在来观察规律,与之前有不同之处是我们需要一个位置来mark,因为不再需要往之前出现过的地方再加了,看这个: @@ -25,9 +26,27 @@ +```python +class Solution(object): + def subsetsWithDup(self, nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + nums.sort() + results = [[]] + for i in range(len(nums)): + if any(nums[i] in result for result in results): + results.extend([result + [nums[i]] for result in results if result.count(nums[i]) == i - nums.index(nums[i])]) + else: + results.extend([result + [nums[i]] for result in results]) + return results + +``` -``` + +```python class Solution(object): def subsetsWithDup(self, nums): """ @@ -44,4 +63,5 @@ class Solution(object): result.append(result[j] + [nums[i]]) return result -``` \ No newline at end of file +``` + From 67a67bedac1d7e1075de2ccc1f37fd56897ee0ec Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 1 Feb 2018 19:38:09 -0600 Subject: [PATCH 382/473] Update 090._subsets_ii.md --- 090._subsets_ii.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/090._subsets_ii.md b/090._subsets_ii.md index 8f842080e..fca30b462 100644 --- a/090._subsets_ii.md +++ b/090._subsets_ii.md @@ -24,8 +24,7 @@ 这里这个start是来记录了之前一次数组的长度,temp_size记住目前数组的长度,然后用这个来达到去重的目的,非常聪明 - - +自己的解法 ```python class Solution(object): def subsetsWithDup(self, nums): @@ -45,7 +44,7 @@ class Solution(object): ``` - +别人的,但是一个意思 ```python class Solution(object): def subsetsWithDup(self, nums): From 39ec077157e641e72e01b3d3a9a6e96deb758d39 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 1 Feb 2018 19:48:04 -0600 Subject: [PATCH 383/473] Update 090._subsets_ii.md --- 090._subsets_ii.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/090._subsets_ii.md b/090._subsets_ii.md index fca30b462..99661e3da 100644 --- a/090._subsets_ii.md +++ b/090._subsets_ii.md @@ -19,6 +19,20 @@ [[],[1]] 是 [1] 的子集合 [[],[1],[2],[1,2]] 是 [1,2] 的子集合,实际上就是1的子集合们加了一个2 新来的2不能再从头开始加了,它需要从[ .., [2],[1,2] ]加 才是合理的 + +****当出现多个重复数字时,应该从 已经拥有了新数字所出现全部次数的list开始加才是合理的**** +[[],[1]] 是 [1] 的子集合 +[[],[1],[2],[1,2]] 是 [1,2] 的子集合,实际上就是1的子集合们加了一个2 +[ + [2], + [1], + [1,2,2], + [2,2], + [1,2], + [] +] 是 [1,2,2] 的子集和,实际上也就是[1,2]的子集合加了一个2 +新来的2不能再从头开始加了,它需要从[ .., [2,2],[1,2,2] ]加 才是合理的 +例如: ``` From 5dd2f452ef3695cb90443d70939b35d93858af66 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 4 Feb 2018 22:14:24 -0600 Subject: [PATCH 384/473] Update 100._same_tree.md --- 100._same_tree.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/100._same_tree.md b/100._same_tree.md index ecc8c94f8..f12c86c3a 100644 --- a/100._same_tree.md +++ b/100._same_tree.md @@ -31,3 +31,19 @@ class Solution(object): return p.val == q.val and all(map(self.isSameTree, (p.left, p.right), (q.left, q.right))) if p and q else p is q ``` +```python +class Solution(object): + def isSameTree(self, p, q): + """ + :type p: TreeNode + :type q: TreeNode + :rtype: bool + """ + if (not p and q) or (p and not q): + return False + if not p and not q: + return True + if p.val == q.val: + return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right) + return False +``` From 8f5e73f4d4d2d59e4b6f56b3832f97e28cf411d5 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 4 Feb 2018 22:37:35 -0600 Subject: [PATCH 385/473] Update 083._remove_duplicates_from_sorted_list.md --- 083._remove_duplicates_from_sorted_list.md | 23 +++++++++------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/083._remove_duplicates_from_sorted_list.md b/083._remove_duplicates_from_sorted_list.md index bdca46263..5f7c07987 100644 --- a/083._remove_duplicates_from_sorted_list.md +++ b/083._remove_duplicates_from_sorted_list.md @@ -9,25 +9,20 @@ Easy +dummy 大法 - -``` +```python class Solution(object): def deleteDuplicates(self, head): """ :type head: ListNode :rtype: ListNode """ - cur = head - while cur: - if cur.next: - if cur.val == cur.next.val: - cur.next = cur.next.next - else: - cur = cur.next - # cur.next None - else: - break - return head + dummy = head + while head: + while head.next and head.next.val == head.val: + head.next = head.next.next # skip duplicated node + head = head.next # not duplicate of current node, move to next node + return dummy -``` \ No newline at end of file +``` From a7835ad8feaadaa33a2d1892b1c8461f451725b7 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 4 Feb 2018 22:37:52 -0600 Subject: [PATCH 386/473] Update 083._remove_duplicates_from_sorted_list.md --- 083._remove_duplicates_from_sorted_list.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/083._remove_duplicates_from_sorted_list.md b/083._remove_duplicates_from_sorted_list.md index 5f7c07987..a9081a689 100644 --- a/083._remove_duplicates_from_sorted_list.md +++ b/083._remove_duplicates_from_sorted_list.md @@ -1,4 +1,4 @@ -###83. Remove Duplicates from Sorted List +### 83. Remove Duplicates from Sorted List 题目: From bbae9226364d86777a7ea134dd59e229a3597857 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 5 Feb 2018 07:35:01 -0600 Subject: [PATCH 387/473] Update 121._Best_Time_to_Buy_and_Sell_Stock.md --- 121._Best_Time_to_Buy_and_Sell_Stock.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/121._Best_Time_to_Buy_and_Sell_Stock.md b/121._Best_Time_to_Buy_and_Sell_Stock.md index 352650cba..030ebd52b 100644 --- a/121._Best_Time_to_Buy_and_Sell_Stock.md +++ b/121._Best_Time_to_Buy_and_Sell_Stock.md @@ -21,6 +21,21 @@ If the difference falls below ```0```, reset it to zero. 参考[Maximum subarray problem](https://en.wikipedia.org/wiki/Maximum_subarray_problem), [Kadane's Algorithm](https://discuss.leetcode.com/topic/19853/kadane-s-algorithm-since-no-one-has-mentioned-about-this-so-far-in-case-if-interviewer-twists-the-input) + + +Why maxCur = Math.max(0, maxCur += prices[i] - prices[i-1]); ? + +Well, we can assume opt(i) as the max Profit you will get if you sell the stock at day i; + +We now face two situations: + +We hold a stock at day i, which means opt(i) = opt(i - 1) - prices[i - 1] + prices[i] (max Profit you can get if you sell stock at day(i-1) - money you lose if you buy the stock at day (i-1) + money you gain if you sell the stock at day i. + +We do not hold a stock at day i, which means we cannot sell any stock at day i. In this case, money we can get at day i is 0; + +opt(i) is the best case of 1 and 2. + +So, opt(i) = Max{opt(i - 1) - prices[i - 1] + prices[i], 0} ```python class Solution(object): def maxProfit(self, prices): From 81c7df86f189113b0f7d8286db0fe186f8893d27 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 5 Feb 2018 07:36:04 -0600 Subject: [PATCH 388/473] Update 121._Best_Time_to_Buy_and_Sell_Stock.md --- 121._Best_Time_to_Buy_and_Sell_Stock.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/121._Best_Time_to_Buy_and_Sell_Stock.md b/121._Best_Time_to_Buy_and_Sell_Stock.md index 030ebd52b..2edfa898b 100644 --- a/121._Best_Time_to_Buy_and_Sell_Stock.md +++ b/121._Best_Time_to_Buy_and_Sell_Stock.md @@ -23,6 +23,7 @@ If the difference falls below ```0```, reset it to zero. [Kadane's Algorithm](https://discuss.leetcode.com/topic/19853/kadane-s-algorithm-since-no-one-has-mentioned-about-this-so-far-in-case-if-interviewer-twists-the-input) +``` Why maxCur = Math.max(0, maxCur += prices[i] - prices[i-1]); ? Well, we can assume opt(i) as the max Profit you will get if you sell the stock at day i; @@ -36,6 +37,9 @@ We do not hold a stock at day i, which means we cannot sell any stock at day i. opt(i) is the best case of 1 and 2. So, opt(i) = Max{opt(i - 1) - prices[i - 1] + prices[i], 0} +``` + + ```python class Solution(object): def maxProfit(self, prices): From 748c79c493b80479a4f9924851818f1f0b4c9593 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 22 Feb 2018 14:35:31 -0600 Subject: [PATCH 389/473] Create 740_.delete_and_earn.md --- 740_.delete_and_earn.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 740_.delete_and_earn.md diff --git a/740_.delete_and_earn.md b/740_.delete_and_earn.md new file mode 100644 index 000000000..3810c4b09 --- /dev/null +++ b/740_.delete_and_earn.md @@ -0,0 +1,29 @@ +### 740. Delete and Earn + +题目: + + + +难度: + +Medium + + + + +```python +class Solution(object): + def deleteAndEarn(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + dp = [0] * 10001 + for num in nums: + dp[num] += num + for i in range(2, 10001): + dp[i] = max(dp[i]+dp[i-2], dp[i-1]) + return dp[-1] +``` + + From d793c7248a952b9eb27d9eea15c1c9d4eabd0b9a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 22 Feb 2018 14:35:51 -0600 Subject: [PATCH 390/473] Rename 740_.delete_and_earn.md to 740._delete_and_earn.md --- 740_.delete_and_earn.md => 740._delete_and_earn.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 740_.delete_and_earn.md => 740._delete_and_earn.md (100%) diff --git a/740_.delete_and_earn.md b/740._delete_and_earn.md similarity index 100% rename from 740_.delete_and_earn.md rename to 740._delete_and_earn.md From 6e4db16b6db206d63c40a7edc9d46ce3b7bcb5fd Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 22 Feb 2018 14:40:59 -0600 Subject: [PATCH 391/473] Update 198._house_robber.md --- 198._house_robber.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/198._house_robber.md b/198._house_robber.md index 74fc67d1e..2b2deedda 100644 --- a/198._house_robber.md +++ b/198._house_robber.md @@ -1,5 +1,5 @@ -###198. House Robber +### 198. House Robber 题目: @@ -18,7 +18,7 @@ dp[i] = max(dp[i-1], dp[i-2] + nums[i]) AC 代码 -``` +```python class Solution(object): def rob(self, nums): """ @@ -38,4 +38,16 @@ class Solution(object): return dp[n-1] ``` +```python +class Solution(object): + def rob(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + last, now = 0, 0 + for i in nums: last, now = now, max(last + i, now) + return now +``` + From dc80e46d8e2678e1fe469d70851784686260bcea Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 22 Feb 2018 15:18:24 -0600 Subject: [PATCH 392/473] Update and rename 012. Integer to Roman.md to 012._Integer_to_Roman.md --- 012. Integer to Roman.md => 012._Integer_to_Roman.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename 012. Integer to Roman.md => 012._Integer_to_Roman.md (97%) diff --git a/012. Integer to Roman.md b/012._Integer_to_Roman.md similarity index 97% rename from 012. Integer to Roman.md rename to 012._Integer_to_Roman.md index 617f287ea..a4d377b67 100644 --- a/012. Integer to Roman.md +++ b/012._Integer_to_Roman.md @@ -1,4 +1,4 @@ -###12. Integer to Roman +### 12. Integer to Roman 题目: @@ -86,4 +86,4 @@ class Solution(object): -因为dict本身是无序的,这里做了一个排序的操作,否则可能会出现IIII这种状况。 \ No newline at end of file +因为dict本身是无序的,这里做了一个排序的操作,否则可能会出现IIII这种状况。 From 67f0ce833ca411a3a3853af17bde650a354eab3d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 22 Feb 2018 15:24:45 -0600 Subject: [PATCH 393/473] Update 012._Integer_to_Roman.md --- 012._Integer_to_Roman.md | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/012._Integer_to_Roman.md b/012._Integer_to_Roman.md index a4d377b67..529a323e8 100644 --- a/012._Integer_to_Roman.md +++ b/012._Integer_to_Roman.md @@ -64,22 +64,35 @@ via AC代码 -``` - +```python class Solution(object): def intToRoman(self, num): """ :type num: int :rtype: str """ - lookup = {'M':1000, 'CM':900, 'D':500, 'CD':400, 'C':100, 'XC':90, 'L':50, 'XL':40, 'X':10, 'IX':9, 'V':5, 'IV':4, 'I':1} - romanSt = '' + lookup = { + 'M': 1000, + 'CM': 900, + 'D': 500, + 'CD': 400, + 'C': 100, + 'XC': 90, + 'L': 50, + 'XL': 40, + 'X': 10, + 'IX': 9, + 'V': 5, + 'IV': 4, + 'I': 1 + } + romanStr = '' for symbol, val in sorted(lookup.items(), key = lambda t: t[1], reverse = True): while num >= val: - romanSt += symbol + romanStr += symbol num -= val - return romanSt + return romanStr ``` From 417a474b080b38853a1f8fff297c1e28cbb25424 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 22 Feb 2018 15:26:45 -0600 Subject: [PATCH 394/473] Update 012._Integer_to_Roman.md --- 012._Integer_to_Roman.md | 33 +-------------------------------- 1 file changed, 1 insertion(+), 32 deletions(-) diff --git a/012._Integer_to_Roman.md b/012._Integer_to_Roman.md index 529a323e8..df577b5c6 100644 --- a/012._Integer_to_Roman.md +++ b/012._Integer_to_Roman.md @@ -25,43 +25,12 @@ Medium I V X L C D M ``` -组合是这种方式 - -``` -1 2 3 4 5 6 7 8 9 -I II III IV V VI VII VIII IX -10 20 30 40 50 60 70 80 90 -X XX XXX XL L LX LXX LXXX XC -100 200 300 400 500 600 700 800 900 -C CC CCC CD D DC DCC DCCC CM -``` - - - -可以看出来,这个进位或者组合是4和9的地方进位的,比如4是加上了I然后到V,9是加上了I到X。所以题目要限制数字在1-3999之间。 - -然后就去谷歌罗马数字最大能表示多少,看到了一个更好的总结,不过是可以更大的,数字上面加bar. - - - -via - -下面是几个通常的规则来构成罗马数字: - -- 大部分时候用字符相叠加来表示数字。I是1, II是2, III是3。VI是6(挨个看来,是“5 和 1”的组合),VII是7,VIII是8。 -- 含有10的字符(I,X,C和M)最多可以重复出现三个。为了表示4,必须用同一位数的下一个更大的数字5来减去一。不能用IIII来表示4,而应该是IV(意思是比5小1)。40写做XL(比50小10),41写做XLI,42写做XLII,43写做XLIII,44写做XLIV(比50小10并且比5小1)。 -- 有些时候表示方法恰恰相反。为了表示一个中间的数字,需要从一个最终的值来减。比如:9需要从10来减:8是VIII,但9确是IX(比10小1),并不是VIII(I字符不能重复4次)。90是XC,900是CM。 -- 表示5的字符不能在一个数字中重复出现。10只能用X表示,不能用VV表示。100只能用C表示,而不是LL。 -- 罗马数字是从左到右来计算,因此字符的顺序非常重要。DC表示600,而CD完全是另一个数字400(比500小100)。CI是101,IC不是一个罗马数字(因为你不能从100减1,你只能写成XCIX,表示比100小10,且比10小1)。 - -**规则总结:  左减右加    加减时位数和被加减数相差位数最大为一(两位数可加减一位数 三位数只能加减两位数)  从左向右计数** +见[Leetcode 013]() 所以想着4,9这块需要特殊处理一下,但是看到了一个很棒的[算法](https://gist.github.com/imilu/00f32c61e50b7ca296f91e9d96d8e976) - - AC代码 ```python From 8dfd44723eb1b4fb6f61ee761bfe43cd7e2ae534 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 22 Feb 2018 15:27:32 -0600 Subject: [PATCH 395/473] Update 012._Integer_to_Roman.md --- 012._Integer_to_Roman.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/012._Integer_to_Roman.md b/012._Integer_to_Roman.md index df577b5c6..6177e3322 100644 --- a/012._Integer_to_Roman.md +++ b/012._Integer_to_Roman.md @@ -27,9 +27,9 @@ I V X L C D M -见[Leetcode 013]() +罗马数字表示法见[Leetcode 013](https://github.com/Lisanaaa/thinking_in_lc/blob/master/013._Roman_to_Integer.md) -所以想着4,9这块需要特殊处理一下,但是看到了一个很棒的[算法](https://gist.github.com/imilu/00f32c61e50b7ca296f91e9d96d8e976) +这里有一个很棒的[算法](https://gist.github.com/imilu/00f32c61e50b7ca296f91e9d96d8e976) AC代码 From acb990006a89817ad0b3cdda2dda15c667e09e99 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 22 Feb 2018 15:35:22 -0600 Subject: [PATCH 396/473] Update and rename 453. Minimum Moves to Equal Array Elements.md to 453._Minimum_Moves_to_Equal_Array_Elements.md --- ...Elements.md => 453._Minimum_Moves_to_Equal_Array_Elements.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename 453. Minimum Moves to Equal Array Elements.md => 453._Minimum_Moves_to_Equal_Array_Elements.md (99%) diff --git a/453. Minimum Moves to Equal Array Elements.md b/453._Minimum_Moves_to_Equal_Array_Elements.md similarity index 99% rename from 453. Minimum Moves to Equal Array Elements.md rename to 453._Minimum_Moves_to_Equal_Array_Elements.md index 064670f71..2e9668086 100644 --- a/453. Minimum Moves to Equal Array Elements.md +++ b/453._Minimum_Moves_to_Equal_Array_Elements.md @@ -48,7 +48,7 @@ class Solution(object): AC代码 -``` +```python class Solution(object): def minMoves(self, nums): """ From 871f97606dc11d1dbea943c4b85a4307eabed7a2 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 24 Feb 2018 18:32:06 -0600 Subject: [PATCH 397/473] Update 053._maximum_subarray.md --- 053._maximum_subarray.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/053._maximum_subarray.md b/053._maximum_subarray.md index 984552d8f..e71c549d1 100644 --- a/053._maximum_subarray.md +++ b/053._maximum_subarray.md @@ -1,4 +1,4 @@ -###53. Maximum Subarray +### 53. Maximum Subarray 题目: From a0e40064162c42121dadad1c0823a5fed6ba994f Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 25 Feb 2018 02:33:15 -0600 Subject: [PATCH 398/473] Create pocketgems.md --- interview question/pocketgems.md | 121 +++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 interview question/pocketgems.md diff --git a/interview question/pocketgems.md b/interview question/pocketgems.md new file mode 100644 index 000000000..0b108c0df --- /dev/null +++ b/interview question/pocketgems.md @@ -0,0 +1,121 @@ +## 1. delete and earn +```python +class Solution(object): + def deleteAndEarn(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + dp = [0] * 10001 + for num in nums: + dp[num] += num + for i in range(2, 10001): + dp[i] = max(dp[i]+dp[i-2], dp[i-1]) + return dp[-1] +``` + +## 2. movie ratings + +```python + +cache = {} +class Solution(object): + def movierating(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + if not nums: + return 0 + if len(nums) == 1: + return nums[0] if nums[0] > 0 else 0 + if (1, len(nums)+1) not in cache: + cache[(1, len(nums)+1)] = self.movierating(nums[1:]) + a = self.movierating(nums[1:]) + else: + a = self.movierating(nums[1:]) + if (2, len(nums)+2) not in cache: + cache[(2, len(nums)+2)] = self.movierating(nums[2:]) + b = self.movierating(nums[2:]) + else: + b = self.movierating(nums[2:]) + return max(nums[0]+a, nums[1]+b) + + + +a = Solution() +res = a.movierating([-1,-2,-3,-4,-5]) + +print(res) + +``` + +## 3. roman names +```python +class Solution(object): + def roman2Int(self, s): + lookup = { + 'M': 1000, + 'D': 500, + 'C': 100, + 'L': 50, + 'X': 10, + 'V': 5, + 'I': 1 + } + res = 0 + for i in range(len(s)): + if i > 0 and lookup[s[i]] > lookup[s[i-1]]: + res = res + lookup[s[i]] - 2 * lookup[s[i-1]] + else: + res += lookup[s[i]] + return res + + def royalNames(self, names): + """ + :type nums: List[int] + :rtype: int + """ + for x in range(1, len(names)): + for i in range(len(names)-x): + if names[i].split(' ')[0] > names[i+1].split(' ')[0]: + names[i], names[i+1] = names[i+1], names[i] + elif names[i].split(' ')[0] == names[i+1].split(' ')[0]: + if self.roman2Int(names[i].split(' ')[1]) > self.roman2Int(names[i+1].split(' ')[1]): + names[i], names[i + 1] = names[i + 1], names[i] + return names + +a = Solution() +res = a.royalNames(['Akk IX', 'Ak VIII', 'Louis IX', 'Louis VIII']) +print(res) +``` + + +## 4. wealthy sam time +```python +class Solution(object): + def minMoves(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + res = 0 + minVal = min(nums) + for num in nums: + res += num -minVal + return res +``` + +## 5. design + + + + + + + + + + + + From ef92127573355d471f3476493f250629618313cc Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 25 Feb 2018 02:50:47 -0600 Subject: [PATCH 399/473] =?UTF-8?q?Update=20=E5=85=A8=E6=8E=92=E5=88=97?= =?UTF-8?q?=E7=AE=97=E6=B3=95.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\250\346\216\222\345\210\227\347\256\227\346\263\225.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" "b/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" index c371aba66..767617664 100644 --- "a/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" +++ "b/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" @@ -1,4 +1,4 @@ -###全排列算法 +### 全排列算法 #### 46. Permutations @@ -86,7 +86,7 @@ recPermute(['A','B','C'],0) 这样的写法更容易理解: -``` +```python class Solution: # @param num, a list of integer # @return a list of lists of integers @@ -191,4 +191,4 @@ class Solution(object): ``` -所以可以用这个next permutation来解46/47也可以,然后我兴奋了一下,这个算法很快的!然后我又冷静了,因为permutation的个数是O(n!)个啊|||,所以也不可能有啥大的提升吧 \ No newline at end of file +所以可以用这个next permutation来解46/47也可以,然后我兴奋了一下,这个算法很快的!然后我又冷静了,因为permutation的个数是O(n!)个啊|||,所以也不可能有啥大的提升吧 From 5fd786bd261ffa18bb8d4a3d546c3b145b3c55d1 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 3 Mar 2018 06:00:14 -0600 Subject: [PATCH 400/473] add interview questions of Wepay --- interview question/{ => Google}/Google.md | 0 interview question/WePay/WePay.jpg | Bin 0 -> 492900 bytes .../{ => pocketgems}/pocketgems.md | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename interview question/{ => Google}/Google.md (100%) create mode 100644 interview question/WePay/WePay.jpg rename interview question/{ => pocketgems}/pocketgems.md (100%) diff --git a/interview question/Google.md b/interview question/Google/Google.md similarity index 100% rename from interview question/Google.md rename to interview question/Google/Google.md diff --git a/interview question/WePay/WePay.jpg b/interview question/WePay/WePay.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9f5eeadb506a3264da89a6f07240aac5d463eae5 GIT binary patch literal 492900 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

    Jv-3Cy$R|jHNNfYsgzX?J12?)}S0a46PrYe$ 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 literal 0 HcmV?d00001 diff --git a/interview question/pocketgems.md b/interview question/pocketgems/pocketgems.md similarity index 100% rename from interview question/pocketgems.md rename to interview question/pocketgems/pocketgems.md From b5f9a77bcfaab1277372d53b2b8112137452a5ab Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 3 Mar 2018 06:01:43 -0600 Subject: [PATCH 401/473] Create WePay.md --- interview question/WePay/WePay.md | 34 +++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 interview question/WePay/WePay.md diff --git a/interview question/WePay/WePay.md b/interview question/WePay/WePay.md new file mode 100644 index 000000000..a3048653a --- /dev/null +++ b/interview question/WePay/WePay.md @@ -0,0 +1,34 @@ + + +就是一个slide windows 的题目 + +```python +inputs = [5,1,2,100,2,2] +def alert(inputs, windowSize, allowedIncrease): + b = [] + tmp = {} + for i in range(len(inputs) - windowSize): + for j in range(i, i+windowSize+1): + if j in tmp.keys(): + if j > len(inputs) - windowSize-1: + tmp.get(j).append(inputs[i+1:i + windowSize+1]) + else: + tmp.get(j).append(inputs[i:i+windowSize]) + else: + print(j,j, i, i+ windowSize) + if j > len(inputs) - windowSize -1: + tmp[j] = [inputs[i+1:i + windowSize+1]] + else: + tmp[j] = [inputs[i:i+windowSize]] + b = [inputs[i:i+windowSize] for i in range(len(inputs)-windowSize)] + print(tmp) + for num in tmp.keys(): + if all(inputs[num] > sum(lis)/windowSize*allowedIncrease for lis in tmp.get(num)): + return True + b = [sum(i)/windowSize for i in b] + for i in range(len(b)): + if any(b[i] > b[j]*allowedIncrease for j in range(i)): + return True + return False +print(alert(inputs,3,1.5)) +``` From 1816cf68f985d237a319fc5a7a2d0d02b3564df0 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 3 Mar 2018 06:02:22 -0600 Subject: [PATCH 402/473] Update WePay.md --- interview question/WePay/WePay.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interview question/WePay/WePay.md b/interview question/WePay/WePay.md index a3048653a..1ca2679b3 100644 --- a/interview question/WePay/WePay.md +++ b/interview question/WePay/WePay.md @@ -1,4 +1,4 @@ - +如图,![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/interview%20question/WePay/WePay.jpg) 就是一个slide windows 的题目 From 8049024db2fc88cba782906858bc4e27707fc9b4 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 3 Mar 2018 06:08:50 -0600 Subject: [PATCH 403/473] Create power_number.md --- interview question/WePay/power_number.md | 36 ++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 interview question/WePay/power_number.md diff --git a/interview question/WePay/power_number.md b/interview question/WePay/power_number.md new file mode 100644 index 000000000..6b3ae864e --- /dev/null +++ b/interview question/WePay/power_number.md @@ -0,0 +1,36 @@ + + + + + +```python +import heapq +cache = {} +def power_number(index): + if index in cache: + return cache[index] + tmp = set() + for i in range(2, index+3): + for j in range(2, 27): + tmp.add(pow(i, j)) + gene = heapsort(tmp) + tmp_index = 0 + for i in range(index+1): + if tmp_index not in cache: + cache[tmp_index] = next(gene) + else: + next(gene) + if tmp_index == index: + return cache[tmp_index] + tmp_index += 1 + + +def heapsort(iterable): + h = [] + for value in iterable: + heapq.heappush(h, value) + for i in range(len(h)): + yield heapq.heappop(h) + +print(power_number(6500)) +``` From 41cf9a7fdea105b25263cbb832c9919ddcf8ae73 Mon Sep 17 00:00:00 2001 From: GaofanHu Date: Thu, 22 Mar 2018 15:51:15 -0500 Subject: [PATCH 404/473] =?UTF-8?q?Update=20001.=5Fclone=E6=9C=80=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "001._clone\346\234\200\346\226\260" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/001._clone\346\234\200\346\226\260" "b/001._clone\346\234\200\346\226\260" index 9135c5048..22063ae2c 100644 --- "a/001._clone\346\234\200\346\226\260" +++ "b/001._clone\346\234\200\346\226\260" @@ -1 +1 @@ -001._记得先clone最新 +001._记得先clone最新. From 5e5a3f28117e55a2503f4cec0989e19f65fafc5c Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Thu, 22 Mar 2018 16:24:10 -0500 Subject: [PATCH 405/473] Update 366. Find Leaves of Binary Tree.md --- 366. Find Leaves of Binary Tree.md | 40 ++++++++++++++--------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/366. Find Leaves of Binary Tree.md b/366. Find Leaves of Binary Tree.md index 569296cb0..e82d592cc 100644 --- a/366. Find Leaves of Binary Tree.md +++ b/366. Find Leaves of Binary Tree.md @@ -18,7 +18,7 @@ AC代码 -``` +```python class Solution(object): def findLeaves(self, root): """ @@ -26,29 +26,27 @@ class Solution(object): :rtype: List[List[int]] """ def findLeaf(root): - if root == None: - return [] - elif root.left == None and root.right == None: - return [root.val] - else: - return findLeaf(root.left) + findLeaf(root.right) - + if not root: + return [] + elif not root.left and not root.right: + return [root.val] + else: + return findLeaf(root.left) + findLeaf(root.right) def removeLeaf(root): - if root == None: - return None - elif root.left == None and root.right == None: - return None - else: - if root.left: - root.left = removeLeaf(root.left) - if root.right: - root.right = removeLeaf(root.right) - return root - + if not root: + return None + elif not root.left and not root.right: + return None + else: + if root.left: + root.left = removeLeaf(root.left) + if root.right: + root.right = removeLeaf(root.right) + return root res = [] while root: - res.append(findLeaf(root)) - root = removeLeaf(root) + res.append(findLeaf(root)) + root = removeLeaf(root) return res ``` From 543527c68c8a3520fd298f8fbcf7d71d90dfc4d5 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 24 Mar 2018 23:39:03 -0500 Subject: [PATCH 406/473] Update 018._4sum.md --- 018._4sum.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/018._4sum.md b/018._4sum.md index 10a3c4dff..063dada92 100644 --- a/018._4sum.md +++ b/018._4sum.md @@ -1,4 +1,4 @@ -###18. 4Sum +### 18. 4Sum 题目: @@ -91,4 +91,4 @@ class Solution(object): 参考 - \ No newline at end of file + From fed01d91fabbf6c9e83ed7a4afcbd1747d69a327 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 24 Mar 2018 23:51:42 -0500 Subject: [PATCH 407/473] Update 018._4sum.md --- 018._4sum.md | 54 ++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/018._4sum.md b/018._4sum.md index 063dada92..2b8488ec1 100644 --- a/018._4sum.md +++ b/018._4sum.md @@ -16,7 +16,7 @@ Medium 固定两个数,活动别的 -``` +```python class Solution(object): def fourSum(self, nums, target): """ @@ -26,14 +26,13 @@ class Solution(object): """ n = len(nums) nums.sort() - ans = [] + res = [] for i in range(n): for j in range(i+1,n): l, r = j+1, n-1 while l < r: temp = nums[i] + nums[j] + nums[l] + nums[r] if temp == target: - # print nums[i],nums[j],nums[l],nums[r] if [nums[i],nums[j],nums[l],nums[r]] not in ans: ans.append([nums[i],nums[j],nums[l],nums[r]]) l += 1 @@ -45,10 +44,10 @@ class Solution(object): return ans ``` -然后这里如果要continue则要这么写 +可以通过加判断条件,前后数字相等可以直接跳过,使得算法更快 -``` +```python class Solution(object): def fourSum(self, nums, target): """ @@ -56,33 +55,34 @@ class Solution(object): :type target: int :rtype: List[List[int]] """ - n = len(nums) + n, res = len(nums), [] nums.sort() - ans = [] for i in range(n): - if i > 0 and nums[i] == nums[i-1]: continue - for j in range(i+1,n): - if j > i+1 and nums[j] == nums[j-1]: continue - l, r = j+1, n-1 - while l < r: - temp = nums[i] + nums[j] + nums[l] + nums[r] - if temp == target: - # print nums[i],nums[j],nums[l],nums[r] - # if [nums[i],nums[j],nums[l],nums[r]] not in ans: - ans.append([nums[i],nums[j],nums[l],nums[r]]) - l += 1 - r -= 1 - while l < r and nums[l] == nums[l-1]: l += 1 - while l < r and nums[r] == nums[r+1]: r -= 1 - elif temp > target: - r -= 1 - else: - l+=1 - return ans + if i > 0 and nums[i] == nums[i-1]: # 因为i=0这个元素会直接往下执行 + continue + for j in range(i+1, n): + if j > i+1 and nums[j] == nums[j-1]: # 因为j=i+1这个元素会直接往下执行 + continue + l, r = j+1, n-1 + while l < r: + tmp = nums[i] + nums[j] + nums[l] + nums[r] + if tmp == target: + res.append([nums[i], nums[j], nums[l], nums[r]]) + l += 1 + r -= 1 + while l < r and nums[l] == nums[l-1]: + l += 1 + while l < r and nums[r] == nums[r+1]: + r -= 1 + elif tmp > target: + r -= 1 + else: + l += 1 + return res ``` -可以用一些判断来加速,比如枚举第一个数的时候 +还可以再用一些判断来加速,比如枚举第一个数的时候 - nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target: break 这是当前能凑齐的最小的4个数,比target后面都不用做了 From fd9ddb8e412a90be8fec1573b41655986d05b4d8 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 24 Mar 2018 23:56:04 -0500 Subject: [PATCH 408/473] Update 018._4sum.md --- 018._4sum.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/018._4sum.md b/018._4sum.md index 2b8488ec1..ba6862056 100644 --- a/018._4sum.md +++ b/018._4sum.md @@ -92,3 +92,45 @@ class Solution(object): 参考 + + +```python +class Solution(object): + def fourSum(self, nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: List[List[int]] + """ + n, res = len(nums), [] + nums.sort() + for i in range(n): + if i > 0 and nums[i] == nums[i-1]: # 因为i=0这个元素会直接往下执行 + continue + if i+3 <= n-1: + if nums[i] + nums[i+1] + nums[i+2] + nums[i+3] > target: + break + if i < n-3: + if nums[i] + nums[n-3] + nums[n-2] + nums[n-1] < target: + continue + for j in range(i+1, n): + if j > i+1 and nums[j] == nums[j-1]: # 因为j=i+1这个元素会直接往下执行 + continue + l, r = j+1, n-1 + while l < r: + tmp = nums[i] + nums[j] + nums[l] + nums[r] + if tmp == target: + res.append([nums[i], nums[j], nums[l], nums[r]]) + l += 1 + r -= 1 + while l < r and nums[l] == nums[l-1]: + l += 1 + while l < r and nums[r] == nums[r+1]: + r -= 1 + elif tmp > target: + r -= 1 + else: + l += 1 + return res + +``` From e1e091c05fe3a467239a475589f4e4fb15aa2694 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sun, 25 Mar 2018 00:05:16 -0500 Subject: [PATCH 409/473] Update 015._3sum.md --- 015._3sum.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/015._3sum.md b/015._3sum.md index 72a73cb31..9f962f9e2 100644 --- a/015._3sum.md +++ b/015._3sum.md @@ -1,4 +1,4 @@ -###15. 3Sum +### 15. 3Sum 题目: From edad408d453c3f0477922747da685803f7f20bfa Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Tue, 27 Mar 2018 14:31:19 -0500 Subject: [PATCH 410/473] Update 055._jump_game.md --- 055._jump_game.md | 58 ++++++++++++----------------------------------- 1 file changed, 15 insertions(+), 43 deletions(-) diff --git a/055._jump_game.md b/055._jump_game.md index fe68b059c..1de4f1d02 100644 --- a/055._jump_game.md +++ b/055._jump_game.md @@ -1,4 +1,4 @@ -###55. Jump Game +### 55. Jump Game 题目: @@ -8,60 +8,32 @@ Medium -dp - 问题出现在一旦有0,而且这个0是不可跨过的那么无解,无法达到 -貌似对于dp[i] <= i,就无法达到,不能成立 -尝试一: +看了hint,根本不用这个数组,直接用一个数来记录可达最远距离,非常巧妙 -超时 -``` +```python class Solution(object): def canJump(self, nums): """ :type nums: List[int] :rtype: bool """ - if len(nums) < 2: return True - - far = [0 for i in range(len(nums))] - far[0] = nums[0] - - for i in range(len(nums)-1): - for j in range(i): - if far[j] > far[i]: - far[i] = far[j] - far[i] = max(far[i],i+nums[i]) - if far[i] <= i: - return False - return True -``` - -尝试二,看了hint,根本不用这个数组,直接用一个数来记录可达最远距离,非常巧妙 - - -``` -class Solution(object): - def canJump(self, nums): - """ - :type nums: List[int] - :rtype: bool - """ - i = 0 - reach = 0 - - # i > reach also means terminate it can not really reach - while i < len(nums) and i <= reach: - reach = max(i+nums[i],reach) - i += 1 - - return reach >= len(nums) -1 + if not nums: + return True + if len(nums) == 1: + return True + n = len(nums) + idx, reach = 0, 0 + while idx < n-1 and idx <= reach: # idx <= reach是为了处理nums[idx] == 0的情况,若idx>reach说明已经失败了 + reach = max(reach, idx+nums[idx]) + idx += 1 + return reach >= n-1 ``` -i记录当前loop位置,reach记录当前可到位置 +idx记录当前loop位置,reach记录当前可到位置 -注意这里的while循环的条件是 `i < len(nums) and i <= reach`,之所以加上 `i <= reach` 是因为如果reach < i说明i层不可达,其实也可以直接terminate.也就是我一开始写的dp[i] <= i会导致依旧不可达。 \ No newline at end of file +注意这里的while循环的条件是 `idx < n-1 and idx <= reach`,之所以加上 `idx <= reach` 是因为如果```idx > reach```说明```idx```层不可达,其实也可以直接terminate. From 18a4e0c1adf55adce6ac444b293a04dd8a4a3792 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Tue, 27 Mar 2018 14:43:22 -0500 Subject: [PATCH 411/473] Create 258_ Add_Digits.md --- 258_ Add_Digits.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 258_ Add_Digits.md diff --git a/258_ Add_Digits.md b/258_ Add_Digits.md new file mode 100644 index 000000000..2fa72406a --- /dev/null +++ b/258_ Add_Digits.md @@ -0,0 +1,34 @@ +### 258. Add Digits + +题目: + + + +难度: + +Easy + + +思路 + +这就简单的一p了。。 + + +```python +class Solution(object): + def addDigits(self, num): + """ + :type num: int + :rtype: int + """ + while num / 10 >= 1: + tmp = 0 + while num / 10 >= 1: + tmp += num % 10 + num /= 10 + tmp += num % 10 + num = tmp + return num +``` + + From 2f47964ef4cff15a1d3a76bde3c1da28285c795b Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Tue, 27 Mar 2018 17:37:48 -0500 Subject: [PATCH 412/473] Create 045._Jump_Game_II.md --- 045._Jump_Game_II.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 045._Jump_Game_II.md diff --git a/045._Jump_Game_II.md b/045._Jump_Game_II.md new file mode 100644 index 000000000..c54bfb9de --- /dev/null +++ b/045._Jump_Game_II.md @@ -0,0 +1,43 @@ +### 45. Jump Game II + +题目: + + + +难度: + +Easy + + +思路 + +# greedy solution, the current jump is ```[i, cur_end]```, and the ```cur_farthest``` is the farthest point +# that all of point in ```[i, cur_end]``` can reach, whenever ```cur_farthest``` is larger than the last point' index, +# return current ```jump+1```; whenever ```i``` reaches ```cur_end```, update ```cur_end``` to ```current cur_farthest```. +# Time: O(log(n)) +# Space: O(1) + +```python +class Solution(object): + def jump(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + # Note You can assume that you can always reach the last index. + cur_end, cur_farthest, step, n = 0, 0, 0, len(nums) + for i in range(n-1): + cur_farthest = max(cur_farthest, i + nums[i]) + if cur_farthest >= n - 1: + step += 1 + break + if i == cur_end: + cur_end = cur_farthest + step += 1 + return step + + + +``` + + From 584707f3e14e60ca00fd83d485ea781558d74828 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Tue, 27 Mar 2018 17:38:28 -0500 Subject: [PATCH 413/473] Update 045._Jump_Game_II.md --- 045._Jump_Game_II.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/045._Jump_Game_II.md b/045._Jump_Game_II.md index c54bfb9de..ae8caf9a1 100644 --- a/045._Jump_Game_II.md +++ b/045._Jump_Game_II.md @@ -11,11 +11,11 @@ Easy 思路 -# greedy solution, the current jump is ```[i, cur_end]```, and the ```cur_farthest``` is the farthest point -# that all of point in ```[i, cur_end]``` can reach, whenever ```cur_farthest``` is larger than the last point' index, -# return current ```jump+1```; whenever ```i``` reaches ```cur_end```, update ```cur_end``` to ```current cur_farthest```. -# Time: O(log(n)) -# Space: O(1) +greedy solution, the current jump is ```[i, cur_end]```, and the ```cur_farthest``` is the farthest point +that all of point in ```[i, cur_end]``` can reach, whenever ```cur_farthest``` is larger than the last point' index, +return current ```jump+1```; whenever ```i``` reaches ```cur_end```, update ```cur_end``` to ```current cur_farthest```. +- Time: O(log(n)) +- Space: O(1) ```python class Solution(object): From 53b423740977d7ac3688a94adad2907b40f50ce8 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Wed, 28 Mar 2018 22:02:26 -0500 Subject: [PATCH 414/473] Update 051._n-queens.md --- 051._n-queens.md | 56 ++++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/051._n-queens.md b/051._n-queens.md index 960ce32d5..3e7c197c3 100644 --- a/051._n-queens.md +++ b/051._n-queens.md @@ -1,4 +1,4 @@ -###51. N-Queens +### 51. N-Queens 题目: @@ -7,42 +7,32 @@ 难度: Hard -偷懒,用52, 依旧需要挖掘 +八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n = 1或n ≥ 4时问题有解[1]。 -``` +对于任意(x,y),如果要让新的点和它不能处于同一条横行、纵行或斜线上,则新点(p,q)必须要满足p+q != x+y 和p-q!= x-y, 前者针对左下右上斜线,后者针对左上右下斜线,两者同时都保证了不在同一条横行和纵行上。 + +代码中变量的含义: +- col_per_row: 每一行皇后的column位置组成的列表 +- cur_row:目前正在判断的row的index +- xy_diff:所有x-y组成的列表 +- xy_sum:所有x+y组成的列表 + +```python class Solution(object): def solveNQueens(self, n): """ :type n: int :rtype: List[List[str]] """ - self.board = [] - self.res = [] - self.placequeen(0,n) - return self.res - - def danger(self, board ,row, col): - for (i, j) in board: - if row == i: return True - if col == j: return True - if abs(row - i) == abs(col - j): return True - - return False - - - def placequeen(self, row, n): - if row >= n: - tmpRes = [['.' for i in range(n)] for j in range(n)] - for (row,col) in self.board: - tmpRes[row][col] = 'Q' - tmpRes = [''.join(i) for i in tmpRes] - self.res.append(tmpRes) - - else: - for col in range(0, n): - if not self.danger(self.board, row, col): - self.board.append((row, col)) - self.placequeen(row + 1, n) - self.board.remove((row,col)) - -``` \ No newline at end of file + def dfs(col_per_row, xy_diff, xy_sum): + cur_row = len(col_per_row) + if cur_row == n: + ress.append(col_per_row) + for col in range(n): + if col not in col_per_row and cur_row-col not in xy_diff and cur_row+col not in xy_sum: + dfs(col_per_row+[col], xy_diff+[cur_row-col], xy_sum+[cur_row+col]) + ress = [] + dfs([], [], []) + return [['.'*i + 'Q' + '.'*(n-i-1) for i in res] for res in ress] + +``` From 8f75cf7a665062ba64c31929113a7065c7376bb2 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Wed, 28 Mar 2018 22:07:09 -0500 Subject: [PATCH 415/473] Update 052._n-queens_ii.md --- 052._n-queens_ii.md | 46 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/052._n-queens_ii.md b/052._n-queens_ii.md index 07d153553..1d65adc16 100644 --- a/052._n-queens_ii.md +++ b/052._n-queens_ii.md @@ -1,4 +1,4 @@ -###52. N-Queens II +### 52. N-Queens II 题目: @@ -11,40 +11,34 @@ Hard n queens还是属于比较难的,需要花时间吃透的问题 +八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n = 1或n ≥ 4时问题有解[1]。 -``` +对于任意(x,y),如果要让新的点和它不能处于同一条横行、纵行或斜线上,则新点(p,q)必须要满足p+q != x+y 和p-q!= x-y, 前者针对左下右上斜线,后者针对左上右下斜线,两者同时都保证了不在同一条横行和纵行上。 +代码中变量的含义: +- col_per_row: 每一行皇后的column位置组成的列表 +- cur_row:目前正在判断的row的index +- xy_diff:所有x-y组成的列表 +- xy_sum:所有x+y组成的列表 +```python class Solution(object): def totalNQueens(self, n): """ :type n: int :rtype: int """ - self.board = [] - self.cnt = 0 - self.placequeen(0,n) - return self.cnt - - def danger(self, board ,row, col): - for (i, j) in board: - if row == i: return True - if col == j: return True - if abs(row - i) == abs(col - j): return True - - return False - - - def placequeen(self, row, n): - if row >= n: - #print self.board - self.cnt +=1 - else: - for col in range(0, n): - if not self.danger(self.board, row, col): - self.board.append((row, col)) - self.placequeen(row + 1, n) - self.board.remove((row,col)) + def dfs(col_per_row, xy_diff, xy_sum): + cur_row = len(col_per_row) + if cur_row == n: + ress.append(col_per_row) + for col in range(n): + if col not in col_per_row and cur_row-col not in xy_diff and cur_row+col not in xy_sum: + dfs(col_per_row+[col], xy_diff+[cur_row-col], xy_sum+[cur_row+col]) + ress = [] + dfs([], [], []) + return len(ress) + ``` From b4c5263db42d57383ec92a99852c4cacc052880d Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Thu, 29 Mar 2018 02:20:43 -0500 Subject: [PATCH 416/473] =?UTF-8?q?Update=20Python=E5=88=B7=E9=A2=98?= =?UTF-8?q?=E6=8A=80=E5=B7=A7=E7=AC=94=E8=AE=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\267\247\347\254\224\350\256\260.md" | 262 +++++------------- 1 file changed, 63 insertions(+), 199 deletions(-) diff --git "a/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.md" "b/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.md" index 9287535cb..b0a0a8b93 100644 --- "a/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.md" +++ "b/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.md" @@ -1,227 +1,91 @@ -### Python刷题技巧笔记 +# python有无数奇技淫巧和许多人不知道的秘密,这里用简洁的语言一条条表述出来,不断更新, 大家一起贡献! -备份自己的帖子 +# 1. python 排序 +# 用lst.sort() 而不是nlst = sorted(lst), 区别在于lst.sort()是 in-place sort,改变lst, sorted会创建新list,成本比较高。 -有的时候 - - -**用Python解题经常可以作弊,Python 处理string非常方便, python内置模块非常多,比如排列组合啥的各种....** - - -有的时候 - - -**Python大法好,就是偶尔慢** - - - - -Python也是可以追求运行速度的,除了算法方面的提升,也有些常见函数之间的区别 - - -还有我刷的Python 2 和 3 已经迷茫了,如果有说错的地方敬请指出 - - - - -===========初级技巧================= - - - - --  排序 - - -用lst.sort() 而不是nlst = sorted(lst) - - -区别在于lst.sort()是 in-place sort,改变lst, sorted会创建新list,成本比较高。 - - - - -- 用xrange  - - -xrangge 和 range的区别是在于 range会产生list存在memory中,xrange更像是生成器,generate on demand - - -所以有的时候xrange会更快 - - --  三目运算符 - - -python 的三目运算符是这么写的 x if y else z - - -考虑这种list of list: matrix = [ [1,2,3] , [4,5,6] ] - - -```row  = len(matrix)```, -```col = len(matrix[0]) if row else 0 ``` - - -这样写通用的原因是, 当matrix = [], row = 0, col =0 - - -- list 填 0 +# 2. xrange和range的区别 +# range会产生list存在memory中,xrange更像是生成器,generate on demand所以有的时候xrange会更快 +# 3. python处理矩阵 +row  = len(matrix) +col = len(matrix[0]) if row else 0  +# 这样写通用的原因是, 当matrix = [], row = 0, col =0 +# 4. python列表生成式 lst = [0 for i in range(3)] # lst = [0,0,0] - - lst  = [[0 for i in range(3)] for j in range(2)]  # lst =  [[0, 0, 0], [0, 0, 0]] - - - - -下面这种写法危险: - - -lst1 = [ 0, 0, 0 ] -lst2  = [lst1] * 2  # lst2 = [ [0,0,0] , [0,0,0] ] -lst2\[0]\[0] = 1  # lst2 = [ [1,0,0], [1,0,0]] - - -因为lst1是object,这样写会踩坑 - - - - -- D.get(key, default) - - -如果这个key 没有在dict里面,给它一个默认值: - - +# 下面这种写法危险: +# lst1 = [ 0, 0, 0 ] +# lst2  = [lst1] * 2  # lst2 = [ [0,0,0] , [0,0,0] ] +# lst2[0][0] = 1  # lst2 = [ [1,0,0], [1,0,0]] +# 因为lst1是object,改一个相当于全改, 这样写会踩坑 + +# 5. D.get(key, default) +# 如果这个key 没有在dict里面,给它一个默认值: D = {} if 1 in D:   val = D[1] else :   val = 0 - - -等同于这样写: - - +# 等同于这样写: val = D.get(1, 0) - - - -- reverse list - - -lst = [1,2,3] - - -print lst[::-1] #[3,2,1] - - -lst 也有reverse函数 - - -这也也适用于str, str可是没有reverse 函数的,str[::-1] 可用 √ - - - - -=================进阶一下===================== - - -Python 也是有自己的数据结构的!!!! - - -- deque -   还在用list来做queue么? deque,当求快queue的时候,你值得拥有 - - -- Counter -   Counter做啥就顾名思义了 - - -- yield -   用yield不用return ( 我也还在学习阶段 - - - - - - - - -import collections就可以用了,参见  [collections — High-performance container datatypes](https://docs.python.org/2/library/collections.html) - - - - - - -===============举个当时我就震惊了的例子=============== - - - - -看到在stackoverflow上看到有人求这样一个数据结构: - - -[Anyone know this Python data structure?](http://stackoverflow.com/questions/4098179/anyone-know-this-python-data-structure) - - - - - -Close to **O(1) performance** for as many of the following four operations. -Maintaining **sorted order while inserting** an object into the container. -Ability to **peek at last value** (the largest value) contained in the object. -Allowing for **pops on both sides** (getting the smallest or largest values). -Capability of **getting the total size** or number of objects being stored. -Being a **ready made solution** like the code in Python's standard library. - - - - - -然后真的可以implement出来 - +# 6. 字典赋值 +if key in D: +  D[key].append(1) +else : +  D[key] = [] + +# 7. 字符串反转 +# python字符串没有reverse函数,只能str[::-1] +string[::-1] +# python的list可以直接reverse(),因此也可以借用这个特性 +"".join([string].reverse()) + +# 8. 快速统计 import collections -import bisect - -class FastTable: - -    def __init__(self): -        self.__deque = collections.deque() - -    def __len__(self): -        return len(self.__deque) - -    def head(self): -        return self.__deque.popleft() +lst = [1, 1, 1, 2, 3, 4, 5, 5] +collections.Counter(lst) # Counter({1: 3, 5: 2, 2: 1, 3: 1, 4: 1}) -    def tail(self): -        return self.__deque.pop() +# 9. python自带小顶堆heapq +# Python有built-in heap, 默认min heap. +heapq.heappush(heap, item) # 把item添加到heap中(heap是一个列表) -    def peek(self): -        return self.__deque[-1] +heapq.heappop(heap) # 把堆顶元素弹出,返回的就是堆顶 -    def insert(self, obj): -        index = bisect.bisect_left(self.__deque, obj) -        self.__deque.rotate(-index) -        self.__deque.appendleft(obj) -        self.__deque.rotate(index) +heapq.heappushpop(heap, item) # 先把item加入到堆中,然后再pop,比heappush()再heappop()要快得多 -复制代码 -对此我只想表示牛,并且我硬生生的用它来解过人家不是要这种思路的题目。 +heapq.heapreplace(heap, item) # 先pop,然后再把item加入到堆中,比heappop()再heappush()要快得多 +heapq.heapify(x) # 将列表x进行堆调整,默认的是小顶堆 +heapq.merge(*iterables) # 将多个列表合并,并进行堆调整,返回的是合并后的列表的迭代器 +heapq.nlargest(n, iterable, key=None) # 返回最大的n个元素(Top-K问题) -**补充内容 (2016-10-28 00:40):** -Python有built-inheap,是min heap.  heapq,如何来用它实现max heap呢,看到过一个有意思的方法是把key取负,比如把100变成-100,5变成-5。 +heapq.nsmallest(n, iterable, key=None) # 返回最小的n个元素(Top-K问题) +# 如何来用它实现max heap呢,看到过一个有意思的方法是把key取负,比如把100变成-100,5变成-5 +import heapq +mylist = [1, 2, 3, 4, 5, 10, 9, 8, 7, 6] +largest = heapq.nlargest(3, mylist) # [10, 9, 8] +smallest = heapq.nsmallest(3, mylist) # [1, 2, 3] +# 10. 双端队列deque [http://stackoverflow.com/questions/4098179/anyone-know-this-python-data-structure] +# 可以很简单的.popleft(), .popright(), .appendleft(), .appendright(),最关键的是时间是O(1), 而用list来模拟队列是O(n)的时间复杂度 +# 还有很好用的rotate函数, +# 一个简单的跑马灯程序 +import sys +import time +from collections import deque +fancy_loading = deque('>--------------------') +while True: + print('\r%s' % ''.join(fancy_loading)) + fancy_loading.rotate(1) + sys.stdout.flush() + time.sleep(0.08) +# 11. 用yield 不用return,可以返回一个generator From 7500da04c6f2f05319bc8ae47f55868d89a866cf Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Thu, 29 Mar 2018 02:21:08 -0500 Subject: [PATCH 417/473] =?UTF-8?q?Rename=20Python=E5=88=B7=E9=A2=98?= =?UTF-8?q?=E6=8A=80=E5=B7=A7=E7=AC=94=E8=AE=B0.md=20to=20Python=E5=88=B7?= =?UTF-8?q?=E9=A2=98=E6=8A=80=E5=B7=A7=E7=AC=94=E8=AE=B0.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...51\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.md" => "Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" (100%) diff --git "a/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.md" "b/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" similarity index 100% rename from "Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.md" rename to "Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" From 8692a1b297d4e75dd28a41e07c65ae8f156e981a Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sun, 1 Apr 2018 18:08:18 -0500 Subject: [PATCH 418/473] Update 151._reverse_words_in_a_string.md --- 151._reverse_words_in_a_string.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/151._reverse_words_in_a_string.md b/151._reverse_words_in_a_string.md index fbf3493be..48a966f19 100644 --- a/151._reverse_words_in_a_string.md +++ b/151._reverse_words_in_a_string.md @@ -1,4 +1,4 @@ -###151. Reverse Words in a String +### 151. Reverse Words in a String 题目: @@ -7,19 +7,19 @@ 难度: Medium +太简单了 -这对我Python来说,实在太简单,或许我应该看看别的语言的思路和算法 - -``` - +```python class Solution(object): def reverseWords(self, s): """ :type s: str :rtype: str """ - sList = s.split() - sList.reverse() - return " ".join(sList) + tmp = s.split() + res = " ".join(tmp[::-1]) + # tmp.reverse() + # res = " ".join(tmp) + return res -``` \ No newline at end of file +``` From ef6a7ae908836790723931bc2b04bb9b349e3f32 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sun, 1 Apr 2018 18:09:05 -0500 Subject: [PATCH 419/473] Update 151._reverse_words_in_a_string.md --- 151._reverse_words_in_a_string.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/151._reverse_words_in_a_string.md b/151._reverse_words_in_a_string.md index 48a966f19..10414801b 100644 --- a/151._reverse_words_in_a_string.md +++ b/151._reverse_words_in_a_string.md @@ -18,8 +18,20 @@ class Solution(object): """ tmp = s.split() res = " ".join(tmp[::-1]) - # tmp.reverse() - # res = " ".join(tmp) + return res + +``` + +```python +class Solution(object): + def reverseWords(self, s): + """ + :type s: str + :rtype: str + """ + tmp = s.split() + tmp.reverse() + res = " ".join(tmp) return res ``` From e5c520957568ef575dbb72ec60dcb87673aaae6b Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sun, 1 Apr 2018 18:26:02 -0500 Subject: [PATCH 420/473] Update 206._reverse_linked_list.md --- 206._reverse_linked_list.md | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/206._reverse_linked_list.md b/206._reverse_linked_list.md index b8fb116ae..71aa2c720 100644 --- a/206._reverse_linked_list.md +++ b/206._reverse_linked_list.md @@ -1,4 +1,4 @@ -###206. Reverse Linked List +### 206. Reverse Linked List 题目: @@ -12,7 +12,7 @@ Easy -``` +```python class Solution(object): def reverseList(self, head): """ @@ -33,20 +33,18 @@ class Solution(object): 递归版本,可以再消化一下. -``` +```python class Solution(object): def reverseList(self, head): """ :type head: ListNode :rtype: ListNode """ - return self.doReverse(head, None) - - - def doReverse(self, head, newHead): - if head == None: - return newHead + return self.reverseHelper(head, None) + + def reverseHelper(self, head, new_head): + if not head: + return new_head nxt = head.next - head.next = newHead - return self.doReverse(nxt, head) -``` \ No newline at end of file + head.next = new_head + return self.reverseHelper(nxt, head)``` From 8ab525f917ed4004daf37486387fc0bbe3aa6e23 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sun, 1 Apr 2018 18:26:22 -0500 Subject: [PATCH 421/473] Update 206._reverse_linked_list.md --- 206._reverse_linked_list.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/206._reverse_linked_list.md b/206._reverse_linked_list.md index 71aa2c720..485a55e05 100644 --- a/206._reverse_linked_list.md +++ b/206._reverse_linked_list.md @@ -47,4 +47,5 @@ class Solution(object): return new_head nxt = head.next head.next = new_head - return self.reverseHelper(nxt, head)``` + return self.reverseHelper(nxt, head) +``` From 2beef72201ecd552ebeae6cc40b2820b7cb365bf Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Wed, 4 Apr 2018 17:50:20 -0500 Subject: [PATCH 422/473] Update 127._word_ladder.md --- 127._word_ladder.md | 83 +++++++++++---------------------------------- 1 file changed, 20 insertions(+), 63 deletions(-) diff --git a/127._word_ladder.md b/127._word_ladder.md index e602a0847..e0a23bb10 100644 --- a/127._word_ladder.md +++ b/127._word_ladder.md @@ -1,4 +1,4 @@ -###127. Word Ladder +### 127. Word Ladder 题目: @@ -10,76 +10,33 @@ Medium tag可以算BFS,其实就是求shortest path的变体 +reference from [kamyu104](https://github.com/kamyu104/LeetCode/blob/71e0ba555ee49befa01fcd9fc78c3528e2ab63a9/Python/word-ladder.py) -按照BFS的微码改了一下,尝试AC,超时 - -``` +```python class Solution(object): def ladderLength(self, beginWord, endWord, wordList): """ :type beginWord: str :type endWord: str - :type wordList: Set[str] + :type wordList: List[str] :rtype: int """ - queue = [(beginWord, [beginWord])] - visited = set() + distance, cur, visited, lookup = 0, [beginWord], set([beginWord]), set(wordList) + + while cur: + next_queue = [] + + for word in cur: + if word == endWord: + return distance + 1 + for i in xrange(len(word)): + for j in 'abcdefghijklmnopqrstuvwxyz': + candidate = word[:i] + j + word[i + 1:] + if candidate not in visited and candidate in lookup: + next_queue.append(candidate) + visited.add(candidate) + distance += 1 + cur = next_queue - while queue: - (vertex, path) = queue.pop(0) - if vertex not in visited: - if self.oneDiff(vertex, endWord): - return len(path) + 1 - visited.add(vertex) - for word in wordList: - if self.oneDiff(vertex, word): - queue.append((word, path + [word])) return 0 - - def oneDiff(self,s1, s2): - countDiffs = 0 - for a, b in zip(s1,s2): - if a != b: - countDiffs += 1 - return countDiffs == 1 ``` - -着手优化 - - -实在发现优化基本无所提升,然后看别人的解法,思路一致,但是用了collection里面的结构deque和增加set帮助解题。 - -collection有待研究 - -``` -class Solution(object): - def ladderLength(self, beginWord, endWord, wordList): - """ - :type beginWord: str - :type endWord: str - :type wordList: Set[str] - :rtype: int - """ - from collections import deque, defaultdict - - queue = deque([(beginWord, [beginWord])]) - visited = set() - wordSet = set(wordList) - wordSet.add(endWord) - - while queue: - (vertex, path) = queue.popleft() - if vertex not in visited: - if vertex == endWord: - return len(path) - visited.add(vertex) - for i in range(len(beginWord)): - part1 = vertex[:i]; part2 = vertex[i+1:] - for j in 'abcdefghijklmnopqrstuvwxyz': - if vertex[i] != j: - nextWord = part1 + j + part2 - if nextWord in wordSet: - queue.append((nextWord, path + [nextWord])) - wordSet.remove(nextWord) - return 0 -``` \ No newline at end of file From 3be77ec7f2c76f3e5d92b7de588ee2b1654a606b Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Wed, 4 Apr 2018 17:50:33 -0500 Subject: [PATCH 423/473] Update 127._word_ladder.md --- 127._word_ladder.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/127._word_ladder.md b/127._word_ladder.md index e0a23bb10..42a14a7af 100644 --- a/127._word_ladder.md +++ b/127._word_ladder.md @@ -10,7 +10,8 @@ Medium tag可以算BFS,其实就是求shortest path的变体 -reference from [kamyu104](https://github.com/kamyu104/LeetCode/blob/71e0ba555ee49befa01fcd9fc78c3528e2ab63a9/Python/word-ladder.py) + +Reference from [kamyu104](https://github.com/kamyu104/LeetCode/blob/71e0ba555ee49befa01fcd9fc78c3528e2ab63a9/Python/word-ladder.py) ```python class Solution(object): From 5a7f8fb394c24fde6d126a31edbe688ffef5028c Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Wed, 4 Apr 2018 18:50:46 -0500 Subject: [PATCH 424/473] Update Readme.md --- Readme.md | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/Readme.md b/Readme.md index 18ccfc183..851306b5d 100644 --- a/Readme.md +++ b/Readme.md @@ -1,10 +1,27 @@ -### Appreciation +### Reference and Appreciation: + +[kamyu104的Github](https://github.com/kamyu104/LeetCode) + +[KrisYu的GItuhub](https://github.com/KrisYu/LeetCode-CLRS-Python) + +[数据结构与算法/leetcode/lintcode题解](https://algorithm.yuanbin.me/zh-hans/) + +[Leetcode 讨论区](https://discuss.leetcode.com/) + +[visualgo算法可视化网站](https://visualgo.net/en) + +[Data Structure Visualization](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) + +[我的算法学习之路 - Lucida](http://zh.lucida.me/blog/on-learning-algorithms/) + +[HiredInTech](https://www.hiredintech.com/) System Design 的总结特别适合入门 + +[mitcc的Github](https://github.com/mitcc/AlgoSolutions) + + -This repository is modified and added based on https://github.com/KrisYu/LeetCode-CLRS-Python, appreciate for his effort. -### LeetCode × Python × CLRS -Finally, going to take LeetCode, Python can make you focus on the ideas, while CLRS is really kind of tedious, so whenever you finished some reading, you just, just would feel so happy that you can do LeetCode. - 📚📖✏️📓 From 0a4466533593b2d1eab8aa8cf2eb56dca0773c3c Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Wed, 4 Apr 2018 18:52:15 -0500 Subject: [PATCH 425/473] Update Readme.md --- Readme.md | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/Readme.md b/Readme.md index 851306b5d..48469aef4 100644 --- a/Readme.md +++ b/Readme.md @@ -1,22 +1,22 @@ ### Reference and Appreciation: -[kamyu104的Github](https://github.com/kamyu104/LeetCode) +1. [kamyu104的Github](https://github.com/kamyu104/LeetCode) -[KrisYu的GItuhub](https://github.com/KrisYu/LeetCode-CLRS-Python) +2. [KrisYu的GItuhub](https://github.com/KrisYu/LeetCode-CLRS-Python) -[数据结构与算法/leetcode/lintcode题解](https://algorithm.yuanbin.me/zh-hans/) +3. [数据结构与算法/leetcode/lintcode题解](https://algorithm.yuanbin.me/zh-hans/) -[Leetcode 讨论区](https://discuss.leetcode.com/) +4. [Leetcode 讨论区](https://discuss.leetcode.com/) -[visualgo算法可视化网站](https://visualgo.net/en) +5. [visualgo算法可视化网站](https://visualgo.net/en) -[Data Structure Visualization](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) +6. [Data Structure Visualization](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) -[我的算法学习之路 - Lucida](http://zh.lucida.me/blog/on-learning-algorithms/) +7. [我的算法学习之路 - Lucida](http://zh.lucida.me/blog/on-learning-algorithms/) -[HiredInTech](https://www.hiredintech.com/) System Design 的总结特别适合入门 +8. [HiredInTech](https://www.hiredintech.com/) System Design 的总结特别适合入门 -[mitcc的Github](https://github.com/mitcc/AlgoSolutions) +9. [mitcc的Github](https://github.com/mitcc/AlgoSolutions) @@ -24,10 +24,8 @@ - - 📚📖✏️📓 - - 🍔🍝🍛🍣 - - 😕😐😮😏 - - 🙌👎👍💪 + + - 💪就是干! From 460517629ad764bd5ea7f9698a2d789e956c3850 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Wed, 4 Apr 2018 20:14:22 -0500 Subject: [PATCH 426/473] Update Readme.md --- Readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Readme.md b/Readme.md index 48469aef4..a2aa4fa2b 100644 --- a/Readme.md +++ b/Readme.md @@ -18,6 +18,8 @@ 9. [mitcc的Github](https://github.com/mitcc/AlgoSolutions) +10. [小土刀的面试刷题笔记](http://wdxtub.com/interview/14520594642530.html) + From e1b03bb865c8dbcb07414bac75c5fc1d409620bf Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Thu, 5 Apr 2018 00:03:56 -0500 Subject: [PATCH 427/473] Update Readme.md --- Readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Readme.md b/Readme.md index a2aa4fa2b..ea453be99 100644 --- a/Readme.md +++ b/Readme.md @@ -1,8 +1,8 @@ ### Reference and Appreciation: -1. [kamyu104的Github](https://github.com/kamyu104/LeetCode) +1. [KrisYu的GItuhub](https://github.com/KrisYu/LeetCode-CLRS-Python) -2. [KrisYu的GItuhub](https://github.com/KrisYu/LeetCode-CLRS-Python) +2. [kamyu104的Github](https://github.com/kamyu104/LeetCode) 3. [数据结构与算法/leetcode/lintcode题解](https://algorithm.yuanbin.me/zh-hans/) From e880a52a941affc9eab41b373adc9fcb81e9c07c Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Thu, 5 Apr 2018 14:10:55 +0800 Subject: [PATCH 428/473] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E7=89=88=E6=9C=AC-=E4=BC=98=E5=8C=96=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E6=8E=92=E7=89=88=E5=92=8C=E7=9B=AE=E5=BD=95=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "001._clone\346\234\200\346\226\260" | 1 - Readme.md | 315 +++++++++++++++++- 001._two_sum.md => docs/001._two_sum.md | 0 .../002._add_two_numbers.md | 0 ..._substring_without_repeating_characters.md | 0 .../004._median_of_two_sorted_arrays.md | 0 .../005._longest_palindromic_substring.md | 0 .../007._Reverse_Integer.md | 0 .../008._string_to_integer_(atoi).md | 0 .../010._regular_expression_matching.md | 0 .../011._container_with_most_water.md | 0 .../012._Integer_to_Roman.md | 0 .../013._Roman_to_Integer.md | 0 .../014._longest_common_prefix.md | 0 015._3sum.md => docs/015._3sum.md | 0 .../016._3sum_closest.md | 0 ...._letter_combinations_of_a_phone_number.md | 0 018._4sum.md => docs/018._4sum.md | 0 .../019._remove_nth_node_from_end_of_list.md | 0 .../020._valid_parentheses.md | 0 .../021._merge_two_sorted_lists.md | 0 .../022._generate_parentheses.md | 0 .../023._merge_k_sorted_lists.md | 0 .../024._swap_nodes_in_pairs.md | 0 ...26._Remove_Duplicates_from_Sorted_Array.md | 0 .../027._Remove_Element.md | 0 .../028._implement_strstr().md | 0 ...bstring_with_Concatenation_of_All_Words.md | 0 .../031._next_permutation.md | 0 .../033._search_in_rotated_sorted_array.md | 0 .../034._Search for a Range.md | 0 .../035._search_insert_position.md | 0 .../038._Count_and_Say.md | 0 .../039._combination_sum.md | 0 .../040._combination_sum_ii.md | 0 .../042._trapping_rain_water.md | 0 .../043._multiply_strings.md | 0 .../044._wildcard_matching.md | 0 .../045._Jump_Game_II.md | 0 .../046._permutations.md | 0 .../047._permutations_ii.md | 0 .../048._rotate_image.md | 0 .../049._group_anagrams_python.md | 0 050._pow(x,_n).md => docs/050._pow(x,_n).md | 0 051._n-queens.md => docs/051._n-queens.md | 0 .../052._n-queens_ii.md | 0 .../053._maximum_subarray.md | 0 .../054._spiral_matrix.md | 0 055._jump_game.md => docs/055._jump_game.md | 0 .../056._Merge_Intervals.md | 0 .../058._length_of_last_word.md | 0 .../059._spiral_matrix_ii.md | 0 .../060._permutation_sequence.md | 0 .../061._rotate_list.md | 0 .../064._minimum_path_sum.md | 0 .../065.unique_paths_ii.md | 0 066._plus_one.md => docs/066._plus_one.md | 0 067._add_binary.md => docs/067._add_binary.md | 0 069._sqrt(x).md => docs/069._sqrt(x).md | 0 .../070. Climbing Stairs.md | 0 .../072._edit_distance.md | 0 .../073. Set Matrix Zeroes.md | 0 .../074._search_a_2d_matrix.md | 0 .../075._sort_colors.md | 0 .../076._Minimum_Window_Substring.md | 0 .../077._combinations.md | 0 078.Subsets .md => docs/078.Subsets .md | 0 .../079._word_search.md | 0 ...._remove_duplicates_from_sorted_list_ii.md | 0 ...083._remove_duplicates_from_sorted_list.md | 0 .../086._partition_list.md | 0 .../088._merge_sorted_array.md | 0 089._gray_code.md => docs/089._gray_code.md | 0 090._subsets_ii.md => docs/090._subsets_ii.md | 0 .../091._decode_ways.md | 0 .../092._reverse_linked_list_ii.md | 0 .../093._restore_ip_addresses.md | 0 .../094._binary_tree_inorder_traversal.md | 0 .../096._unique_binary_search_trees.md | 0 .../098._validate_binary_search_tree.md | 0 100._same_tree.md => docs/100._same_tree.md | 0 .../101._symmetric_tree.md | 0 .../102._binary_tree_level_order_traversal.md | 0 ...inary_tree_zigzag_level_order_traversal.md | 0 .../104._maximum_depth_of_binary_tree.md | 0 ...ree_from_preorder_and_inorder_traversal.md | 0 ...ee_from_inorder_and_postorder_traversal.md | 0 ...7._binary_tree_level_order_traversal_ii.md | 0 ...vert_sorted_array_to_binary_search_tree.md | 0 ...nvert_sorted_list_to_binary_search_tree.md | 0 .../110._balanced_binary_tree.md | 0 .../111._minimum_depth_of_binary_tree.md | 0 112._path_sum.md => docs/112._path_sum.md | 0 .../113._path_sum_ii.md | 0 ...114._flatten_binary_tree_to_linked_list.md | 0 ...lating_next_right_pointers_in_each_node.md | 0 .../118._pascal's_triangle.md | 0 .../119. Pascal's Triangle II.md | 0 120. Triangle.md => docs/120. Triangle.md | 0 .../121._Best_Time_to_Buy_and_Sell_Stock.md | 0 .../125._valid_palindrome.md | 0 .../126. Word Ladder II.md | 0 .../127._word_ladder.md | 0 .../128._Longest_Consecutive_Sequence.md | 0 .../129._sum_root_to_leaf_numbers.md | 0 .../130._surrounded_regions.md | 0 .../131._palindrome_partitioning.md | 0 .../133._clone_graph.md | 0 .../136._single_number.md | 0 139._word_break.md => docs/139._word_break.md | 0 .../140._word_break_ii.md | 0 .../141._linked_list_cycle.md | 0 .../142_Linked_List_Cycle_II.md | 0 .../143._reorder_list.md | 0 .../144._binary_tree_preorder_traversal.md | 0 .../145._binary_tree_postorder_traversal.md | 0 .../147._insertion_sort_list.md | 0 148._sort_list.md => docs/148._sort_list.md | 0 .../150._evaluate_reverse_polish_notation.md | 0 .../151._reverse_words_in_a_string.md | 0 .../152._maximum_product_subarray.md | 0 ...3._find_minimum_in_rotated_sorted_array.md | 0 155._min_stack.md => docs/155._min_stack.md | 0 ...ng_with_At_Most_Two_Distinct_Characters.md | 0 .../160._intersection_of_two_linked_lists.md | 0 .../162._find_peak_element.md | 0 .../165._compare_version_numbers.md | 0 .../166._Fraction_to_Recurring_Decimal.md | 0 ...167._two_sum_ii_-_input_array_is_sorted.md | 0 .../168._excel_sheet_column_title.md | 0 .../169._majority_element.md | 0 .../171._excel_sheet_column_number.md | 0 .../173._binary_search_tree_iterator.md | 0 .../189._rotate_array.md | 0 .../191._number_of_1_bits.md | 0 .../198._house_robber.md | 0 .../199._binary_tree_right_side_view.md | 0 .../200._number_of_islands.md | 0 .../203._remove_linked_list_elements.md | 0 .../204._count_primes.md | 0 .../205._isomorphic_strings.md | 0 .../206._reverse_linked_list.md | 0 .../207._course_schedule.md | 0 .../208._implement_trie_(prefix_tree).md | 0 .../210._course_schedule_ii.md | 0 ...and Search Word - Data structure design.md | 0 .../213._house_robber_ii.md | 0 .../216._combination_sum_iii.md | 0 .../217._contains_duplicate.md | 0 .../218._The _Skyline_Problem .md | 0 .../219._contains_duplicate_ii.md | 0 .../221._maximal_square.md | 0 .../222._count_complete_tree_nodes.md | 0 .../223._rectangle_area.md | 0 .../224. Basic Calculator .md | 0 .../225._implement_stack_using_queues.md | 0 .../226._invert_binary_tree.md | 0 .../227._basic_calculator_ii.md | 0 .../228._summary_ranges.md | 0 .../229._majority_element_ii.md | 0 .../230._kth_smallest_element_in_a_bst.md | 0 .../231. _Power_of_Two.md | 0 .../232._implement_queue_using_stacks.md | 0 .../234._palindrome_linked_list.md | 0 ...common_ancestor_of_a_binary_search_tree.md | 0 ...lowest_common_ancestor_of_a_binary_tree.md | 0 .../237._delete_node_in_a_linked_list.md | 0 .../238._product_of_array_except_self.md | 0 .../240._search_a_2d_matrix_ii.md | 0 .../242._valid_anagram.md | 0 .../252. Meeting Rooms.md | 0 ...Preorder_Sequence_in_Binary_Search_Tree.md | 0 .../256. Paint House.md | 0 .../257._binary_tree_paths.md | 0 258_ Add_Digits.md => docs/258_ Add_Digits.md | 0 .../261. Graph Valid Tree.md | 0 .../263._ugly_number.md | 0 .../264._ugly_number_ii.md | 0 .../265. Paint House II.md | 0 .../266. Palindrome Permutation.md | 0 .../267. Palindrome Permutation II.md | 0 .../268._missing_number.md | 0 .../270. Closest Binary Search Tree Value.md | 0 .../276. Paint Fence.md | 0 .../277. Find the Celebrity.md | 0 .../278._First_Bad _Version.md | 0 .../279._perfect_squares.md | 0 .../280._Wiggle_Sort.md | 0 .../283._move_zeroes.md | 0 .../285._inorder_successor_in_bst.md | 0 .../286. Walls and Gates.md | 0 .../289._game_of_life.md | 0 .../290._word_pattern.md | 0 292._nim_game.md => docs/292._nim_game.md | 0 .../296. Best Meeting Point.md | 0 ...inary Tree Longest Consecutive Sequence.md | 0 .../299._bulls_and_cows.md | 0 .../300._longest_increasing_subsequence.md | 0 .../303._range_sum_query_-_immutable.md | 0 .../316._Remove_Duplicate_Letters.md | 0 .../319._Bulb_Switcher.md | 0 .../322. Coin Change.md | 0 ...ected Components in an Undirected Graph.md | 0 .../324._Wiggle_Sort_II.md | 0 .../326._power_of_three.md | 0 .../328._odd_even_linked_list.md | 0 .../334._increasing_triplet_subsequence.md | 0 .../337._house_robber_iii.md | 0 .../338. Counting Bits.md | 0 .../339. Nested List Weight Sum.md | 0 .../341._Flatten_Nested_List_Iterator.md | 0 .../342._Power_of_Four.md | 0 .../344._reverse_string.md | 0 .../345._Reverse_Vowels_of_a_String.md | 0 .../349._intersection_of_two_arrays.md | 0 .../350._intersection_of_two_arrays_ii.md | 0 .../353. Design Snake Game.md | 0 .../364. Nested List Weight Sum II.md | 0 .../366. Find Leaves of Binary Tree.md | 0 .../367._valid_perfect_square.md | 0 .../369.Plus One Linked List.md | 0 .../371._sum_of_two_integers.md | 0 .../374._Guess_Number_Higher_or_Lower.md | 0 .../377._combination_sum_iv.md | 0 ...kth_smallest_element_in_a_sorted_matrix.md | 0 .../380. Insert Delete GetRandom O(1).md | 0 ...ete GetRandom O(1) - Duplicates allowed.md | 0 .../382._linked_list_random_node.md | 0 .../383._ransom_note.md | 0 .../384. Shuffle an Array.md | 0 ...387._first_unique_character_in_a_string.md | 0 .../388._Longest_Absolute_File_Path.md | 0 .../389._find_the_difference.md | 0 .../392._is_subsequence.md | 0 .../394._decode_string.md | 0 400. Nth Digit.md => docs/400. Nth Digit.md | 0 .../401._binary_watch.md | 0 .../404._sum_of_left_leaves.md | 0 .../405. Convert a Number to Hexadecimal.md | 0 .../406._Queue_Reconstruction_by_Height.md | 0 412._fizz_buzz.md => docs/412._fizz_buzz.md | 0 .../413. Arithmetic Slices.md | 0 .../414._third_maximum_number.md | 0 .../415._add_strings.md | 0 .../416. Partition Equal Subset Sum.md | 0 ..._Maximum_XOR_of_Two_Numbers_in_an_Array.md | 0 .../422. Valid Word Square.md | 0 .../434._number_of_segments_in_a_string.md | 0 .../437._path_sum_iii.md | 0 .../438._Find_All_Anagrams_in_a_String.md | 0 .../439. Ternary Expression Parser.md | 0 .../441._arranging_coins.md | 0 ...ind_All_Numbers_Disappeared_in_an_Array.md | 0 .../450. Delete Node in a BST.md | 0 ...._Minimum_Moves_to_Equal_Array_Elements.md | 0 .../459._Repeated_Substring_Pattern.md | 0 .../461._Hamming Distance.md | 0 .../463._Island_Perimeter.md | 0 ..._Unique_Substrings_in_Wraparound_String.md | 0 .../469. Convex Polygon.md | 0 .../476._Number_Complement.md | 0 .../477._Total_Hamming_Distance.md | 0 .../485._Max_Consecutive_Ones.md | 0 .../587._Erect_the_Fence .md | 0 .../599._Minimum_Index_Sum_of_Two_Lists.md | 0 .../647._Palindromic_Substrings.md | 0 .../657._Judge_Route_Circle.md | 0 .../665._Non-decreasing_Array.md | 0 .../672._Bulb_Switcher_II.md | 0 .../681._Next_Closest_Time.md | 0 .../682._Baseball_Game.md | 0 .../687._Longest_Univalue_Path.md | 0 .../740._delete_and_earn.md | 0 .../760._Find_Anagram_Mappings.md | 0 ...00\345\267\247\347\254\224\350\256\260.py" | 0 .../SortingAlgorithm/README.md | 22 +- ...47\232\204\345\220\204\347\247\215pass.md" | 0 ...\214_graph_search\357\274\214_dfs,_bfs.md" | 0 .../interview}/Google/Google.md | 0 .../interview}/WePay/WePay.jpg | Bin .../interview}/WePay/WePay.md | 0 .../interview}/WePay/power_number.md | 0 .../interview}/pocketgems/pocketgems.md | 0 ...7\346\263\225\346\200\247\350\203\275.png" | Bin ...7\346\263\225\346\200\273\347\273\223.png" | Bin ...2\346\263\241\346\216\222\345\272\217.gif" | Bin ...2\346\225\260\346\216\222\345\272\217.gif" | Bin ...4\345\260\224\346\216\222\345\272\217.png" | Bin ...2\345\271\266\346\216\222\345\272\217.gif" | Bin ...3\351\200\237\346\216\222\345\272\217.gif" | Bin ...2\345\244\247\351\241\266\345\240\206.png" | Bin ...2\345\205\245\346\216\222\345\272\217.gif" | Bin ...1\346\213\251\346\216\222\345\272\217.gif" | Bin ...4\345\244\247\351\241\266\345\240\206.png" | Bin ...h \344\270\215\346\230\223\345\206\231.md" | 0 .../Data Structure and Algorthim Review.md | 0 .../Dynamic Programming.md | 0 ...hing Algorithms \342\200\223 topcoder.pdf" | Bin ...13\347\232\204\350\275\254\346\215\242.md" | 0 .../LinkedList\346\212\200\345\267\247.md" | 0 .../Maximal Square.pdf | Bin .../Range Sum Query 2D - Immutable.pdf | Bin .../Recusrion & BackTracking.md | 0 .../backtracking\346\200\235\350\267\257.md" | 0 ..._a_linked_list\351\227\256\351\242\230.md" | 0 ...60\347\232\204\346\200\235\350\267\257.md" | 0 .../slide_windows_template.md | 0 .../\344\275\215\350\277\220\347\256\227.md" | 0 ...22\345\210\227\347\256\227\346\263\225.md" | 0 ...06\345\220\210\351\227\256\351\242\230.md" | 0 .../\346\200\273\347\273\223.md" | 0 ...04\345\220\210\351\227\256\351\242\230.md" | 0 .../\351\200\222\345\275\222_recursion.md" | 0 src/py2.x/SortingAlgorithm/BubbleSort.py | 19 ++ src/py2.x/SortingAlgorithm/InsertSort.py | 24 ++ src/py2.x/SortingAlgorithm/MergeSort.py | 35 ++ src/py2.x/SortingAlgorithm/QuickSort.py | 35 ++ src/py2.x/SortingAlgorithm/SelectionSort.py | 28 ++ src/py2.x/SortingAlgorithm/ShellSort.py | 25 ++ src/py2.x/TreeRecursionIterator.py | 34 ++ src/py2.x/list2iteration.py | 30 ++ 321 files changed, 539 insertions(+), 29 deletions(-) delete mode 100644 "001._clone\346\234\200\346\226\260" rename 001._two_sum.md => docs/001._two_sum.md (100%) rename 002._add_two_numbers.md => docs/002._add_two_numbers.md (100%) rename 003._longest_substring_without_repeating_characters.md => docs/003._longest_substring_without_repeating_characters.md (100%) rename 004._median_of_two_sorted_arrays.md => docs/004._median_of_two_sorted_arrays.md (100%) rename 005._longest_palindromic_substring.md => docs/005._longest_palindromic_substring.md (100%) rename 007._Reverse_Integer.md => docs/007._Reverse_Integer.md (100%) rename 008._string_to_integer_(atoi).md => docs/008._string_to_integer_(atoi).md (100%) rename 010._regular_expression_matching.md => docs/010._regular_expression_matching.md (100%) rename 011._container_with_most_water.md => docs/011._container_with_most_water.md (100%) rename 012._Integer_to_Roman.md => docs/012._Integer_to_Roman.md (100%) rename 013._Roman_to_Integer.md => docs/013._Roman_to_Integer.md (100%) rename 014._longest_common_prefix.md => docs/014._longest_common_prefix.md (100%) rename 015._3sum.md => docs/015._3sum.md (100%) rename 016._3sum_closest.md => docs/016._3sum_closest.md (100%) rename 017._letter_combinations_of_a_phone_number.md => docs/017._letter_combinations_of_a_phone_number.md (100%) rename 018._4sum.md => docs/018._4sum.md (100%) rename 019._remove_nth_node_from_end_of_list.md => docs/019._remove_nth_node_from_end_of_list.md (100%) rename 020._valid_parentheses.md => docs/020._valid_parentheses.md (100%) rename 021._merge_two_sorted_lists.md => docs/021._merge_two_sorted_lists.md (100%) rename 022._generate_parentheses.md => docs/022._generate_parentheses.md (100%) rename 023._merge_k_sorted_lists.md => docs/023._merge_k_sorted_lists.md (100%) rename 024._swap_nodes_in_pairs.md => docs/024._swap_nodes_in_pairs.md (100%) rename 026._Remove_Duplicates_from_Sorted_Array.md => docs/026._Remove_Duplicates_from_Sorted_Array.md (100%) rename 027._Remove_Element.md => docs/027._Remove_Element.md (100%) rename 028._implement_strstr().md => docs/028._implement_strstr().md (100%) rename 030._Substring_with_Concatenation_of_All_Words.md => docs/030._Substring_with_Concatenation_of_All_Words.md (100%) rename 031._next_permutation.md => docs/031._next_permutation.md (100%) rename 033._search_in_rotated_sorted_array.md => docs/033._search_in_rotated_sorted_array.md (100%) rename 034._Search for a Range.md => docs/034._Search for a Range.md (100%) rename 035._search_insert_position.md => docs/035._search_insert_position.md (100%) rename 038._Count_and_Say.md => docs/038._Count_and_Say.md (100%) rename 039._combination_sum.md => docs/039._combination_sum.md (100%) rename 040._combination_sum_ii.md => docs/040._combination_sum_ii.md (100%) rename 042._trapping_rain_water.md => docs/042._trapping_rain_water.md (100%) rename 043._multiply_strings.md => docs/043._multiply_strings.md (100%) rename 044._wildcard_matching.md => docs/044._wildcard_matching.md (100%) rename 045._Jump_Game_II.md => docs/045._Jump_Game_II.md (100%) rename 046._permutations.md => docs/046._permutations.md (100%) rename 047._permutations_ii.md => docs/047._permutations_ii.md (100%) rename 048._rotate_image.md => docs/048._rotate_image.md (100%) rename 049._group_anagrams_python.md => docs/049._group_anagrams_python.md (100%) rename 050._pow(x,_n).md => docs/050._pow(x,_n).md (100%) rename 051._n-queens.md => docs/051._n-queens.md (100%) rename 052._n-queens_ii.md => docs/052._n-queens_ii.md (100%) rename 053._maximum_subarray.md => docs/053._maximum_subarray.md (100%) rename 054._spiral_matrix.md => docs/054._spiral_matrix.md (100%) rename 055._jump_game.md => docs/055._jump_game.md (100%) rename 056._Merge_Intervals.md => docs/056._Merge_Intervals.md (100%) rename 058._length_of_last_word.md => docs/058._length_of_last_word.md (100%) rename 059._spiral_matrix_ii.md => docs/059._spiral_matrix_ii.md (100%) rename 060._permutation_sequence.md => docs/060._permutation_sequence.md (100%) rename 061._rotate_list.md => docs/061._rotate_list.md (100%) rename 064._minimum_path_sum.md => docs/064._minimum_path_sum.md (100%) rename 065.unique_paths_ii.md => docs/065.unique_paths_ii.md (100%) rename 066._plus_one.md => docs/066._plus_one.md (100%) rename 067._add_binary.md => docs/067._add_binary.md (100%) rename 069._sqrt(x).md => docs/069._sqrt(x).md (100%) rename 070. Climbing Stairs.md => docs/070. Climbing Stairs.md (100%) rename 072._edit_distance.md => docs/072._edit_distance.md (100%) rename 073. Set Matrix Zeroes.md => docs/073. Set Matrix Zeroes.md (100%) rename 074._search_a_2d_matrix.md => docs/074._search_a_2d_matrix.md (100%) rename 075._sort_colors.md => docs/075._sort_colors.md (100%) rename 076._Minimum_Window_Substring.md => docs/076._Minimum_Window_Substring.md (100%) rename 077._combinations.md => docs/077._combinations.md (100%) rename 078.Subsets .md => docs/078.Subsets .md (100%) rename 079._word_search.md => docs/079._word_search.md (100%) rename 082._remove_duplicates_from_sorted_list_ii.md => docs/082._remove_duplicates_from_sorted_list_ii.md (100%) rename 083._remove_duplicates_from_sorted_list.md => docs/083._remove_duplicates_from_sorted_list.md (100%) rename 086._partition_list.md => docs/086._partition_list.md (100%) rename 088._merge_sorted_array.md => docs/088._merge_sorted_array.md (100%) rename 089._gray_code.md => docs/089._gray_code.md (100%) rename 090._subsets_ii.md => docs/090._subsets_ii.md (100%) rename 091._decode_ways.md => docs/091._decode_ways.md (100%) rename 092._reverse_linked_list_ii.md => docs/092._reverse_linked_list_ii.md (100%) rename 093._restore_ip_addresses.md => docs/093._restore_ip_addresses.md (100%) rename 094._binary_tree_inorder_traversal.md => docs/094._binary_tree_inorder_traversal.md (100%) rename 096._unique_binary_search_trees.md => docs/096._unique_binary_search_trees.md (100%) rename 098._validate_binary_search_tree.md => docs/098._validate_binary_search_tree.md (100%) rename 100._same_tree.md => docs/100._same_tree.md (100%) rename 101._symmetric_tree.md => docs/101._symmetric_tree.md (100%) rename 102._binary_tree_level_order_traversal.md => docs/102._binary_tree_level_order_traversal.md (100%) rename 103._binary_tree_zigzag_level_order_traversal.md => docs/103._binary_tree_zigzag_level_order_traversal.md (100%) rename 104._maximum_depth_of_binary_tree.md => docs/104._maximum_depth_of_binary_tree.md (100%) rename 105._construct_binary_tree_from_preorder_and_inorder_traversal.md => docs/105._construct_binary_tree_from_preorder_and_inorder_traversal.md (100%) rename 106._construct_binary_tree_from_inorder_and_postorder_traversal.md => docs/106._construct_binary_tree_from_inorder_and_postorder_traversal.md (100%) rename 107._binary_tree_level_order_traversal_ii.md => docs/107._binary_tree_level_order_traversal_ii.md (100%) rename 108._convert_sorted_array_to_binary_search_tree.md => docs/108._convert_sorted_array_to_binary_search_tree.md (100%) rename 109._convert_sorted_list_to_binary_search_tree.md => docs/109._convert_sorted_list_to_binary_search_tree.md (100%) rename 110._balanced_binary_tree.md => docs/110._balanced_binary_tree.md (100%) rename 111._minimum_depth_of_binary_tree.md => docs/111._minimum_depth_of_binary_tree.md (100%) rename 112._path_sum.md => docs/112._path_sum.md (100%) rename 113._path_sum_ii.md => docs/113._path_sum_ii.md (100%) rename 114._flatten_binary_tree_to_linked_list.md => docs/114._flatten_binary_tree_to_linked_list.md (100%) rename 116._populating_next_right_pointers_in_each_node.md => docs/116._populating_next_right_pointers_in_each_node.md (100%) rename 118._pascal's_triangle.md => docs/118._pascal's_triangle.md (100%) rename 119. Pascal's Triangle II.md => docs/119. Pascal's Triangle II.md (100%) rename 120. Triangle.md => docs/120. Triangle.md (100%) rename 121._Best_Time_to_Buy_and_Sell_Stock.md => docs/121._Best_Time_to_Buy_and_Sell_Stock.md (100%) rename 125._valid_palindrome.md => docs/125._valid_palindrome.md (100%) rename 126. Word Ladder II.md => docs/126. Word Ladder II.md (100%) rename 127._word_ladder.md => docs/127._word_ladder.md (100%) rename 128._Longest_Consecutive_Sequence.md => docs/128._Longest_Consecutive_Sequence.md (100%) rename 129._sum_root_to_leaf_numbers.md => docs/129._sum_root_to_leaf_numbers.md (100%) rename 130._surrounded_regions.md => docs/130._surrounded_regions.md (100%) rename 131._palindrome_partitioning.md => docs/131._palindrome_partitioning.md (100%) rename 133._clone_graph.md => docs/133._clone_graph.md (100%) rename 136._single_number.md => docs/136._single_number.md (100%) rename 139._word_break.md => docs/139._word_break.md (100%) rename 140._word_break_ii.md => docs/140._word_break_ii.md (100%) rename 141._linked_list_cycle.md => docs/141._linked_list_cycle.md (100%) rename 142_Linked_List_Cycle_II.md => docs/142_Linked_List_Cycle_II.md (100%) rename 143._reorder_list.md => docs/143._reorder_list.md (100%) rename 144._binary_tree_preorder_traversal.md => docs/144._binary_tree_preorder_traversal.md (100%) rename 145._binary_tree_postorder_traversal.md => docs/145._binary_tree_postorder_traversal.md (100%) rename 147._insertion_sort_list.md => docs/147._insertion_sort_list.md (100%) rename 148._sort_list.md => docs/148._sort_list.md (100%) rename 150._evaluate_reverse_polish_notation.md => docs/150._evaluate_reverse_polish_notation.md (100%) rename 151._reverse_words_in_a_string.md => docs/151._reverse_words_in_a_string.md (100%) rename 152._maximum_product_subarray.md => docs/152._maximum_product_subarray.md (100%) rename 153._find_minimum_in_rotated_sorted_array.md => docs/153._find_minimum_in_rotated_sorted_array.md (100%) rename 155._min_stack.md => docs/155._min_stack.md (100%) rename 159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md => docs/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md (100%) rename 160._intersection_of_two_linked_lists.md => docs/160._intersection_of_two_linked_lists.md (100%) rename 162._find_peak_element.md => docs/162._find_peak_element.md (100%) rename 165._compare_version_numbers.md => docs/165._compare_version_numbers.md (100%) rename 166._Fraction_to_Recurring_Decimal.md => docs/166._Fraction_to_Recurring_Decimal.md (100%) rename 167._two_sum_ii_-_input_array_is_sorted.md => docs/167._two_sum_ii_-_input_array_is_sorted.md (100%) rename 168._excel_sheet_column_title.md => docs/168._excel_sheet_column_title.md (100%) rename 169._majority_element.md => docs/169._majority_element.md (100%) rename 171._excel_sheet_column_number.md => docs/171._excel_sheet_column_number.md (100%) rename 173._binary_search_tree_iterator.md => docs/173._binary_search_tree_iterator.md (100%) rename 189._rotate_array.md => docs/189._rotate_array.md (100%) rename 191._number_of_1_bits.md => docs/191._number_of_1_bits.md (100%) rename 198._house_robber.md => docs/198._house_robber.md (100%) rename 199._binary_tree_right_side_view.md => docs/199._binary_tree_right_side_view.md (100%) rename 200._number_of_islands.md => docs/200._number_of_islands.md (100%) rename 203._remove_linked_list_elements.md => docs/203._remove_linked_list_elements.md (100%) rename 204._count_primes.md => docs/204._count_primes.md (100%) rename 205._isomorphic_strings.md => docs/205._isomorphic_strings.md (100%) rename 206._reverse_linked_list.md => docs/206._reverse_linked_list.md (100%) rename 207._course_schedule.md => docs/207._course_schedule.md (100%) rename 208._implement_trie_(prefix_tree).md => docs/208._implement_trie_(prefix_tree).md (100%) rename 210._course_schedule_ii.md => docs/210._course_schedule_ii.md (100%) rename 211. Add and Search Word - Data structure design.md => docs/211. Add and Search Word - Data structure design.md (100%) rename 213._house_robber_ii.md => docs/213._house_robber_ii.md (100%) rename 216._combination_sum_iii.md => docs/216._combination_sum_iii.md (100%) rename 217._contains_duplicate.md => docs/217._contains_duplicate.md (100%) rename 218._The _Skyline_Problem .md => docs/218._The _Skyline_Problem .md (100%) rename 219._contains_duplicate_ii.md => docs/219._contains_duplicate_ii.md (100%) rename 221._maximal_square.md => docs/221._maximal_square.md (100%) rename 222._count_complete_tree_nodes.md => docs/222._count_complete_tree_nodes.md (100%) rename 223._rectangle_area.md => docs/223._rectangle_area.md (100%) rename 224. Basic Calculator .md => docs/224. Basic Calculator .md (100%) rename 225._implement_stack_using_queues.md => docs/225._implement_stack_using_queues.md (100%) rename 226._invert_binary_tree.md => docs/226._invert_binary_tree.md (100%) rename 227._basic_calculator_ii.md => docs/227._basic_calculator_ii.md (100%) rename 228._summary_ranges.md => docs/228._summary_ranges.md (100%) rename 229._majority_element_ii.md => docs/229._majority_element_ii.md (100%) rename 230._kth_smallest_element_in_a_bst.md => docs/230._kth_smallest_element_in_a_bst.md (100%) rename 231. _Power_of_Two.md => docs/231. _Power_of_Two.md (100%) rename 232._implement_queue_using_stacks.md => docs/232._implement_queue_using_stacks.md (100%) rename 234._palindrome_linked_list.md => docs/234._palindrome_linked_list.md (100%) rename 235._lowest_common_ancestor_of_a_binary_search_tree.md => docs/235._lowest_common_ancestor_of_a_binary_search_tree.md (100%) rename 236._lowest_common_ancestor_of_a_binary_tree.md => docs/236._lowest_common_ancestor_of_a_binary_tree.md (100%) rename 237._delete_node_in_a_linked_list.md => docs/237._delete_node_in_a_linked_list.md (100%) rename 238._product_of_array_except_self.md => docs/238._product_of_array_except_self.md (100%) rename 240._search_a_2d_matrix_ii.md => docs/240._search_a_2d_matrix_ii.md (100%) rename 242._valid_anagram.md => docs/242._valid_anagram.md (100%) rename 252. Meeting Rooms.md => docs/252. Meeting Rooms.md (100%) rename 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md => docs/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md (100%) rename 256. Paint House.md => docs/256. Paint House.md (100%) rename 257._binary_tree_paths.md => docs/257._binary_tree_paths.md (100%) rename 258_ Add_Digits.md => docs/258_ Add_Digits.md (100%) rename 261. Graph Valid Tree.md => docs/261. Graph Valid Tree.md (100%) rename 263._ugly_number.md => docs/263._ugly_number.md (100%) rename 264._ugly_number_ii.md => docs/264._ugly_number_ii.md (100%) rename 265. Paint House II.md => docs/265. Paint House II.md (100%) rename 266. Palindrome Permutation.md => docs/266. Palindrome Permutation.md (100%) rename 267. Palindrome Permutation II.md => docs/267. Palindrome Permutation II.md (100%) rename 268._missing_number.md => docs/268._missing_number.md (100%) rename 270. Closest Binary Search Tree Value.md => docs/270. Closest Binary Search Tree Value.md (100%) rename 276. Paint Fence.md => docs/276. Paint Fence.md (100%) rename 277. Find the Celebrity.md => docs/277. Find the Celebrity.md (100%) rename 278._First_Bad _Version.md => docs/278._First_Bad _Version.md (100%) rename 279._perfect_squares.md => docs/279._perfect_squares.md (100%) rename 280._Wiggle_Sort.md => docs/280._Wiggle_Sort.md (100%) rename 283._move_zeroes.md => docs/283._move_zeroes.md (100%) rename 285._inorder_successor_in_bst.md => docs/285._inorder_successor_in_bst.md (100%) rename 286. Walls and Gates.md => docs/286. Walls and Gates.md (100%) rename 289._game_of_life.md => docs/289._game_of_life.md (100%) rename 290._word_pattern.md => docs/290._word_pattern.md (100%) rename 292._nim_game.md => docs/292._nim_game.md (100%) rename 296. Best Meeting Point.md => docs/296. Best Meeting Point.md (100%) rename 298. Binary Tree Longest Consecutive Sequence.md => docs/298. Binary Tree Longest Consecutive Sequence.md (100%) rename 299._bulls_and_cows.md => docs/299._bulls_and_cows.md (100%) rename 300._longest_increasing_subsequence.md => docs/300._longest_increasing_subsequence.md (100%) rename 303._range_sum_query_-_immutable.md => docs/303._range_sum_query_-_immutable.md (100%) rename 316._Remove_Duplicate_Letters.md => docs/316._Remove_Duplicate_Letters.md (100%) rename 319._Bulb_Switcher.md => docs/319._Bulb_Switcher.md (100%) rename 322. Coin Change.md => docs/322. Coin Change.md (100%) rename 323. Number of Connected Components in an Undirected Graph.md => docs/323. Number of Connected Components in an Undirected Graph.md (100%) rename 324._Wiggle_Sort_II.md => docs/324._Wiggle_Sort_II.md (100%) rename 326._power_of_three.md => docs/326._power_of_three.md (100%) rename 328._odd_even_linked_list.md => docs/328._odd_even_linked_list.md (100%) rename 334._increasing_triplet_subsequence.md => docs/334._increasing_triplet_subsequence.md (100%) rename 337._house_robber_iii.md => docs/337._house_robber_iii.md (100%) rename 338. Counting Bits.md => docs/338. Counting Bits.md (100%) rename 339. Nested List Weight Sum.md => docs/339. Nested List Weight Sum.md (100%) rename 341._Flatten_Nested_List_Iterator.md => docs/341._Flatten_Nested_List_Iterator.md (100%) rename 342._Power_of_Four.md => docs/342._Power_of_Four.md (100%) rename 344._reverse_string.md => docs/344._reverse_string.md (100%) rename 345._Reverse_Vowels_of_a_String.md => docs/345._Reverse_Vowels_of_a_String.md (100%) rename 349._intersection_of_two_arrays.md => docs/349._intersection_of_two_arrays.md (100%) rename 350._intersection_of_two_arrays_ii.md => docs/350._intersection_of_two_arrays_ii.md (100%) rename 353. Design Snake Game.md => docs/353. Design Snake Game.md (100%) rename 364. Nested List Weight Sum II.md => docs/364. Nested List Weight Sum II.md (100%) rename 366. Find Leaves of Binary Tree.md => docs/366. Find Leaves of Binary Tree.md (100%) rename 367._valid_perfect_square.md => docs/367._valid_perfect_square.md (100%) rename 369.Plus One Linked List.md => docs/369.Plus One Linked List.md (100%) rename 371._sum_of_two_integers.md => docs/371._sum_of_two_integers.md (100%) rename 374._Guess_Number_Higher_or_Lower.md => docs/374._Guess_Number_Higher_or_Lower.md (100%) rename 377._combination_sum_iv.md => docs/377._combination_sum_iv.md (100%) rename 378._kth_smallest_element_in_a_sorted_matrix.md => docs/378._kth_smallest_element_in_a_sorted_matrix.md (100%) rename 380. Insert Delete GetRandom O(1).md => docs/380. Insert Delete GetRandom O(1).md (100%) rename 381. Insert Delete GetRandom O(1) - Duplicates allowed.md => docs/381. Insert Delete GetRandom O(1) - Duplicates allowed.md (100%) rename 382._linked_list_random_node.md => docs/382._linked_list_random_node.md (100%) rename 383._ransom_note.md => docs/383._ransom_note.md (100%) rename 384. Shuffle an Array.md => docs/384. Shuffle an Array.md (100%) rename 387._first_unique_character_in_a_string.md => docs/387._first_unique_character_in_a_string.md (100%) rename 388._Longest_Absolute_File_Path.md => docs/388._Longest_Absolute_File_Path.md (100%) rename 389._find_the_difference.md => docs/389._find_the_difference.md (100%) rename 392._is_subsequence.md => docs/392._is_subsequence.md (100%) rename 394._decode_string.md => docs/394._decode_string.md (100%) rename 400. Nth Digit.md => docs/400. Nth Digit.md (100%) rename 401._binary_watch.md => docs/401._binary_watch.md (100%) rename 404._sum_of_left_leaves.md => docs/404._sum_of_left_leaves.md (100%) rename 405. Convert a Number to Hexadecimal.md => docs/405. Convert a Number to Hexadecimal.md (100%) rename 406._Queue_Reconstruction_by_Height.md => docs/406._Queue_Reconstruction_by_Height.md (100%) rename 412._fizz_buzz.md => docs/412._fizz_buzz.md (100%) rename 413. Arithmetic Slices.md => docs/413. Arithmetic Slices.md (100%) rename 414._third_maximum_number.md => docs/414._third_maximum_number.md (100%) rename 415._add_strings.md => docs/415._add_strings.md (100%) rename 416. Partition Equal Subset Sum.md => docs/416. Partition Equal Subset Sum.md (100%) rename 421._Maximum_XOR_of_Two_Numbers_in_an_Array.md => docs/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md (100%) rename 422. Valid Word Square.md => docs/422. Valid Word Square.md (100%) rename 434._number_of_segments_in_a_string.md => docs/434._number_of_segments_in_a_string.md (100%) rename 437._path_sum_iii.md => docs/437._path_sum_iii.md (100%) rename 438._Find_All_Anagrams_in_a_String.md => docs/438._Find_All_Anagrams_in_a_String.md (100%) rename 439. Ternary Expression Parser.md => docs/439. Ternary Expression Parser.md (100%) rename 441._arranging_coins.md => docs/441._arranging_coins.md (100%) rename 448._Find_All_Numbers_Disappeared_in_an_Array.md => docs/448._Find_All_Numbers_Disappeared_in_an_Array.md (100%) rename 450. Delete Node in a BST.md => docs/450. Delete Node in a BST.md (100%) rename 453._Minimum_Moves_to_Equal_Array_Elements.md => docs/453._Minimum_Moves_to_Equal_Array_Elements.md (100%) rename 459._Repeated_Substring_Pattern.md => docs/459._Repeated_Substring_Pattern.md (100%) rename 461._Hamming Distance.md => docs/461._Hamming Distance.md (100%) rename 463._Island_Perimeter.md => docs/463._Island_Perimeter.md (100%) rename 467._Unique_Substrings_in_Wraparound_String.md => docs/467._Unique_Substrings_in_Wraparound_String.md (100%) rename 469. Convex Polygon.md => docs/469. Convex Polygon.md (100%) rename 476._Number_Complement.md => docs/476._Number_Complement.md (100%) rename 477._Total_Hamming_Distance.md => docs/477._Total_Hamming_Distance.md (100%) rename 485._Max_Consecutive_Ones.md => docs/485._Max_Consecutive_Ones.md (100%) rename 587._Erect_the_Fence .md => docs/587._Erect_the_Fence .md (100%) rename 599._Minimum_Index_Sum_of_Two_Lists.md => docs/599._Minimum_Index_Sum_of_Two_Lists.md (100%) rename 647._Palindromic_Substrings.md => docs/647._Palindromic_Substrings.md (100%) rename 657._Judge_Route_Circle.md => docs/657._Judge_Route_Circle.md (100%) rename 665._Non-decreasing_Array.md => docs/665._Non-decreasing_Array.md (100%) rename 672._Bulb_Switcher_II.md => docs/672._Bulb_Switcher_II.md (100%) rename 681._Next_Closest_Time.md => docs/681._Next_Closest_Time.md (100%) rename 682._Baseball_Game.md => docs/682._Baseball_Game.md (100%) rename 687._Longest_Univalue_Path.md => docs/687._Longest_Univalue_Path.md (100%) rename 740._delete_and_earn.md => docs/740._delete_and_earn.md (100%) rename 760._Find_Anagram_Mappings.md => docs/760._Find_Anagram_Mappings.md (100%) rename "Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" => "docs/SortingAlgorithm/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" (100%) rename "python\345\256\236\347\216\260\345\205\253\345\244\247\346\216\222\345\272\217.md" => docs/SortingAlgorithm/README.md (92%) rename "python\347\232\204\345\220\204\347\247\215pass.md" => "docs/SortingAlgorithm/python\347\232\204\345\220\204\347\247\215pass.md" (100%) rename "tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" => "docs/SortingAlgorithm/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" (100%) rename {interview question => docs/interview}/Google/Google.md (100%) rename {interview question => docs/interview}/WePay/WePay.jpg (100%) rename {interview question => docs/interview}/WePay/WePay.md (100%) rename {interview question => docs/interview}/WePay/power_number.md (100%) rename {interview question => docs/interview}/pocketgems/pocketgems.md (100%) rename "images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\247\350\203\275\346\257\224\350\276\203.png" => "images/SortingAlgorithm/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\247\350\203\275.png" (100%) rename "images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.png" => "images/SortingAlgorithm/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.png" (100%) rename "images/\345\206\222\346\263\241\346\216\222\345\272\217.gif" => "images/SortingAlgorithm/\345\206\222\346\263\241\346\216\222\345\272\217.gif" (100%) rename "images/\345\237\272\346\225\260\346\216\222\345\272\217.gif" => "images/SortingAlgorithm/\345\237\272\346\225\260\346\216\222\345\272\217.gif" (100%) rename "images/\345\270\214\345\260\224\346\216\222\345\272\217.png" => "images/SortingAlgorithm/\345\270\214\345\260\224\346\216\222\345\272\217.png" (100%) rename "images/\345\275\222\345\271\266\346\216\222\345\272\217.gif" => "images/SortingAlgorithm/\345\275\222\345\271\266\346\216\222\345\272\217.gif" (100%) rename "images/\345\277\253\351\200\237\346\216\222\345\272\217.gif" => "images/SortingAlgorithm/\345\277\253\351\200\237\346\216\222\345\272\217.gif" (100%) rename "images/\346\236\204\345\273\272\345\244\247\351\241\266\345\240\206.png" => "images/SortingAlgorithm/\346\236\204\345\273\272\345\244\247\351\241\266\345\240\206.png" (100%) rename "images/\347\233\264\346\216\245\346\217\222\345\205\245\346\216\222\345\272\217.gif" => "images/SortingAlgorithm/\347\233\264\346\216\245\346\217\222\345\205\245\346\216\222\345\272\217.gif" (100%) rename "images/\347\256\200\345\215\225\351\200\211\346\213\251\346\216\222\345\272\217.gif" => "images/SortingAlgorithm/\347\256\200\345\215\225\351\200\211\346\213\251\346\216\222\345\272\217.gif" (100%) rename "images/\350\260\203\346\225\264\345\244\247\351\241\266\345\240\206.png" => "images/SortingAlgorithm/\350\260\203\346\225\264\345\244\247\351\241\266\345\240\206.png" (100%) rename "Binary Search \344\270\215\346\230\223\345\206\231.md" => "others/Binary Search \344\270\215\346\230\223\345\206\231.md" (100%) rename Data Structure and Algorthim Review.md => others/Data Structure and Algorthim Review.md (100%) rename Dynamic Programming.md => others/Dynamic Programming.md (100%) rename "Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" => "others/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" (100%) rename "Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" => "others/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" (100%) rename "LinkedList\346\212\200\345\267\247.md" => "others/LinkedList\346\212\200\345\267\247.md" (100%) rename Maximal Square.pdf => others/Maximal Square.pdf (100%) rename Range Sum Query 2D - Immutable.pdf => others/Range Sum Query 2D - Immutable.pdf (100%) rename Recusrion & BackTracking.md => others/Recusrion & BackTracking.md (100%) rename "backtracking\346\200\235\350\267\257.md" => "others/backtracking\346\200\235\350\267\257.md" (100%) rename "delete_node_in_a_linked_list\351\227\256\351\242\230.md" => "others/delete_node_in_a_linked_list\351\227\256\351\242\230.md" (100%) rename "local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" => "others/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" (100%) rename slide_windows_template.md => others/slide_windows_template.md (100%) rename "\344\275\215\350\277\220\347\256\227.md" => "others/\344\275\215\350\277\220\347\256\227.md" (100%) rename "\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" => "others/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" (100%) rename "\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" => "others/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" (100%) rename "\346\200\273\347\273\223.md" => "others/\346\200\273\347\273\223.md" (100%) rename "\347\273\204\345\220\210\351\227\256\351\242\230.md" => "others/\347\273\204\345\220\210\351\227\256\351\242\230.md" (100%) rename "\351\200\222\345\275\222_recursion.md" => "others/\351\200\222\345\275\222_recursion.md" (100%) create mode 100644 src/py2.x/SortingAlgorithm/BubbleSort.py create mode 100644 src/py2.x/SortingAlgorithm/InsertSort.py create mode 100644 src/py2.x/SortingAlgorithm/MergeSort.py create mode 100644 src/py2.x/SortingAlgorithm/QuickSort.py create mode 100644 src/py2.x/SortingAlgorithm/SelectionSort.py create mode 100644 src/py2.x/SortingAlgorithm/ShellSort.py create mode 100644 src/py2.x/TreeRecursionIterator.py create mode 100644 src/py2.x/list2iteration.py diff --git "a/001._clone\346\234\200\346\226\260" "b/001._clone\346\234\200\346\226\260" deleted file mode 100644 index 22063ae2c..000000000 --- "a/001._clone\346\234\200\346\226\260" +++ /dev/null @@ -1 +0,0 @@ -001._记得先clone最新. diff --git a/Readme.md b/Readme.md index ea453be99..9fafaced9 100644 --- a/Readme.md +++ b/Readme.md @@ -1,32 +1,313 @@ -### Reference and Appreciation: +# LeetCode 面试题 -1. [KrisYu的GItuhub](https://github.com/KrisYu/LeetCode-CLRS-Python) +## [八大算法算](/docs/SortingAlgorithm/README.md) -2. [kamyu104的Github](https://github.com/kamyu104/LeetCode) +![](/images/SortingAlgorithm/八大排序算法性能.png) -3. [数据结构与算法/leetcode/lintcode题解](https://algorithm.yuanbin.me/zh-hans/) +| 名称 | 文档 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | -4. [Leetcode 讨论区](https://discuss.leetcode.com/) +## 面试问答 -5. [visualgo算法可视化网站](https://visualgo.net/en) +* [Google面试题](/docs/interview/Google/Google.md) +* [pocketgems 面试题](/docs/interview/pocketgems/pocketgems.md) +* [WePay 面试题](/docs/interview/WePay/WePay.md) -6. [Data Structure Visualization](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) +## LeetCode算法题 -7. [我的算法学习之路 - Lucida](http://zh.lucida.me/blog/on-learning-algorithms/) +* [](docs/LeetCode/001._two_sum.md) +* [](/docs/LeetCode/002._add_two_numbers.md) +* [](/docs/LeetCode/003._longest_substring_without_repeating_characters.md) +* [](/docs/LeetCode/004._median_of_two_sorted_arrays.md) +* [](/docs/LeetCode/005._longest_palindromic_substring.md) +* [](/docs/LeetCode/007._Reverse_Integer.md) +* [](/docs/LeetCode/008._string_to_integer_(atoi).md) +* [](/docs/LeetCode/010._regular_expression_matching.md) +* [](/docs/LeetCode/011._container_with_most_water.md) +* [](/docs/LeetCode/012._Integer_to_Roman.md) +* [](/docs/LeetCode/013._Roman_to_Integer.md) +* [](/docs/LeetCode/014._longest_common_prefix.md) +* [](/docs/LeetCode/015._3sum.md) +* [](/docs/LeetCode/016._3sum_closest.md) +* [](/docs/LeetCode/017._letter_combinations_of_a_phone_number.md) +* [](/docs/LeetCode/018._4sum.md) +* [](/docs/LeetCode/019._remove_nth_node_from_end_of_list.md) +* [](/docs/LeetCode/020._valid_parentheses.md) +* [](/docs/LeetCode/021._merge_two_sorted_lists.md) +* [](/docs/LeetCode/022._generate_parentheses.md) +* [](/docs/LeetCode/023._merge_k_sorted_lists.md) +* [](/docs/LeetCode/024._swap_nodes_in_pairs.md) +* [](/docs/LeetCode/026._Remove_Duplicates_from_Sorted_Array.md) +* [](/docs/LeetCode/027._Remove_Element.md) +* [](/docs/LeetCode/028._implement_strstr().md) +* [](/docs/LeetCode/030._Substring_with_Concatenation_of_All_Words.md) +* [](/docs/LeetCode/031._next_permutation.md) +* [](/docs/LeetCode/033._search_in_rotated_sorted_array.md) +* [](/docs/LeetCode/034._SearchforaRange.md) +* [](/docs/LeetCode/035._search_insert_position.md) +* [](/docs/LeetCode/038._Count_and_Say.md) +* [](/docs/LeetCode/039._combination_sum.md) +* [](/docs/LeetCode/040._combination_sum_ii.md) +* [](/docs/LeetCode/042._trapping_rain_water.md) +* [](/docs/LeetCode/043._multiply_strings.md) +* [](/docs/LeetCode/044._wildcard_matching.md) +* [](/docs/LeetCode/045._Jump_Game_II.md) +* [](/docs/LeetCode/046._permutations.md) +* [](/docs/LeetCode/047._permutations_ii.md) +* [](/docs/LeetCode/048._rotate_image.md) +* [](/docs/LeetCode/049._group_anagrams_python.md) +* [](/docs/LeetCode/050._pow(x,_n).md) +* [](/docs/LeetCode/051._n-queens.md) +* [](/docs/LeetCode/052._n-queens_ii.md) +* [](/docs/LeetCode/053._maximum_subarray.md) +* [](/docs/LeetCode/054._spiral_matrix.md) +* [](/docs/LeetCode/055._jump_game.md) +* [](/docs/LeetCode/056._Merge_Intervals.md) +* [](/docs/LeetCode/058._length_of_last_word.md) +* [](/docs/LeetCode/059._spiral_matrix_ii.md) +* [](/docs/LeetCode/060._permutation_sequence.md) +* [](/docs/LeetCode/061._rotate_list.md) +* [](/docs/LeetCode/064._minimum_path_sum.md) +* [](/docs/LeetCode/065.unique_paths_ii.md) +* [](/docs/LeetCode/066._plus_one.md) +* [](/docs/LeetCode/067._add_binary.md) +* [](/docs/LeetCode/069._sqrt(x).md) +* [](/docs/LeetCode/070.ClimbingStairs.md) +* [](/docs/LeetCode/072._edit_distance.md) +* [](/docs/LeetCode/073.SetMatrixZeroes.md) +* [](/docs/LeetCode/074._search_a_2d_matrix.md) +* [](/docs/LeetCode/075._sort_colors.md) +* [](/docs/LeetCode/076._Minimum_Window_Substring.md) +* [](/docs/LeetCode/077._combinations.md) +* [](/docs/LeetCode/078.Subsets.md) +* [](/docs/LeetCode/079._word_search.md) +* [](/docs/LeetCode/082._remove_duplicates_from_sorted_list_ii.md) +* [](/docs/LeetCode/083._remove_duplicates_from_sorted_list.md) +* [](/docs/LeetCode/086._partition_list.md) +* [](/docs/LeetCode/088._merge_sorted_array.md) +* [](/docs/LeetCode/089._gray_code.md) +* [](/docs/LeetCode/090._subsets_ii.md) +* [](/docs/LeetCode/091._decode_ways.md) +* [](/docs/LeetCode/092._reverse_linked_list_ii.md) +* [](/docs/LeetCode/093._restore_ip_addresses.md) +* [](/docs/LeetCode/094._binary_tree_inorder_traversal.md) +* [](/docs/LeetCode/096._unique_binary_search_trees.md) +* [](/docs/LeetCode/098._validate_binary_search_tree.md) +* [](/docs/LeetCode/100._same_tree.md) +* [](/docs/LeetCode/101._symmetric_tree.md) +* [](/docs/LeetCode/102._binary_tree_level_order_traversal.md) +* [](/docs/LeetCode/103._binary_tree_zigzag_level_order_traversal.md) +* [](/docs/LeetCode/104._maximum_depth_of_binary_tree.md) +* [](/docs/LeetCode/105._construct_binary_tree_from_preorder_and_inorder_traversal.md) +* [](/docs/LeetCode/106._construct_binary_tree_from_inorder_and_postorder_traversal.md) +* [](/docs/LeetCode/107._binary_tree_level_order_traversal_ii.md) +* [](/docs/LeetCode/108._convert_sorted_array_to_binary_search_tree.md) +* [](/docs/LeetCode/109._convert_sorted_list_to_binary_search_tree.md) +* [](/docs/LeetCode/110._balanced_binary_tree.md) +* [](/docs/LeetCode/111._minimum_depth_of_binary_tree.md) +* [](/docs/LeetCode/112._path_sum.md) +* [](/docs/LeetCode/113._path_sum_ii.md) +* [](/docs/LeetCode/114._flatten_binary_tree_to_linked_list.md) +* [](/docs/LeetCode/116._populating_next_right_pointers_in_each_node.md) +* [](/docs/LeetCode/118._pascal's_triangle.md) +* [](/docs/LeetCode/119.Pascal'sTriangleII.md) +* [](/docs/LeetCode/120.Triangle.md) +* [](/docs/LeetCode/121._Best_Time_to_Buy_and_Sell_Stock.md) +* [](/docs/LeetCode/125._valid_palindrome.md) +* [](/docs/LeetCode/126.WordLadderII.md) +* [](/docs/LeetCode/127._word_ladder.md) +* [](/docs/LeetCode/128._Longest_Consecutive_Sequence.md) +* [](/docs/LeetCode/129._sum_root_to_leaf_numbers.md) +* [](/docs/LeetCode/130._surrounded_regions.md) +* [](/docs/LeetCode/131._palindrome_partitioning.md) +* [](/docs/LeetCode/133._clone_graph.md) +* [](/docs/LeetCode/136._single_number.md) +* [](/docs/LeetCode/139._word_break.md) +* [](/docs/LeetCode/140._word_break_ii.md) +* [](/docs/LeetCode/141._linked_list_cycle.md) +* [](/docs/LeetCode/142_Linked_List_Cycle_II.md) +* [](/docs/LeetCode/143._reorder_list.md) +* [](/docs/LeetCode/144._binary_tree_preorder_traversal.md) +* [](/docs/LeetCode/145._binary_tree_postorder_traversal.md) +* [](/docs/LeetCode/147._insertion_sort_list.md) +* [](/docs/LeetCode/148._sort_list.md) +* [](/docs/LeetCode/150._evaluate_reverse_polish_notation.md) +* [](/docs/LeetCode/151._reverse_words_in_a_string.md) +* [](/docs/LeetCode/152._maximum_product_subarray.md) +* [](/docs/LeetCode/153._find_minimum_in_rotated_sorted_array.md) +* [](/docs/LeetCode/155._min_stack.md) +* [](/docs/LeetCode/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md) +* [](/docs/LeetCode/160._intersection_of_two_linked_lists.md) +* [](/docs/LeetCode/162._find_peak_element.md) +* [](/docs/LeetCode/165._compare_version_numbers.md) +* [](/docs/LeetCode/166._Fraction_to_Recurring_Decimal.md) +* [](/docs/LeetCode/167._two_sum_ii_-_input_array_is_sorted.md) +* [](/docs/LeetCode/168._excel_sheet_column_title.md) +* [](/docs/LeetCode/169._majority_element.md) +* [](/docs/LeetCode/171._excel_sheet_column_number.md) +* [](/docs/LeetCode/173._binary_search_tree_iterator.md) +* [](/docs/LeetCode/189._rotate_array.md) +* [](/docs/LeetCode/191._number_of_1_bits.md) +* [](/docs/LeetCode/198._house_robber.md) +* [](/docs/LeetCode/199._binary_tree_right_side_view.md) +* [](/docs/LeetCode/200._number_of_islands.md) +* [](/docs/LeetCode/203._remove_linked_list_elements.md) +* [](/docs/LeetCode/204._count_primes.md) +* [](/docs/LeetCode/205._isomorphic_strings.md) +* [](/docs/LeetCode/206._reverse_linked_list.md) +* [](/docs/LeetCode/207._course_schedule.md) +* [](/docs/LeetCode/208._implement_trie_(prefix_tree).md) +* [](/docs/LeetCode/210._course_schedule_ii.md) +* [](/docs/LeetCode/211.AddandSearchWord-Datastructuredesign.md) +* [](/docs/LeetCode/213._house_robber_ii.md) +* [](/docs/LeetCode/216._combination_sum_iii.md) +* [](/docs/LeetCode/217._contains_duplicate.md) +* [](/docs/LeetCode/218._The_Skyline_Problem.md) +* [](/docs/LeetCode/219._contains_duplicate_ii.md) +* [](/docs/LeetCode/221._maximal_square.md) +* [](/docs/LeetCode/222._count_complete_tree_nodes.md) +* [](/docs/LeetCode/223._rectangle_area.md) +* [](/docs/LeetCode/224.BasicCalculator.md) +* [](/docs/LeetCode/225._implement_stack_using_queues.md) +* [](/docs/LeetCode/226._invert_binary_tree.md) +* [](/docs/LeetCode/227._basic_calculator_ii.md) +* [](/docs/LeetCode/228._summary_ranges.md) +* [](/docs/LeetCode/229._majority_element_ii.md) +* [](/docs/LeetCode/230._kth_smallest_element_in_a_bst.md) +* [](/docs/LeetCode/231._Power_of_Two.md) +* [](/docs/LeetCode/232._implement_queue_using_stacks.md) +* [](/docs/LeetCode/234._palindrome_linked_list.md) +* [](/docs/LeetCode/235._lowest_common_ancestor_of_a_binary_search_tree.md) +* [](/docs/LeetCode/236._lowest_common_ancestor_of_a_binary_tree.md) +* [](/docs/LeetCode/237._delete_node_in_a_linked_list.md) +* [](/docs/LeetCode/238._product_of_array_except_self.md) +* [](/docs/LeetCode/240._search_a_2d_matrix_ii.md) +* [](/docs/LeetCode/242._valid_anagram.md) +* [](/docs/LeetCode/252.MeetingRooms.md) +* [](/docs/LeetCode/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md) +* [](/docs/LeetCode/256.PaintHouse.md) +* [](/docs/LeetCode/257._binary_tree_paths.md) +* [](/docs/LeetCode/258_Add_Digits.md) +* [](/docs/LeetCode/261.GraphValidTree.md) +* [](/docs/LeetCode/263._ugly_number.md) +* [](/docs/LeetCode/264._ugly_number_ii.md) +* [](/docs/LeetCode/265.PaintHouseII.md) +* [](/docs/LeetCode/266.PalindromePermutation.md) +* [](/docs/LeetCode/267.PalindromePermutationII.md) +* [](/docs/LeetCode/268._missing_number.md) +* [](/docs/LeetCode/270.ClosestBinarySearchTreeValue.md) +* [](/docs/LeetCode/276.PaintFence.md) +* [](/docs/LeetCode/277.FindtheCelebrity.md) +* [](/docs/LeetCode/278._First_Bad_Version.md) +* [](/docs/LeetCode/279._perfect_squares.md) +* [](/docs/LeetCode/280._Wiggle_Sort.md) +* [](/docs/LeetCode/283._move_zeroes.md) +* [](/docs/LeetCode/285._inorder_successor_in_bst.md) +* [](/docs/LeetCode/286.WallsandGates.md) +* [](/docs/LeetCode/289._game_of_life.md) +* [](/docs/LeetCode/290._word_pattern.md) +* [](/docs/LeetCode/292._nim_game.md) +* [](/docs/LeetCode/296.BestMeetingPoint.md) +* [](/docs/LeetCode/298.BinaryTreeLongestConsecutiveSequence.md) +* [](/docs/LeetCode/299._bulls_and_cows.md) +* [](/docs/LeetCode/300._longest_increasing_subsequence.md) +* [](/docs/LeetCode/303._range_sum_query_-_immutable.md) +* [](/docs/LeetCode/316._Remove_Duplicate_Letters.md) +* [](/docs/LeetCode/319._Bulb_Switcher.md) +* [](/docs/LeetCode/322.CoinChange.md) +* [](/docs/LeetCode/323.NumberofConnectedComponentsinanUndirectedGraph.md) +* [](/docs/LeetCode/324._Wiggle_Sort_II.md) +* [](/docs/LeetCode/326._power_of_three.md) +* [](/docs/LeetCode/328._odd_even_linked_list.md) +* [](/docs/LeetCode/334._increasing_triplet_subsequence.md) +* [](/docs/LeetCode/337._house_robber_iii.md) +* [](/docs/LeetCode/338.CountingBits.md) +* [](/docs/LeetCode/339.NestedListWeightSum.md) +* [](/docs/LeetCode/341._Flatten_Nested_List_Iterator.md) +* [](/docs/LeetCode/342._Power_of_Four.md) +* [](/docs/LeetCode/344._reverse_string.md) +* [](/docs/LeetCode/345._Reverse_Vowels_of_a_String.md) +* [](/docs/LeetCode/349._intersection_of_two_arrays.md) +* [](/docs/LeetCode/350._intersection_of_two_arrays_ii.md) +* [](/docs/LeetCode/353.DesignSnakeGame.md) +* [](/docs/LeetCode/364.NestedListWeightSumII.md) +* [](/docs/LeetCode/366.FindLeavesofBinaryTree.md) +* [](/docs/LeetCode/367._valid_perfect_square.md) +* [](/docs/LeetCode/369.PlusOneLinkedList.md) +* [](/docs/LeetCode/371._sum_of_two_integers.md) +* [](/docs/LeetCode/374._Guess_Number_Higher_or_Lower.md) +* [](/docs/LeetCode/377._combination_sum_iv.md) +* [](/docs/LeetCode/378._kth_smallest_element_in_a_sorted_matrix.md) +* [](/docs/LeetCode/380.InsertDeleteGetRandomO(1).md) +* [](/docs/LeetCode/381.InsertDeleteGetRandomO(1)-Duplicatesallowed.md) +* [](/docs/LeetCode/382._linked_list_random_node.md) +* [](/docs/LeetCode/383._ransom_note.md) +* [](/docs/LeetCode/384.ShuffleanArray.md) +* [](/docs/LeetCode/387._first_unique_character_in_a_string.md) +* [](/docs/LeetCode/388._Longest_Absolute_File_Path.md) +* [](/docs/LeetCode/389._find_the_difference.md) +* [](/docs/LeetCode/392._is_subsequence.md) +* [](/docs/LeetCode/394._decode_string.md) +* [](/docs/LeetCode/400.NthDigit.md) +* [](/docs/LeetCode/401._binary_watch.md) +* [](/docs/LeetCode/404._sum_of_left_leaves.md) +* [](/docs/LeetCode/405.ConvertaNumbertoHexadecimal.md) +* [](/docs/LeetCode/406._Queue_Reconstruction_by_Height.md) +* [](/docs/LeetCode/412._fizz_buzz.md) +* [](/docs/LeetCode/413.ArithmeticSlices.md) +* [](/docs/LeetCode/414._third_maximum_number.md) +* [](/docs/LeetCode/415._add_strings.md) +* [](/docs/LeetCode/416.PartitionEqualSubsetSum.md) +* [](/docs/LeetCode/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md) +* [](/docs/LeetCode/422.ValidWordSquare.md) +* [](/docs/LeetCode/434._number_of_segments_in_a_string.md) +* [](/docs/LeetCode/437._path_sum_iii.md) +* [](/docs/LeetCode/438._Find_All_Anagrams_in_a_String.md) +* [](/docs/LeetCode/439.TernaryExpressionParser.md) +* [](/docs/LeetCode/441._arranging_coins.md) +* [](/docs/LeetCode/448._Find_All_Numbers_Disappeared_in_an_Array.md) +* [](/docs/LeetCode/450.DeleteNodeinaBST.md) +* [](/docs/LeetCode/453._Minimum_Moves_to_Equal_Array_Elements.md) +* [](/docs/LeetCode/459._Repeated_Substring_Pattern.md) +* [](/docs/LeetCode/461._HammingDistance.md) +* [](/docs/LeetCode/463._Island_Perimeter.md) +* [](/docs/LeetCode/467._Unique_Substrings_in_Wraparound_String.md) +* [](/docs/LeetCode/469.ConvexPolygon.md) +* [](/docs/LeetCode/476._Number_Complement.md) +* [](/docs/LeetCode/477._Total_Hamming_Distance.md) +* [](/docs/LeetCode/485._Max_Consecutive_Ones.md) +* [](/docs/LeetCode/587._Erect_the_Fence.md) +* [](/docs/LeetCode/599._Minimum_Index_Sum_of_Two_Lists.md) +* [](/docs/LeetCode/647._Palindromic_Substrings.md) +* [](/docs/LeetCode/657._Judge_Route_Circle.md) +* [](/docs/LeetCode/665._Non-decreasing_Array.md) +* [](/docs/LeetCode/672._Bulb_Switcher_II.md) +* [](/docs/LeetCode/681._Next_Closest_Time.md) +* [](/docs/LeetCode/682._Baseball_Game.md) +* [](/docs/LeetCode/687._Longest_Univalue_Path.md) +* [](/docs/LeetCode/740._delete_and_earn.md) +* [](/docs/LeetCode/760._Find_Anagram_Mappings.md) -8. [HiredInTech](https://www.hiredintech.com/) System Design 的总结特别适合入门 +## 推荐的一些LeetCode网站 +1. [KrisYu的GItuhub](https://github.com/KrisYu/LeetCode-CLRS-Python) +2. [kamyu104的Github](https://github.com/kamyu104/LeetCode) +3. [数据结构与算法/leetcode/lintcode题解](https://algorithm.yuanbin.me/zh-hans/) +4. [Leetcode 讨论区](https://discuss.leetcode.com/) +5. [visualgo算法可视化网站](https://visualgo.net/en) +6. [Data Structure Visualization](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) +7. [我的算法学习之路 - Lucida](http://zh.lucida.me/blog/on-learning-algorithms/) +8. [HiredInTech](https://www.hiredintech.com/) System Design 的总结特别适合入门 9. [mitcc的Github](https://github.com/mitcc/AlgoSolutions) - 10. [小土刀的面试刷题笔记](http://wdxtub.com/interview/14520594642530.html) - - - - - - - - 💪就是干! diff --git a/001._two_sum.md b/docs/001._two_sum.md similarity index 100% rename from 001._two_sum.md rename to docs/001._two_sum.md diff --git a/002._add_two_numbers.md b/docs/002._add_two_numbers.md similarity index 100% rename from 002._add_two_numbers.md rename to docs/002._add_two_numbers.md diff --git a/003._longest_substring_without_repeating_characters.md b/docs/003._longest_substring_without_repeating_characters.md similarity index 100% rename from 003._longest_substring_without_repeating_characters.md rename to docs/003._longest_substring_without_repeating_characters.md diff --git a/004._median_of_two_sorted_arrays.md b/docs/004._median_of_two_sorted_arrays.md similarity index 100% rename from 004._median_of_two_sorted_arrays.md rename to docs/004._median_of_two_sorted_arrays.md diff --git a/005._longest_palindromic_substring.md b/docs/005._longest_palindromic_substring.md similarity index 100% rename from 005._longest_palindromic_substring.md rename to docs/005._longest_palindromic_substring.md diff --git a/007._Reverse_Integer.md b/docs/007._Reverse_Integer.md similarity index 100% rename from 007._Reverse_Integer.md rename to docs/007._Reverse_Integer.md diff --git a/008._string_to_integer_(atoi).md b/docs/008._string_to_integer_(atoi).md similarity index 100% rename from 008._string_to_integer_(atoi).md rename to docs/008._string_to_integer_(atoi).md diff --git a/010._regular_expression_matching.md b/docs/010._regular_expression_matching.md similarity index 100% rename from 010._regular_expression_matching.md rename to docs/010._regular_expression_matching.md diff --git a/011._container_with_most_water.md b/docs/011._container_with_most_water.md similarity index 100% rename from 011._container_with_most_water.md rename to docs/011._container_with_most_water.md diff --git a/012._Integer_to_Roman.md b/docs/012._Integer_to_Roman.md similarity index 100% rename from 012._Integer_to_Roman.md rename to docs/012._Integer_to_Roman.md diff --git a/013._Roman_to_Integer.md b/docs/013._Roman_to_Integer.md similarity index 100% rename from 013._Roman_to_Integer.md rename to docs/013._Roman_to_Integer.md diff --git a/014._longest_common_prefix.md b/docs/014._longest_common_prefix.md similarity index 100% rename from 014._longest_common_prefix.md rename to docs/014._longest_common_prefix.md diff --git a/015._3sum.md b/docs/015._3sum.md similarity index 100% rename from 015._3sum.md rename to docs/015._3sum.md diff --git a/016._3sum_closest.md b/docs/016._3sum_closest.md similarity index 100% rename from 016._3sum_closest.md rename to docs/016._3sum_closest.md diff --git a/017._letter_combinations_of_a_phone_number.md b/docs/017._letter_combinations_of_a_phone_number.md similarity index 100% rename from 017._letter_combinations_of_a_phone_number.md rename to docs/017._letter_combinations_of_a_phone_number.md diff --git a/018._4sum.md b/docs/018._4sum.md similarity index 100% rename from 018._4sum.md rename to docs/018._4sum.md diff --git a/019._remove_nth_node_from_end_of_list.md b/docs/019._remove_nth_node_from_end_of_list.md similarity index 100% rename from 019._remove_nth_node_from_end_of_list.md rename to docs/019._remove_nth_node_from_end_of_list.md diff --git a/020._valid_parentheses.md b/docs/020._valid_parentheses.md similarity index 100% rename from 020._valid_parentheses.md rename to docs/020._valid_parentheses.md diff --git a/021._merge_two_sorted_lists.md b/docs/021._merge_two_sorted_lists.md similarity index 100% rename from 021._merge_two_sorted_lists.md rename to docs/021._merge_two_sorted_lists.md diff --git a/022._generate_parentheses.md b/docs/022._generate_parentheses.md similarity index 100% rename from 022._generate_parentheses.md rename to docs/022._generate_parentheses.md diff --git a/023._merge_k_sorted_lists.md b/docs/023._merge_k_sorted_lists.md similarity index 100% rename from 023._merge_k_sorted_lists.md rename to docs/023._merge_k_sorted_lists.md diff --git a/024._swap_nodes_in_pairs.md b/docs/024._swap_nodes_in_pairs.md similarity index 100% rename from 024._swap_nodes_in_pairs.md rename to docs/024._swap_nodes_in_pairs.md diff --git a/026._Remove_Duplicates_from_Sorted_Array.md b/docs/026._Remove_Duplicates_from_Sorted_Array.md similarity index 100% rename from 026._Remove_Duplicates_from_Sorted_Array.md rename to docs/026._Remove_Duplicates_from_Sorted_Array.md diff --git a/027._Remove_Element.md b/docs/027._Remove_Element.md similarity index 100% rename from 027._Remove_Element.md rename to docs/027._Remove_Element.md diff --git a/028._implement_strstr().md b/docs/028._implement_strstr().md similarity index 100% rename from 028._implement_strstr().md rename to docs/028._implement_strstr().md diff --git a/030._Substring_with_Concatenation_of_All_Words.md b/docs/030._Substring_with_Concatenation_of_All_Words.md similarity index 100% rename from 030._Substring_with_Concatenation_of_All_Words.md rename to docs/030._Substring_with_Concatenation_of_All_Words.md diff --git a/031._next_permutation.md b/docs/031._next_permutation.md similarity index 100% rename from 031._next_permutation.md rename to docs/031._next_permutation.md diff --git a/033._search_in_rotated_sorted_array.md b/docs/033._search_in_rotated_sorted_array.md similarity index 100% rename from 033._search_in_rotated_sorted_array.md rename to docs/033._search_in_rotated_sorted_array.md diff --git a/034._Search for a Range.md b/docs/034._Search for a Range.md similarity index 100% rename from 034._Search for a Range.md rename to docs/034._Search for a Range.md diff --git a/035._search_insert_position.md b/docs/035._search_insert_position.md similarity index 100% rename from 035._search_insert_position.md rename to docs/035._search_insert_position.md diff --git a/038._Count_and_Say.md b/docs/038._Count_and_Say.md similarity index 100% rename from 038._Count_and_Say.md rename to docs/038._Count_and_Say.md diff --git a/039._combination_sum.md b/docs/039._combination_sum.md similarity index 100% rename from 039._combination_sum.md rename to docs/039._combination_sum.md diff --git a/040._combination_sum_ii.md b/docs/040._combination_sum_ii.md similarity index 100% rename from 040._combination_sum_ii.md rename to docs/040._combination_sum_ii.md diff --git a/042._trapping_rain_water.md b/docs/042._trapping_rain_water.md similarity index 100% rename from 042._trapping_rain_water.md rename to docs/042._trapping_rain_water.md diff --git a/043._multiply_strings.md b/docs/043._multiply_strings.md similarity index 100% rename from 043._multiply_strings.md rename to docs/043._multiply_strings.md diff --git a/044._wildcard_matching.md b/docs/044._wildcard_matching.md similarity index 100% rename from 044._wildcard_matching.md rename to docs/044._wildcard_matching.md diff --git a/045._Jump_Game_II.md b/docs/045._Jump_Game_II.md similarity index 100% rename from 045._Jump_Game_II.md rename to docs/045._Jump_Game_II.md diff --git a/046._permutations.md b/docs/046._permutations.md similarity index 100% rename from 046._permutations.md rename to docs/046._permutations.md diff --git a/047._permutations_ii.md b/docs/047._permutations_ii.md similarity index 100% rename from 047._permutations_ii.md rename to docs/047._permutations_ii.md diff --git a/048._rotate_image.md b/docs/048._rotate_image.md similarity index 100% rename from 048._rotate_image.md rename to docs/048._rotate_image.md diff --git a/049._group_anagrams_python.md b/docs/049._group_anagrams_python.md similarity index 100% rename from 049._group_anagrams_python.md rename to docs/049._group_anagrams_python.md diff --git a/050._pow(x,_n).md b/docs/050._pow(x,_n).md similarity index 100% rename from 050._pow(x,_n).md rename to docs/050._pow(x,_n).md diff --git a/051._n-queens.md b/docs/051._n-queens.md similarity index 100% rename from 051._n-queens.md rename to docs/051._n-queens.md diff --git a/052._n-queens_ii.md b/docs/052._n-queens_ii.md similarity index 100% rename from 052._n-queens_ii.md rename to docs/052._n-queens_ii.md diff --git a/053._maximum_subarray.md b/docs/053._maximum_subarray.md similarity index 100% rename from 053._maximum_subarray.md rename to docs/053._maximum_subarray.md diff --git a/054._spiral_matrix.md b/docs/054._spiral_matrix.md similarity index 100% rename from 054._spiral_matrix.md rename to docs/054._spiral_matrix.md diff --git a/055._jump_game.md b/docs/055._jump_game.md similarity index 100% rename from 055._jump_game.md rename to docs/055._jump_game.md diff --git a/056._Merge_Intervals.md b/docs/056._Merge_Intervals.md similarity index 100% rename from 056._Merge_Intervals.md rename to docs/056._Merge_Intervals.md diff --git a/058._length_of_last_word.md b/docs/058._length_of_last_word.md similarity index 100% rename from 058._length_of_last_word.md rename to docs/058._length_of_last_word.md diff --git a/059._spiral_matrix_ii.md b/docs/059._spiral_matrix_ii.md similarity index 100% rename from 059._spiral_matrix_ii.md rename to docs/059._spiral_matrix_ii.md diff --git a/060._permutation_sequence.md b/docs/060._permutation_sequence.md similarity index 100% rename from 060._permutation_sequence.md rename to docs/060._permutation_sequence.md diff --git a/061._rotate_list.md b/docs/061._rotate_list.md similarity index 100% rename from 061._rotate_list.md rename to docs/061._rotate_list.md diff --git a/064._minimum_path_sum.md b/docs/064._minimum_path_sum.md similarity index 100% rename from 064._minimum_path_sum.md rename to docs/064._minimum_path_sum.md diff --git a/065.unique_paths_ii.md b/docs/065.unique_paths_ii.md similarity index 100% rename from 065.unique_paths_ii.md rename to docs/065.unique_paths_ii.md diff --git a/066._plus_one.md b/docs/066._plus_one.md similarity index 100% rename from 066._plus_one.md rename to docs/066._plus_one.md diff --git a/067._add_binary.md b/docs/067._add_binary.md similarity index 100% rename from 067._add_binary.md rename to docs/067._add_binary.md diff --git a/069._sqrt(x).md b/docs/069._sqrt(x).md similarity index 100% rename from 069._sqrt(x).md rename to docs/069._sqrt(x).md diff --git a/070. Climbing Stairs.md b/docs/070. Climbing Stairs.md similarity index 100% rename from 070. Climbing Stairs.md rename to docs/070. Climbing Stairs.md diff --git a/072._edit_distance.md b/docs/072._edit_distance.md similarity index 100% rename from 072._edit_distance.md rename to docs/072._edit_distance.md diff --git a/073. Set Matrix Zeroes.md b/docs/073. Set Matrix Zeroes.md similarity index 100% rename from 073. Set Matrix Zeroes.md rename to docs/073. Set Matrix Zeroes.md diff --git a/074._search_a_2d_matrix.md b/docs/074._search_a_2d_matrix.md similarity index 100% rename from 074._search_a_2d_matrix.md rename to docs/074._search_a_2d_matrix.md diff --git a/075._sort_colors.md b/docs/075._sort_colors.md similarity index 100% rename from 075._sort_colors.md rename to docs/075._sort_colors.md diff --git a/076._Minimum_Window_Substring.md b/docs/076._Minimum_Window_Substring.md similarity index 100% rename from 076._Minimum_Window_Substring.md rename to docs/076._Minimum_Window_Substring.md diff --git a/077._combinations.md b/docs/077._combinations.md similarity index 100% rename from 077._combinations.md rename to docs/077._combinations.md diff --git a/078.Subsets .md b/docs/078.Subsets .md similarity index 100% rename from 078.Subsets .md rename to docs/078.Subsets .md diff --git a/079._word_search.md b/docs/079._word_search.md similarity index 100% rename from 079._word_search.md rename to docs/079._word_search.md diff --git a/082._remove_duplicates_from_sorted_list_ii.md b/docs/082._remove_duplicates_from_sorted_list_ii.md similarity index 100% rename from 082._remove_duplicates_from_sorted_list_ii.md rename to docs/082._remove_duplicates_from_sorted_list_ii.md diff --git a/083._remove_duplicates_from_sorted_list.md b/docs/083._remove_duplicates_from_sorted_list.md similarity index 100% rename from 083._remove_duplicates_from_sorted_list.md rename to docs/083._remove_duplicates_from_sorted_list.md diff --git a/086._partition_list.md b/docs/086._partition_list.md similarity index 100% rename from 086._partition_list.md rename to docs/086._partition_list.md diff --git a/088._merge_sorted_array.md b/docs/088._merge_sorted_array.md similarity index 100% rename from 088._merge_sorted_array.md rename to docs/088._merge_sorted_array.md diff --git a/089._gray_code.md b/docs/089._gray_code.md similarity index 100% rename from 089._gray_code.md rename to docs/089._gray_code.md diff --git a/090._subsets_ii.md b/docs/090._subsets_ii.md similarity index 100% rename from 090._subsets_ii.md rename to docs/090._subsets_ii.md diff --git a/091._decode_ways.md b/docs/091._decode_ways.md similarity index 100% rename from 091._decode_ways.md rename to docs/091._decode_ways.md diff --git a/092._reverse_linked_list_ii.md b/docs/092._reverse_linked_list_ii.md similarity index 100% rename from 092._reverse_linked_list_ii.md rename to docs/092._reverse_linked_list_ii.md diff --git a/093._restore_ip_addresses.md b/docs/093._restore_ip_addresses.md similarity index 100% rename from 093._restore_ip_addresses.md rename to docs/093._restore_ip_addresses.md diff --git a/094._binary_tree_inorder_traversal.md b/docs/094._binary_tree_inorder_traversal.md similarity index 100% rename from 094._binary_tree_inorder_traversal.md rename to docs/094._binary_tree_inorder_traversal.md diff --git a/096._unique_binary_search_trees.md b/docs/096._unique_binary_search_trees.md similarity index 100% rename from 096._unique_binary_search_trees.md rename to docs/096._unique_binary_search_trees.md diff --git a/098._validate_binary_search_tree.md b/docs/098._validate_binary_search_tree.md similarity index 100% rename from 098._validate_binary_search_tree.md rename to docs/098._validate_binary_search_tree.md diff --git a/100._same_tree.md b/docs/100._same_tree.md similarity index 100% rename from 100._same_tree.md rename to docs/100._same_tree.md diff --git a/101._symmetric_tree.md b/docs/101._symmetric_tree.md similarity index 100% rename from 101._symmetric_tree.md rename to docs/101._symmetric_tree.md diff --git a/102._binary_tree_level_order_traversal.md b/docs/102._binary_tree_level_order_traversal.md similarity index 100% rename from 102._binary_tree_level_order_traversal.md rename to docs/102._binary_tree_level_order_traversal.md diff --git a/103._binary_tree_zigzag_level_order_traversal.md b/docs/103._binary_tree_zigzag_level_order_traversal.md similarity index 100% rename from 103._binary_tree_zigzag_level_order_traversal.md rename to docs/103._binary_tree_zigzag_level_order_traversal.md diff --git a/104._maximum_depth_of_binary_tree.md b/docs/104._maximum_depth_of_binary_tree.md similarity index 100% rename from 104._maximum_depth_of_binary_tree.md rename to docs/104._maximum_depth_of_binary_tree.md diff --git a/105._construct_binary_tree_from_preorder_and_inorder_traversal.md b/docs/105._construct_binary_tree_from_preorder_and_inorder_traversal.md similarity index 100% rename from 105._construct_binary_tree_from_preorder_and_inorder_traversal.md rename to docs/105._construct_binary_tree_from_preorder_and_inorder_traversal.md diff --git a/106._construct_binary_tree_from_inorder_and_postorder_traversal.md b/docs/106._construct_binary_tree_from_inorder_and_postorder_traversal.md similarity index 100% rename from 106._construct_binary_tree_from_inorder_and_postorder_traversal.md rename to docs/106._construct_binary_tree_from_inorder_and_postorder_traversal.md diff --git a/107._binary_tree_level_order_traversal_ii.md b/docs/107._binary_tree_level_order_traversal_ii.md similarity index 100% rename from 107._binary_tree_level_order_traversal_ii.md rename to docs/107._binary_tree_level_order_traversal_ii.md diff --git a/108._convert_sorted_array_to_binary_search_tree.md b/docs/108._convert_sorted_array_to_binary_search_tree.md similarity index 100% rename from 108._convert_sorted_array_to_binary_search_tree.md rename to docs/108._convert_sorted_array_to_binary_search_tree.md diff --git a/109._convert_sorted_list_to_binary_search_tree.md b/docs/109._convert_sorted_list_to_binary_search_tree.md similarity index 100% rename from 109._convert_sorted_list_to_binary_search_tree.md rename to docs/109._convert_sorted_list_to_binary_search_tree.md diff --git a/110._balanced_binary_tree.md b/docs/110._balanced_binary_tree.md similarity index 100% rename from 110._balanced_binary_tree.md rename to docs/110._balanced_binary_tree.md diff --git a/111._minimum_depth_of_binary_tree.md b/docs/111._minimum_depth_of_binary_tree.md similarity index 100% rename from 111._minimum_depth_of_binary_tree.md rename to docs/111._minimum_depth_of_binary_tree.md diff --git a/112._path_sum.md b/docs/112._path_sum.md similarity index 100% rename from 112._path_sum.md rename to docs/112._path_sum.md diff --git a/113._path_sum_ii.md b/docs/113._path_sum_ii.md similarity index 100% rename from 113._path_sum_ii.md rename to docs/113._path_sum_ii.md diff --git a/114._flatten_binary_tree_to_linked_list.md b/docs/114._flatten_binary_tree_to_linked_list.md similarity index 100% rename from 114._flatten_binary_tree_to_linked_list.md rename to docs/114._flatten_binary_tree_to_linked_list.md diff --git a/116._populating_next_right_pointers_in_each_node.md b/docs/116._populating_next_right_pointers_in_each_node.md similarity index 100% rename from 116._populating_next_right_pointers_in_each_node.md rename to docs/116._populating_next_right_pointers_in_each_node.md diff --git a/118._pascal's_triangle.md b/docs/118._pascal's_triangle.md similarity index 100% rename from 118._pascal's_triangle.md rename to docs/118._pascal's_triangle.md diff --git a/119. Pascal's Triangle II.md b/docs/119. Pascal's Triangle II.md similarity index 100% rename from 119. Pascal's Triangle II.md rename to docs/119. Pascal's Triangle II.md diff --git a/120. Triangle.md b/docs/120. Triangle.md similarity index 100% rename from 120. Triangle.md rename to docs/120. Triangle.md diff --git a/121._Best_Time_to_Buy_and_Sell_Stock.md b/docs/121._Best_Time_to_Buy_and_Sell_Stock.md similarity index 100% rename from 121._Best_Time_to_Buy_and_Sell_Stock.md rename to docs/121._Best_Time_to_Buy_and_Sell_Stock.md diff --git a/125._valid_palindrome.md b/docs/125._valid_palindrome.md similarity index 100% rename from 125._valid_palindrome.md rename to docs/125._valid_palindrome.md diff --git a/126. Word Ladder II.md b/docs/126. Word Ladder II.md similarity index 100% rename from 126. Word Ladder II.md rename to docs/126. Word Ladder II.md diff --git a/127._word_ladder.md b/docs/127._word_ladder.md similarity index 100% rename from 127._word_ladder.md rename to docs/127._word_ladder.md diff --git a/128._Longest_Consecutive_Sequence.md b/docs/128._Longest_Consecutive_Sequence.md similarity index 100% rename from 128._Longest_Consecutive_Sequence.md rename to docs/128._Longest_Consecutive_Sequence.md diff --git a/129._sum_root_to_leaf_numbers.md b/docs/129._sum_root_to_leaf_numbers.md similarity index 100% rename from 129._sum_root_to_leaf_numbers.md rename to docs/129._sum_root_to_leaf_numbers.md diff --git a/130._surrounded_regions.md b/docs/130._surrounded_regions.md similarity index 100% rename from 130._surrounded_regions.md rename to docs/130._surrounded_regions.md diff --git a/131._palindrome_partitioning.md b/docs/131._palindrome_partitioning.md similarity index 100% rename from 131._palindrome_partitioning.md rename to docs/131._palindrome_partitioning.md diff --git a/133._clone_graph.md b/docs/133._clone_graph.md similarity index 100% rename from 133._clone_graph.md rename to docs/133._clone_graph.md diff --git a/136._single_number.md b/docs/136._single_number.md similarity index 100% rename from 136._single_number.md rename to docs/136._single_number.md diff --git a/139._word_break.md b/docs/139._word_break.md similarity index 100% rename from 139._word_break.md rename to docs/139._word_break.md diff --git a/140._word_break_ii.md b/docs/140._word_break_ii.md similarity index 100% rename from 140._word_break_ii.md rename to docs/140._word_break_ii.md diff --git a/141._linked_list_cycle.md b/docs/141._linked_list_cycle.md similarity index 100% rename from 141._linked_list_cycle.md rename to docs/141._linked_list_cycle.md diff --git a/142_Linked_List_Cycle_II.md b/docs/142_Linked_List_Cycle_II.md similarity index 100% rename from 142_Linked_List_Cycle_II.md rename to docs/142_Linked_List_Cycle_II.md diff --git a/143._reorder_list.md b/docs/143._reorder_list.md similarity index 100% rename from 143._reorder_list.md rename to docs/143._reorder_list.md diff --git a/144._binary_tree_preorder_traversal.md b/docs/144._binary_tree_preorder_traversal.md similarity index 100% rename from 144._binary_tree_preorder_traversal.md rename to docs/144._binary_tree_preorder_traversal.md diff --git a/145._binary_tree_postorder_traversal.md b/docs/145._binary_tree_postorder_traversal.md similarity index 100% rename from 145._binary_tree_postorder_traversal.md rename to docs/145._binary_tree_postorder_traversal.md diff --git a/147._insertion_sort_list.md b/docs/147._insertion_sort_list.md similarity index 100% rename from 147._insertion_sort_list.md rename to docs/147._insertion_sort_list.md diff --git a/148._sort_list.md b/docs/148._sort_list.md similarity index 100% rename from 148._sort_list.md rename to docs/148._sort_list.md diff --git a/150._evaluate_reverse_polish_notation.md b/docs/150._evaluate_reverse_polish_notation.md similarity index 100% rename from 150._evaluate_reverse_polish_notation.md rename to docs/150._evaluate_reverse_polish_notation.md diff --git a/151._reverse_words_in_a_string.md b/docs/151._reverse_words_in_a_string.md similarity index 100% rename from 151._reverse_words_in_a_string.md rename to docs/151._reverse_words_in_a_string.md diff --git a/152._maximum_product_subarray.md b/docs/152._maximum_product_subarray.md similarity index 100% rename from 152._maximum_product_subarray.md rename to docs/152._maximum_product_subarray.md diff --git a/153._find_minimum_in_rotated_sorted_array.md b/docs/153._find_minimum_in_rotated_sorted_array.md similarity index 100% rename from 153._find_minimum_in_rotated_sorted_array.md rename to docs/153._find_minimum_in_rotated_sorted_array.md diff --git a/155._min_stack.md b/docs/155._min_stack.md similarity index 100% rename from 155._min_stack.md rename to docs/155._min_stack.md diff --git a/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md b/docs/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md similarity index 100% rename from 159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md rename to docs/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md diff --git a/160._intersection_of_two_linked_lists.md b/docs/160._intersection_of_two_linked_lists.md similarity index 100% rename from 160._intersection_of_two_linked_lists.md rename to docs/160._intersection_of_two_linked_lists.md diff --git a/162._find_peak_element.md b/docs/162._find_peak_element.md similarity index 100% rename from 162._find_peak_element.md rename to docs/162._find_peak_element.md diff --git a/165._compare_version_numbers.md b/docs/165._compare_version_numbers.md similarity index 100% rename from 165._compare_version_numbers.md rename to docs/165._compare_version_numbers.md diff --git a/166._Fraction_to_Recurring_Decimal.md b/docs/166._Fraction_to_Recurring_Decimal.md similarity index 100% rename from 166._Fraction_to_Recurring_Decimal.md rename to docs/166._Fraction_to_Recurring_Decimal.md diff --git a/167._two_sum_ii_-_input_array_is_sorted.md b/docs/167._two_sum_ii_-_input_array_is_sorted.md similarity index 100% rename from 167._two_sum_ii_-_input_array_is_sorted.md rename to docs/167._two_sum_ii_-_input_array_is_sorted.md diff --git a/168._excel_sheet_column_title.md b/docs/168._excel_sheet_column_title.md similarity index 100% rename from 168._excel_sheet_column_title.md rename to docs/168._excel_sheet_column_title.md diff --git a/169._majority_element.md b/docs/169._majority_element.md similarity index 100% rename from 169._majority_element.md rename to docs/169._majority_element.md diff --git a/171._excel_sheet_column_number.md b/docs/171._excel_sheet_column_number.md similarity index 100% rename from 171._excel_sheet_column_number.md rename to docs/171._excel_sheet_column_number.md diff --git a/173._binary_search_tree_iterator.md b/docs/173._binary_search_tree_iterator.md similarity index 100% rename from 173._binary_search_tree_iterator.md rename to docs/173._binary_search_tree_iterator.md diff --git a/189._rotate_array.md b/docs/189._rotate_array.md similarity index 100% rename from 189._rotate_array.md rename to docs/189._rotate_array.md diff --git a/191._number_of_1_bits.md b/docs/191._number_of_1_bits.md similarity index 100% rename from 191._number_of_1_bits.md rename to docs/191._number_of_1_bits.md diff --git a/198._house_robber.md b/docs/198._house_robber.md similarity index 100% rename from 198._house_robber.md rename to docs/198._house_robber.md diff --git a/199._binary_tree_right_side_view.md b/docs/199._binary_tree_right_side_view.md similarity index 100% rename from 199._binary_tree_right_side_view.md rename to docs/199._binary_tree_right_side_view.md diff --git a/200._number_of_islands.md b/docs/200._number_of_islands.md similarity index 100% rename from 200._number_of_islands.md rename to docs/200._number_of_islands.md diff --git a/203._remove_linked_list_elements.md b/docs/203._remove_linked_list_elements.md similarity index 100% rename from 203._remove_linked_list_elements.md rename to docs/203._remove_linked_list_elements.md diff --git a/204._count_primes.md b/docs/204._count_primes.md similarity index 100% rename from 204._count_primes.md rename to docs/204._count_primes.md diff --git a/205._isomorphic_strings.md b/docs/205._isomorphic_strings.md similarity index 100% rename from 205._isomorphic_strings.md rename to docs/205._isomorphic_strings.md diff --git a/206._reverse_linked_list.md b/docs/206._reverse_linked_list.md similarity index 100% rename from 206._reverse_linked_list.md rename to docs/206._reverse_linked_list.md diff --git a/207._course_schedule.md b/docs/207._course_schedule.md similarity index 100% rename from 207._course_schedule.md rename to docs/207._course_schedule.md diff --git a/208._implement_trie_(prefix_tree).md b/docs/208._implement_trie_(prefix_tree).md similarity index 100% rename from 208._implement_trie_(prefix_tree).md rename to docs/208._implement_trie_(prefix_tree).md diff --git a/210._course_schedule_ii.md b/docs/210._course_schedule_ii.md similarity index 100% rename from 210._course_schedule_ii.md rename to docs/210._course_schedule_ii.md diff --git a/211. Add and Search Word - Data structure design.md b/docs/211. Add and Search Word - Data structure design.md similarity index 100% rename from 211. Add and Search Word - Data structure design.md rename to docs/211. Add and Search Word - Data structure design.md diff --git a/213._house_robber_ii.md b/docs/213._house_robber_ii.md similarity index 100% rename from 213._house_robber_ii.md rename to docs/213._house_robber_ii.md diff --git a/216._combination_sum_iii.md b/docs/216._combination_sum_iii.md similarity index 100% rename from 216._combination_sum_iii.md rename to docs/216._combination_sum_iii.md diff --git a/217._contains_duplicate.md b/docs/217._contains_duplicate.md similarity index 100% rename from 217._contains_duplicate.md rename to docs/217._contains_duplicate.md diff --git a/218._The _Skyline_Problem .md b/docs/218._The _Skyline_Problem .md similarity index 100% rename from 218._The _Skyline_Problem .md rename to docs/218._The _Skyline_Problem .md diff --git a/219._contains_duplicate_ii.md b/docs/219._contains_duplicate_ii.md similarity index 100% rename from 219._contains_duplicate_ii.md rename to docs/219._contains_duplicate_ii.md diff --git a/221._maximal_square.md b/docs/221._maximal_square.md similarity index 100% rename from 221._maximal_square.md rename to docs/221._maximal_square.md diff --git a/222._count_complete_tree_nodes.md b/docs/222._count_complete_tree_nodes.md similarity index 100% rename from 222._count_complete_tree_nodes.md rename to docs/222._count_complete_tree_nodes.md diff --git a/223._rectangle_area.md b/docs/223._rectangle_area.md similarity index 100% rename from 223._rectangle_area.md rename to docs/223._rectangle_area.md diff --git a/224. Basic Calculator .md b/docs/224. Basic Calculator .md similarity index 100% rename from 224. Basic Calculator .md rename to docs/224. Basic Calculator .md diff --git a/225._implement_stack_using_queues.md b/docs/225._implement_stack_using_queues.md similarity index 100% rename from 225._implement_stack_using_queues.md rename to docs/225._implement_stack_using_queues.md diff --git a/226._invert_binary_tree.md b/docs/226._invert_binary_tree.md similarity index 100% rename from 226._invert_binary_tree.md rename to docs/226._invert_binary_tree.md diff --git a/227._basic_calculator_ii.md b/docs/227._basic_calculator_ii.md similarity index 100% rename from 227._basic_calculator_ii.md rename to docs/227._basic_calculator_ii.md diff --git a/228._summary_ranges.md b/docs/228._summary_ranges.md similarity index 100% rename from 228._summary_ranges.md rename to docs/228._summary_ranges.md diff --git a/229._majority_element_ii.md b/docs/229._majority_element_ii.md similarity index 100% rename from 229._majority_element_ii.md rename to docs/229._majority_element_ii.md diff --git a/230._kth_smallest_element_in_a_bst.md b/docs/230._kth_smallest_element_in_a_bst.md similarity index 100% rename from 230._kth_smallest_element_in_a_bst.md rename to docs/230._kth_smallest_element_in_a_bst.md diff --git a/231. _Power_of_Two.md b/docs/231. _Power_of_Two.md similarity index 100% rename from 231. _Power_of_Two.md rename to docs/231. _Power_of_Two.md diff --git a/232._implement_queue_using_stacks.md b/docs/232._implement_queue_using_stacks.md similarity index 100% rename from 232._implement_queue_using_stacks.md rename to docs/232._implement_queue_using_stacks.md diff --git a/234._palindrome_linked_list.md b/docs/234._palindrome_linked_list.md similarity index 100% rename from 234._palindrome_linked_list.md rename to docs/234._palindrome_linked_list.md diff --git a/235._lowest_common_ancestor_of_a_binary_search_tree.md b/docs/235._lowest_common_ancestor_of_a_binary_search_tree.md similarity index 100% rename from 235._lowest_common_ancestor_of_a_binary_search_tree.md rename to docs/235._lowest_common_ancestor_of_a_binary_search_tree.md diff --git a/236._lowest_common_ancestor_of_a_binary_tree.md b/docs/236._lowest_common_ancestor_of_a_binary_tree.md similarity index 100% rename from 236._lowest_common_ancestor_of_a_binary_tree.md rename to docs/236._lowest_common_ancestor_of_a_binary_tree.md diff --git a/237._delete_node_in_a_linked_list.md b/docs/237._delete_node_in_a_linked_list.md similarity index 100% rename from 237._delete_node_in_a_linked_list.md rename to docs/237._delete_node_in_a_linked_list.md diff --git a/238._product_of_array_except_self.md b/docs/238._product_of_array_except_self.md similarity index 100% rename from 238._product_of_array_except_self.md rename to docs/238._product_of_array_except_self.md diff --git a/240._search_a_2d_matrix_ii.md b/docs/240._search_a_2d_matrix_ii.md similarity index 100% rename from 240._search_a_2d_matrix_ii.md rename to docs/240._search_a_2d_matrix_ii.md diff --git a/242._valid_anagram.md b/docs/242._valid_anagram.md similarity index 100% rename from 242._valid_anagram.md rename to docs/242._valid_anagram.md diff --git a/252. Meeting Rooms.md b/docs/252. Meeting Rooms.md similarity index 100% rename from 252. Meeting Rooms.md rename to docs/252. Meeting Rooms.md diff --git a/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md b/docs/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md similarity index 100% rename from 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md rename to docs/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md diff --git a/256. Paint House.md b/docs/256. Paint House.md similarity index 100% rename from 256. Paint House.md rename to docs/256. Paint House.md diff --git a/257._binary_tree_paths.md b/docs/257._binary_tree_paths.md similarity index 100% rename from 257._binary_tree_paths.md rename to docs/257._binary_tree_paths.md diff --git a/258_ Add_Digits.md b/docs/258_ Add_Digits.md similarity index 100% rename from 258_ Add_Digits.md rename to docs/258_ Add_Digits.md diff --git a/261. Graph Valid Tree.md b/docs/261. Graph Valid Tree.md similarity index 100% rename from 261. Graph Valid Tree.md rename to docs/261. Graph Valid Tree.md diff --git a/263._ugly_number.md b/docs/263._ugly_number.md similarity index 100% rename from 263._ugly_number.md rename to docs/263._ugly_number.md diff --git a/264._ugly_number_ii.md b/docs/264._ugly_number_ii.md similarity index 100% rename from 264._ugly_number_ii.md rename to docs/264._ugly_number_ii.md diff --git a/265. Paint House II.md b/docs/265. Paint House II.md similarity index 100% rename from 265. Paint House II.md rename to docs/265. Paint House II.md diff --git a/266. Palindrome Permutation.md b/docs/266. Palindrome Permutation.md similarity index 100% rename from 266. Palindrome Permutation.md rename to docs/266. Palindrome Permutation.md diff --git a/267. Palindrome Permutation II.md b/docs/267. Palindrome Permutation II.md similarity index 100% rename from 267. Palindrome Permutation II.md rename to docs/267. Palindrome Permutation II.md diff --git a/268._missing_number.md b/docs/268._missing_number.md similarity index 100% rename from 268._missing_number.md rename to docs/268._missing_number.md diff --git a/270. Closest Binary Search Tree Value.md b/docs/270. Closest Binary Search Tree Value.md similarity index 100% rename from 270. Closest Binary Search Tree Value.md rename to docs/270. Closest Binary Search Tree Value.md diff --git a/276. Paint Fence.md b/docs/276. Paint Fence.md similarity index 100% rename from 276. Paint Fence.md rename to docs/276. Paint Fence.md diff --git a/277. Find the Celebrity.md b/docs/277. Find the Celebrity.md similarity index 100% rename from 277. Find the Celebrity.md rename to docs/277. Find the Celebrity.md diff --git a/278._First_Bad _Version.md b/docs/278._First_Bad _Version.md similarity index 100% rename from 278._First_Bad _Version.md rename to docs/278._First_Bad _Version.md diff --git a/279._perfect_squares.md b/docs/279._perfect_squares.md similarity index 100% rename from 279._perfect_squares.md rename to docs/279._perfect_squares.md diff --git a/280._Wiggle_Sort.md b/docs/280._Wiggle_Sort.md similarity index 100% rename from 280._Wiggle_Sort.md rename to docs/280._Wiggle_Sort.md diff --git a/283._move_zeroes.md b/docs/283._move_zeroes.md similarity index 100% rename from 283._move_zeroes.md rename to docs/283._move_zeroes.md diff --git a/285._inorder_successor_in_bst.md b/docs/285._inorder_successor_in_bst.md similarity index 100% rename from 285._inorder_successor_in_bst.md rename to docs/285._inorder_successor_in_bst.md diff --git a/286. Walls and Gates.md b/docs/286. Walls and Gates.md similarity index 100% rename from 286. Walls and Gates.md rename to docs/286. Walls and Gates.md diff --git a/289._game_of_life.md b/docs/289._game_of_life.md similarity index 100% rename from 289._game_of_life.md rename to docs/289._game_of_life.md diff --git a/290._word_pattern.md b/docs/290._word_pattern.md similarity index 100% rename from 290._word_pattern.md rename to docs/290._word_pattern.md diff --git a/292._nim_game.md b/docs/292._nim_game.md similarity index 100% rename from 292._nim_game.md rename to docs/292._nim_game.md diff --git a/296. Best Meeting Point.md b/docs/296. Best Meeting Point.md similarity index 100% rename from 296. Best Meeting Point.md rename to docs/296. Best Meeting Point.md diff --git a/298. Binary Tree Longest Consecutive Sequence.md b/docs/298. Binary Tree Longest Consecutive Sequence.md similarity index 100% rename from 298. Binary Tree Longest Consecutive Sequence.md rename to docs/298. Binary Tree Longest Consecutive Sequence.md diff --git a/299._bulls_and_cows.md b/docs/299._bulls_and_cows.md similarity index 100% rename from 299._bulls_and_cows.md rename to docs/299._bulls_and_cows.md diff --git a/300._longest_increasing_subsequence.md b/docs/300._longest_increasing_subsequence.md similarity index 100% rename from 300._longest_increasing_subsequence.md rename to docs/300._longest_increasing_subsequence.md diff --git a/303._range_sum_query_-_immutable.md b/docs/303._range_sum_query_-_immutable.md similarity index 100% rename from 303._range_sum_query_-_immutable.md rename to docs/303._range_sum_query_-_immutable.md diff --git a/316._Remove_Duplicate_Letters.md b/docs/316._Remove_Duplicate_Letters.md similarity index 100% rename from 316._Remove_Duplicate_Letters.md rename to docs/316._Remove_Duplicate_Letters.md diff --git a/319._Bulb_Switcher.md b/docs/319._Bulb_Switcher.md similarity index 100% rename from 319._Bulb_Switcher.md rename to docs/319._Bulb_Switcher.md diff --git a/322. Coin Change.md b/docs/322. Coin Change.md similarity index 100% rename from 322. Coin Change.md rename to docs/322. Coin Change.md diff --git a/323. Number of Connected Components in an Undirected Graph.md b/docs/323. Number of Connected Components in an Undirected Graph.md similarity index 100% rename from 323. Number of Connected Components in an Undirected Graph.md rename to docs/323. Number of Connected Components in an Undirected Graph.md diff --git a/324._Wiggle_Sort_II.md b/docs/324._Wiggle_Sort_II.md similarity index 100% rename from 324._Wiggle_Sort_II.md rename to docs/324._Wiggle_Sort_II.md diff --git a/326._power_of_three.md b/docs/326._power_of_three.md similarity index 100% rename from 326._power_of_three.md rename to docs/326._power_of_three.md diff --git a/328._odd_even_linked_list.md b/docs/328._odd_even_linked_list.md similarity index 100% rename from 328._odd_even_linked_list.md rename to docs/328._odd_even_linked_list.md diff --git a/334._increasing_triplet_subsequence.md b/docs/334._increasing_triplet_subsequence.md similarity index 100% rename from 334._increasing_triplet_subsequence.md rename to docs/334._increasing_triplet_subsequence.md diff --git a/337._house_robber_iii.md b/docs/337._house_robber_iii.md similarity index 100% rename from 337._house_robber_iii.md rename to docs/337._house_robber_iii.md diff --git a/338. Counting Bits.md b/docs/338. Counting Bits.md similarity index 100% rename from 338. Counting Bits.md rename to docs/338. Counting Bits.md diff --git a/339. Nested List Weight Sum.md b/docs/339. Nested List Weight Sum.md similarity index 100% rename from 339. Nested List Weight Sum.md rename to docs/339. Nested List Weight Sum.md diff --git a/341._Flatten_Nested_List_Iterator.md b/docs/341._Flatten_Nested_List_Iterator.md similarity index 100% rename from 341._Flatten_Nested_List_Iterator.md rename to docs/341._Flatten_Nested_List_Iterator.md diff --git a/342._Power_of_Four.md b/docs/342._Power_of_Four.md similarity index 100% rename from 342._Power_of_Four.md rename to docs/342._Power_of_Four.md diff --git a/344._reverse_string.md b/docs/344._reverse_string.md similarity index 100% rename from 344._reverse_string.md rename to docs/344._reverse_string.md diff --git a/345._Reverse_Vowels_of_a_String.md b/docs/345._Reverse_Vowels_of_a_String.md similarity index 100% rename from 345._Reverse_Vowels_of_a_String.md rename to docs/345._Reverse_Vowels_of_a_String.md diff --git a/349._intersection_of_two_arrays.md b/docs/349._intersection_of_two_arrays.md similarity index 100% rename from 349._intersection_of_two_arrays.md rename to docs/349._intersection_of_two_arrays.md diff --git a/350._intersection_of_two_arrays_ii.md b/docs/350._intersection_of_two_arrays_ii.md similarity index 100% rename from 350._intersection_of_two_arrays_ii.md rename to docs/350._intersection_of_two_arrays_ii.md diff --git a/353. Design Snake Game.md b/docs/353. Design Snake Game.md similarity index 100% rename from 353. Design Snake Game.md rename to docs/353. Design Snake Game.md diff --git a/364. Nested List Weight Sum II.md b/docs/364. Nested List Weight Sum II.md similarity index 100% rename from 364. Nested List Weight Sum II.md rename to docs/364. Nested List Weight Sum II.md diff --git a/366. Find Leaves of Binary Tree.md b/docs/366. Find Leaves of Binary Tree.md similarity index 100% rename from 366. Find Leaves of Binary Tree.md rename to docs/366. Find Leaves of Binary Tree.md diff --git a/367._valid_perfect_square.md b/docs/367._valid_perfect_square.md similarity index 100% rename from 367._valid_perfect_square.md rename to docs/367._valid_perfect_square.md diff --git a/369.Plus One Linked List.md b/docs/369.Plus One Linked List.md similarity index 100% rename from 369.Plus One Linked List.md rename to docs/369.Plus One Linked List.md diff --git a/371._sum_of_two_integers.md b/docs/371._sum_of_two_integers.md similarity index 100% rename from 371._sum_of_two_integers.md rename to docs/371._sum_of_two_integers.md diff --git a/374._Guess_Number_Higher_or_Lower.md b/docs/374._Guess_Number_Higher_or_Lower.md similarity index 100% rename from 374._Guess_Number_Higher_or_Lower.md rename to docs/374._Guess_Number_Higher_or_Lower.md diff --git a/377._combination_sum_iv.md b/docs/377._combination_sum_iv.md similarity index 100% rename from 377._combination_sum_iv.md rename to docs/377._combination_sum_iv.md diff --git a/378._kth_smallest_element_in_a_sorted_matrix.md b/docs/378._kth_smallest_element_in_a_sorted_matrix.md similarity index 100% rename from 378._kth_smallest_element_in_a_sorted_matrix.md rename to docs/378._kth_smallest_element_in_a_sorted_matrix.md diff --git a/380. Insert Delete GetRandom O(1).md b/docs/380. Insert Delete GetRandom O(1).md similarity index 100% rename from 380. Insert Delete GetRandom O(1).md rename to docs/380. Insert Delete GetRandom O(1).md diff --git a/381. Insert Delete GetRandom O(1) - Duplicates allowed.md b/docs/381. Insert Delete GetRandom O(1) - Duplicates allowed.md similarity index 100% rename from 381. Insert Delete GetRandom O(1) - Duplicates allowed.md rename to docs/381. Insert Delete GetRandom O(1) - Duplicates allowed.md diff --git a/382._linked_list_random_node.md b/docs/382._linked_list_random_node.md similarity index 100% rename from 382._linked_list_random_node.md rename to docs/382._linked_list_random_node.md diff --git a/383._ransom_note.md b/docs/383._ransom_note.md similarity index 100% rename from 383._ransom_note.md rename to docs/383._ransom_note.md diff --git a/384. Shuffle an Array.md b/docs/384. Shuffle an Array.md similarity index 100% rename from 384. Shuffle an Array.md rename to docs/384. Shuffle an Array.md diff --git a/387._first_unique_character_in_a_string.md b/docs/387._first_unique_character_in_a_string.md similarity index 100% rename from 387._first_unique_character_in_a_string.md rename to docs/387._first_unique_character_in_a_string.md diff --git a/388._Longest_Absolute_File_Path.md b/docs/388._Longest_Absolute_File_Path.md similarity index 100% rename from 388._Longest_Absolute_File_Path.md rename to docs/388._Longest_Absolute_File_Path.md diff --git a/389._find_the_difference.md b/docs/389._find_the_difference.md similarity index 100% rename from 389._find_the_difference.md rename to docs/389._find_the_difference.md diff --git a/392._is_subsequence.md b/docs/392._is_subsequence.md similarity index 100% rename from 392._is_subsequence.md rename to docs/392._is_subsequence.md diff --git a/394._decode_string.md b/docs/394._decode_string.md similarity index 100% rename from 394._decode_string.md rename to docs/394._decode_string.md diff --git a/400. Nth Digit.md b/docs/400. Nth Digit.md similarity index 100% rename from 400. Nth Digit.md rename to docs/400. Nth Digit.md diff --git a/401._binary_watch.md b/docs/401._binary_watch.md similarity index 100% rename from 401._binary_watch.md rename to docs/401._binary_watch.md diff --git a/404._sum_of_left_leaves.md b/docs/404._sum_of_left_leaves.md similarity index 100% rename from 404._sum_of_left_leaves.md rename to docs/404._sum_of_left_leaves.md diff --git a/405. Convert a Number to Hexadecimal.md b/docs/405. Convert a Number to Hexadecimal.md similarity index 100% rename from 405. Convert a Number to Hexadecimal.md rename to docs/405. Convert a Number to Hexadecimal.md diff --git a/406._Queue_Reconstruction_by_Height.md b/docs/406._Queue_Reconstruction_by_Height.md similarity index 100% rename from 406._Queue_Reconstruction_by_Height.md rename to docs/406._Queue_Reconstruction_by_Height.md diff --git a/412._fizz_buzz.md b/docs/412._fizz_buzz.md similarity index 100% rename from 412._fizz_buzz.md rename to docs/412._fizz_buzz.md diff --git a/413. Arithmetic Slices.md b/docs/413. Arithmetic Slices.md similarity index 100% rename from 413. Arithmetic Slices.md rename to docs/413. Arithmetic Slices.md diff --git a/414._third_maximum_number.md b/docs/414._third_maximum_number.md similarity index 100% rename from 414._third_maximum_number.md rename to docs/414._third_maximum_number.md diff --git a/415._add_strings.md b/docs/415._add_strings.md similarity index 100% rename from 415._add_strings.md rename to docs/415._add_strings.md diff --git a/416. Partition Equal Subset Sum.md b/docs/416. Partition Equal Subset Sum.md similarity index 100% rename from 416. Partition Equal Subset Sum.md rename to docs/416. Partition Equal Subset Sum.md diff --git a/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md b/docs/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md similarity index 100% rename from 421._Maximum_XOR_of_Two_Numbers_in_an_Array.md rename to docs/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md diff --git a/422. Valid Word Square.md b/docs/422. Valid Word Square.md similarity index 100% rename from 422. Valid Word Square.md rename to docs/422. Valid Word Square.md diff --git a/434._number_of_segments_in_a_string.md b/docs/434._number_of_segments_in_a_string.md similarity index 100% rename from 434._number_of_segments_in_a_string.md rename to docs/434._number_of_segments_in_a_string.md diff --git a/437._path_sum_iii.md b/docs/437._path_sum_iii.md similarity index 100% rename from 437._path_sum_iii.md rename to docs/437._path_sum_iii.md diff --git a/438._Find_All_Anagrams_in_a_String.md b/docs/438._Find_All_Anagrams_in_a_String.md similarity index 100% rename from 438._Find_All_Anagrams_in_a_String.md rename to docs/438._Find_All_Anagrams_in_a_String.md diff --git a/439. Ternary Expression Parser.md b/docs/439. Ternary Expression Parser.md similarity index 100% rename from 439. Ternary Expression Parser.md rename to docs/439. Ternary Expression Parser.md diff --git a/441._arranging_coins.md b/docs/441._arranging_coins.md similarity index 100% rename from 441._arranging_coins.md rename to docs/441._arranging_coins.md diff --git a/448._Find_All_Numbers_Disappeared_in_an_Array.md b/docs/448._Find_All_Numbers_Disappeared_in_an_Array.md similarity index 100% rename from 448._Find_All_Numbers_Disappeared_in_an_Array.md rename to docs/448._Find_All_Numbers_Disappeared_in_an_Array.md diff --git a/450. Delete Node in a BST.md b/docs/450. Delete Node in a BST.md similarity index 100% rename from 450. Delete Node in a BST.md rename to docs/450. Delete Node in a BST.md diff --git a/453._Minimum_Moves_to_Equal_Array_Elements.md b/docs/453._Minimum_Moves_to_Equal_Array_Elements.md similarity index 100% rename from 453._Minimum_Moves_to_Equal_Array_Elements.md rename to docs/453._Minimum_Moves_to_Equal_Array_Elements.md diff --git a/459._Repeated_Substring_Pattern.md b/docs/459._Repeated_Substring_Pattern.md similarity index 100% rename from 459._Repeated_Substring_Pattern.md rename to docs/459._Repeated_Substring_Pattern.md diff --git a/461._Hamming Distance.md b/docs/461._Hamming Distance.md similarity index 100% rename from 461._Hamming Distance.md rename to docs/461._Hamming Distance.md diff --git a/463._Island_Perimeter.md b/docs/463._Island_Perimeter.md similarity index 100% rename from 463._Island_Perimeter.md rename to docs/463._Island_Perimeter.md diff --git a/467._Unique_Substrings_in_Wraparound_String.md b/docs/467._Unique_Substrings_in_Wraparound_String.md similarity index 100% rename from 467._Unique_Substrings_in_Wraparound_String.md rename to docs/467._Unique_Substrings_in_Wraparound_String.md diff --git a/469. Convex Polygon.md b/docs/469. Convex Polygon.md similarity index 100% rename from 469. Convex Polygon.md rename to docs/469. Convex Polygon.md diff --git a/476._Number_Complement.md b/docs/476._Number_Complement.md similarity index 100% rename from 476._Number_Complement.md rename to docs/476._Number_Complement.md diff --git a/477._Total_Hamming_Distance.md b/docs/477._Total_Hamming_Distance.md similarity index 100% rename from 477._Total_Hamming_Distance.md rename to docs/477._Total_Hamming_Distance.md diff --git a/485._Max_Consecutive_Ones.md b/docs/485._Max_Consecutive_Ones.md similarity index 100% rename from 485._Max_Consecutive_Ones.md rename to docs/485._Max_Consecutive_Ones.md diff --git a/587._Erect_the_Fence .md b/docs/587._Erect_the_Fence .md similarity index 100% rename from 587._Erect_the_Fence .md rename to docs/587._Erect_the_Fence .md diff --git a/599._Minimum_Index_Sum_of_Two_Lists.md b/docs/599._Minimum_Index_Sum_of_Two_Lists.md similarity index 100% rename from 599._Minimum_Index_Sum_of_Two_Lists.md rename to docs/599._Minimum_Index_Sum_of_Two_Lists.md diff --git a/647._Palindromic_Substrings.md b/docs/647._Palindromic_Substrings.md similarity index 100% rename from 647._Palindromic_Substrings.md rename to docs/647._Palindromic_Substrings.md diff --git a/657._Judge_Route_Circle.md b/docs/657._Judge_Route_Circle.md similarity index 100% rename from 657._Judge_Route_Circle.md rename to docs/657._Judge_Route_Circle.md diff --git a/665._Non-decreasing_Array.md b/docs/665._Non-decreasing_Array.md similarity index 100% rename from 665._Non-decreasing_Array.md rename to docs/665._Non-decreasing_Array.md diff --git a/672._Bulb_Switcher_II.md b/docs/672._Bulb_Switcher_II.md similarity index 100% rename from 672._Bulb_Switcher_II.md rename to docs/672._Bulb_Switcher_II.md diff --git a/681._Next_Closest_Time.md b/docs/681._Next_Closest_Time.md similarity index 100% rename from 681._Next_Closest_Time.md rename to docs/681._Next_Closest_Time.md diff --git a/682._Baseball_Game.md b/docs/682._Baseball_Game.md similarity index 100% rename from 682._Baseball_Game.md rename to docs/682._Baseball_Game.md diff --git a/687._Longest_Univalue_Path.md b/docs/687._Longest_Univalue_Path.md similarity index 100% rename from 687._Longest_Univalue_Path.md rename to docs/687._Longest_Univalue_Path.md diff --git a/740._delete_and_earn.md b/docs/740._delete_and_earn.md similarity index 100% rename from 740._delete_and_earn.md rename to docs/740._delete_and_earn.md diff --git a/760._Find_Anagram_Mappings.md b/docs/760._Find_Anagram_Mappings.md similarity index 100% rename from 760._Find_Anagram_Mappings.md rename to docs/760._Find_Anagram_Mappings.md diff --git "a/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" "b/docs/SortingAlgorithm/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" similarity index 100% rename from "Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" rename to "docs/SortingAlgorithm/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" diff --git "a/python\345\256\236\347\216\260\345\205\253\345\244\247\346\216\222\345\272\217.md" b/docs/SortingAlgorithm/README.md similarity index 92% rename from "python\345\256\236\347\216\260\345\205\253\345\244\247\346\216\222\345\272\217.md" rename to docs/SortingAlgorithm/README.md index b45d9c9ff..189bfb603 100644 --- "a/python\345\256\236\347\216\260\345\205\253\345\244\247\346\216\222\345\272\217.md" +++ b/docs/SortingAlgorithm/README.md @@ -2,15 +2,15 @@ 八大排序,三大查找是《数据结构》当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法。 常见的八大排序算法,他们之间关系如下: -![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E5%85%AB%E5%A4%A7%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E6%80%BB%E7%BB%93.png) +![](/images/SortingAlgorithm/八大排序算法总结.png) 他们的性能比较: -![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E5%85%AB%E5%A4%A7%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E6%80%A7%E8%83%BD%E6%AF%94%E8%BE%83.png) +![](/images/SortingAlgorithm/八大排序算法性能.png) ### 直接插入排序 (Insertion sort) -![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E7%9B%B4%E6%8E%A5%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F.gif) +![](/images/SortingAlgorithm/直接插入排序.gif) 直接插入排序的核心思想就是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。 因此,从上面的描述中我们可以发现,直接插入排序可以用两个循环完成: @@ -33,7 +33,7 @@ def insert_sort(L): ``` ### 希尔排序 (Shell sort) -![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F.png) +![](/images/SortingAlgorithm/希尔排序.png) 希尔排序的算法思想:将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序。 同样的:从上面的描述中我们可以发现:希尔排序的总体实现应该由三个循环完成: @@ -62,7 +62,7 @@ def insert_shell(L): ### 简单选择排序 (Selection sort) -![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E7%AE%80%E5%8D%95%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F.gif) +![](/images/SortingAlgorithm/简单选择排序.gif) 简单选择排序的基本思想:比较+交换。 @@ -102,7 +102,7 @@ def select_sort(L): (这样满足了大顶堆那条性质:位于根节点的元素一定是当前序列的最大值) -![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E6%9E%84%E5%BB%BA%E5%A4%A7%E9%A1%B6%E5%A0%86.png) +![](/images/SortingAlgorithm/构建大顶堆.png) 2. 取出当前大顶堆的根节点,将其与序列末尾元素进行交换; @@ -110,7 +110,7 @@ def select_sort(L): 3. 对交换后的n-1个序列元素进行调整,使其满足大顶堆的性质; -![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E8%B0%83%E6%95%B4%E5%A4%A7%E9%A1%B6%E5%A0%86.png) +![](/images/SortingAlgorithm/调整大顶堆.png) 4. 重复2.3步骤,直至堆中只有1个元素为止 @@ -161,7 +161,7 @@ def heap_sort(L): ``` ### 冒泡排序 (Bubble sort) -![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F.gif) +![](/images/SortingAlgorithm/冒泡排序.gif) 冒泡排序思路比较简单: @@ -186,7 +186,7 @@ def bubble_sort(L): ### 快速排序 (Quick sort) -![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F.gif) +![](/images/SortingAlgorithm/快速排序.gif) 快速排序的基本思想:挖坑填数+分治法 @@ -235,7 +235,7 @@ def quick_sort(L, start, end): ### 归并排序 (Merge sort) -![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F.gif) +![](/images/SortingAlgorithm/归并排序.gif) 1. 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个典型的应用。它的基本操作是:将已有的子序列合并,达到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 2. 归并排序其实要做两件事: @@ -302,7 +302,7 @@ def merge_sort_array(L): ### 基数排序 (Radix sort) -![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/images/%E5%9F%BA%E6%95%B0%E6%8E%92%E5%BA%8F.gif) +![](/images/SortingAlgorithm/基数排序.gif) 1. 基数排序:通过序列中各个元素的值,对排序的N个元素进行若干趟的“分配”与“收集”来实现排序。 - 分配:我们将L[i]中的元素取出,首先确定其个位上的数字,根据该数字分配到与之序号相同的桶中 diff --git "a/python\347\232\204\345\220\204\347\247\215pass.md" "b/docs/SortingAlgorithm/python\347\232\204\345\220\204\347\247\215pass.md" similarity index 100% rename from "python\347\232\204\345\220\204\347\247\215pass.md" rename to "docs/SortingAlgorithm/python\347\232\204\345\220\204\347\247\215pass.md" diff --git "a/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" "b/docs/SortingAlgorithm/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" similarity index 100% rename from "tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" rename to "docs/SortingAlgorithm/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" diff --git a/interview question/Google/Google.md b/docs/interview/Google/Google.md similarity index 100% rename from interview question/Google/Google.md rename to docs/interview/Google/Google.md diff --git a/interview question/WePay/WePay.jpg b/docs/interview/WePay/WePay.jpg similarity index 100% rename from interview question/WePay/WePay.jpg rename to docs/interview/WePay/WePay.jpg diff --git a/interview question/WePay/WePay.md b/docs/interview/WePay/WePay.md similarity index 100% rename from interview question/WePay/WePay.md rename to docs/interview/WePay/WePay.md diff --git a/interview question/WePay/power_number.md b/docs/interview/WePay/power_number.md similarity index 100% rename from interview question/WePay/power_number.md rename to docs/interview/WePay/power_number.md diff --git a/interview question/pocketgems/pocketgems.md b/docs/interview/pocketgems/pocketgems.md similarity index 100% rename from interview question/pocketgems/pocketgems.md rename to docs/interview/pocketgems/pocketgems.md diff --git "a/images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\247\350\203\275\346\257\224\350\276\203.png" "b/images/SortingAlgorithm/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\247\350\203\275.png" similarity index 100% rename from "images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\247\350\203\275\346\257\224\350\276\203.png" rename to "images/SortingAlgorithm/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\247\350\203\275.png" diff --git "a/images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.png" "b/images/SortingAlgorithm/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.png" similarity index 100% rename from "images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.png" rename to "images/SortingAlgorithm/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.png" diff --git "a/images/\345\206\222\346\263\241\346\216\222\345\272\217.gif" "b/images/SortingAlgorithm/\345\206\222\346\263\241\346\216\222\345\272\217.gif" similarity index 100% rename from "images/\345\206\222\346\263\241\346\216\222\345\272\217.gif" rename to "images/SortingAlgorithm/\345\206\222\346\263\241\346\216\222\345\272\217.gif" diff --git "a/images/\345\237\272\346\225\260\346\216\222\345\272\217.gif" "b/images/SortingAlgorithm/\345\237\272\346\225\260\346\216\222\345\272\217.gif" similarity index 100% rename from "images/\345\237\272\346\225\260\346\216\222\345\272\217.gif" rename to "images/SortingAlgorithm/\345\237\272\346\225\260\346\216\222\345\272\217.gif" diff --git "a/images/\345\270\214\345\260\224\346\216\222\345\272\217.png" "b/images/SortingAlgorithm/\345\270\214\345\260\224\346\216\222\345\272\217.png" similarity index 100% rename from "images/\345\270\214\345\260\224\346\216\222\345\272\217.png" rename to "images/SortingAlgorithm/\345\270\214\345\260\224\346\216\222\345\272\217.png" diff --git "a/images/\345\275\222\345\271\266\346\216\222\345\272\217.gif" "b/images/SortingAlgorithm/\345\275\222\345\271\266\346\216\222\345\272\217.gif" similarity index 100% rename from "images/\345\275\222\345\271\266\346\216\222\345\272\217.gif" rename to "images/SortingAlgorithm/\345\275\222\345\271\266\346\216\222\345\272\217.gif" diff --git "a/images/\345\277\253\351\200\237\346\216\222\345\272\217.gif" "b/images/SortingAlgorithm/\345\277\253\351\200\237\346\216\222\345\272\217.gif" similarity index 100% rename from "images/\345\277\253\351\200\237\346\216\222\345\272\217.gif" rename to "images/SortingAlgorithm/\345\277\253\351\200\237\346\216\222\345\272\217.gif" diff --git "a/images/\346\236\204\345\273\272\345\244\247\351\241\266\345\240\206.png" "b/images/SortingAlgorithm/\346\236\204\345\273\272\345\244\247\351\241\266\345\240\206.png" similarity index 100% rename from "images/\346\236\204\345\273\272\345\244\247\351\241\266\345\240\206.png" rename to "images/SortingAlgorithm/\346\236\204\345\273\272\345\244\247\351\241\266\345\240\206.png" diff --git "a/images/\347\233\264\346\216\245\346\217\222\345\205\245\346\216\222\345\272\217.gif" "b/images/SortingAlgorithm/\347\233\264\346\216\245\346\217\222\345\205\245\346\216\222\345\272\217.gif" similarity index 100% rename from "images/\347\233\264\346\216\245\346\217\222\345\205\245\346\216\222\345\272\217.gif" rename to "images/SortingAlgorithm/\347\233\264\346\216\245\346\217\222\345\205\245\346\216\222\345\272\217.gif" diff --git "a/images/\347\256\200\345\215\225\351\200\211\346\213\251\346\216\222\345\272\217.gif" "b/images/SortingAlgorithm/\347\256\200\345\215\225\351\200\211\346\213\251\346\216\222\345\272\217.gif" similarity index 100% rename from "images/\347\256\200\345\215\225\351\200\211\346\213\251\346\216\222\345\272\217.gif" rename to "images/SortingAlgorithm/\347\256\200\345\215\225\351\200\211\346\213\251\346\216\222\345\272\217.gif" diff --git "a/images/\350\260\203\346\225\264\345\244\247\351\241\266\345\240\206.png" "b/images/SortingAlgorithm/\350\260\203\346\225\264\345\244\247\351\241\266\345\240\206.png" similarity index 100% rename from "images/\350\260\203\346\225\264\345\244\247\351\241\266\345\240\206.png" rename to "images/SortingAlgorithm/\350\260\203\346\225\264\345\244\247\351\241\266\345\240\206.png" diff --git "a/Binary Search \344\270\215\346\230\223\345\206\231.md" "b/others/Binary Search \344\270\215\346\230\223\345\206\231.md" similarity index 100% rename from "Binary Search \344\270\215\346\230\223\345\206\231.md" rename to "others/Binary Search \344\270\215\346\230\223\345\206\231.md" diff --git a/Data Structure and Algorthim Review.md b/others/Data Structure and Algorthim Review.md similarity index 100% rename from Data Structure and Algorthim Review.md rename to others/Data Structure and Algorthim Review.md diff --git a/Dynamic Programming.md b/others/Dynamic Programming.md similarity index 100% rename from Dynamic Programming.md rename to others/Dynamic Programming.md diff --git "a/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" "b/others/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" similarity index 100% rename from "Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" rename to "others/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" diff --git "a/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" "b/others/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" similarity index 100% rename from "Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" rename to "others/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" diff --git "a/LinkedList\346\212\200\345\267\247.md" "b/others/LinkedList\346\212\200\345\267\247.md" similarity index 100% rename from "LinkedList\346\212\200\345\267\247.md" rename to "others/LinkedList\346\212\200\345\267\247.md" diff --git a/Maximal Square.pdf b/others/Maximal Square.pdf similarity index 100% rename from Maximal Square.pdf rename to others/Maximal Square.pdf diff --git a/Range Sum Query 2D - Immutable.pdf b/others/Range Sum Query 2D - Immutable.pdf similarity index 100% rename from Range Sum Query 2D - Immutable.pdf rename to others/Range Sum Query 2D - Immutable.pdf diff --git a/Recusrion & BackTracking.md b/others/Recusrion & BackTracking.md similarity index 100% rename from Recusrion & BackTracking.md rename to others/Recusrion & BackTracking.md diff --git "a/backtracking\346\200\235\350\267\257.md" "b/others/backtracking\346\200\235\350\267\257.md" similarity index 100% rename from "backtracking\346\200\235\350\267\257.md" rename to "others/backtracking\346\200\235\350\267\257.md" diff --git "a/delete_node_in_a_linked_list\351\227\256\351\242\230.md" "b/others/delete_node_in_a_linked_list\351\227\256\351\242\230.md" similarity index 100% rename from "delete_node_in_a_linked_list\351\227\256\351\242\230.md" rename to "others/delete_node_in_a_linked_list\351\227\256\351\242\230.md" diff --git "a/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" "b/others/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" similarity index 100% rename from "local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" rename to "others/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" diff --git a/slide_windows_template.md b/others/slide_windows_template.md similarity index 100% rename from slide_windows_template.md rename to others/slide_windows_template.md diff --git "a/\344\275\215\350\277\220\347\256\227.md" "b/others/\344\275\215\350\277\220\347\256\227.md" similarity index 100% rename from "\344\275\215\350\277\220\347\256\227.md" rename to "others/\344\275\215\350\277\220\347\256\227.md" diff --git "a/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" "b/others/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" similarity index 100% rename from "\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" rename to "others/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" diff --git "a/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" "b/others/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" similarity index 100% rename from "\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" rename to "others/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" diff --git "a/\346\200\273\347\273\223.md" "b/others/\346\200\273\347\273\223.md" similarity index 100% rename from "\346\200\273\347\273\223.md" rename to "others/\346\200\273\347\273\223.md" diff --git "a/\347\273\204\345\220\210\351\227\256\351\242\230.md" "b/others/\347\273\204\345\220\210\351\227\256\351\242\230.md" similarity index 100% rename from "\347\273\204\345\220\210\351\227\256\351\242\230.md" rename to "others/\347\273\204\345\220\210\351\227\256\351\242\230.md" diff --git "a/\351\200\222\345\275\222_recursion.md" "b/others/\351\200\222\345\275\222_recursion.md" similarity index 100% rename from "\351\200\222\345\275\222_recursion.md" rename to "others/\351\200\222\345\275\222_recursion.md" diff --git a/src/py2.x/SortingAlgorithm/BubbleSort.py b/src/py2.x/SortingAlgorithm/BubbleSort.py new file mode 100644 index 000000000..6e2f23940 --- /dev/null +++ b/src/py2.x/SortingAlgorithm/BubbleSort.py @@ -0,0 +1,19 @@ +# coding:utf-8 + + +# 冒泡排序 +def bubble_sort(l): + length = len(l) + # 外层循环 length遍,内层循环少一遍 + while length: + for j in range(length - 1): + # 找出最大值,然后交换位置到最后 + if l[j] > l[length - 1]: + l[j], l[length - 1] = l[length - 1], l[j] + length -= 1 + + +if __name__ == "__main__": + l = [5, 1, 9, 3, 2, 7] + bubble_sort(l) + print l diff --git a/src/py2.x/SortingAlgorithm/InsertSort.py b/src/py2.x/SortingAlgorithm/InsertSort.py new file mode 100644 index 000000000..09b935114 --- /dev/null +++ b/src/py2.x/SortingAlgorithm/InsertSort.py @@ -0,0 +1,24 @@ +# coding:utf8 +""" +插入排序和冒泡排序的区别在于: + +插入排序的前提是:左边是有序的数列 +而冒泡排序:相邻的值进行交换,一共进行n次交换 +""" + + +def insert_sort(l): + # 循环 除第一个数字组成的有序数组 以外的数字 + for i in range(1, len(l)): + # 每一个数字,依次和有序数组进行比较 + print l[:i] + for j in range(len(l[:i])): + if l[i] < l[j]: + l[i], l[j] = l[j], l[i] + + +if __name__ == "__main__": + l = [5, 1, 9, 3, 2, 7] + print l + insert_sort(l) + print("result: " + str(l)) diff --git a/src/py2.x/SortingAlgorithm/MergeSort.py b/src/py2.x/SortingAlgorithm/MergeSort.py new file mode 100644 index 000000000..1ad19e86d --- /dev/null +++ b/src/py2.x/SortingAlgorithm/MergeSort.py @@ -0,0 +1,35 @@ +# coding: utf-8 + + +def MergeSort(lists): + if len(lists) <= 1: + return lists + num = int(len(lists) / 2) + # 从中间,进行数据的拆分, 递归的返回数据进行迭代排序 + left = MergeSort(lists[:num]) + right = MergeSort(lists[num:]) + print left + print "*" * 20 + print right + print "_" * 20 + return Merge(left, right) + + +def Merge(left, right): + r, l = 0, 0 + result = [] + while l < len(left) and r < len(right): + if left[l] < right[r]: + result.append(left[l]) + l += 1 + else: + result.append(right[r]) + r += 1 + result += right[r:] + result += left[l:] + print 'result:', result + return result + + +if __name__ == "__main__": + print MergeSort([1, 2, 3, 4, 5, 6, 7, 90, 21, 23, 45]) diff --git a/src/py2.x/SortingAlgorithm/QuickSort.py b/src/py2.x/SortingAlgorithm/QuickSort.py new file mode 100644 index 000000000..acf81118a --- /dev/null +++ b/src/py2.x/SortingAlgorithm/QuickSort.py @@ -0,0 +1,35 @@ +#!/usr/bin/python +# coding:utf8 + + +def quick_sort(l, start, end): + i = start + j = end + # 结束排序 + if i >= j: + return + # 保存首个数值 + key = l[i] + # 一次排序,i和j的值不断的靠拢,然后最终停止,结束一次排序 + while i < j: + # 和最右边的比较,如果>=key,然后j-1,慢慢的和前一个值比较;如果值key,那么就交换位置 + while i < j and key >= l[i]: + print key, l[i], '*' * 30 + i += 1 + l[j] = l[i] + l[i] = key + # 左边排序 + quick_sort(l, start, j-1) + # 右边排序 + quick_sort(l, i+1, end) + + +if __name__ == "__main__": + l = [5, 1, 9, 3, 2, 7] + quick_sort(l, 0, len(l) - 1) + print l diff --git a/src/py2.x/SortingAlgorithm/SelectionSort.py b/src/py2.x/SortingAlgorithm/SelectionSort.py new file mode 100644 index 000000000..98ef64f72 --- /dev/null +++ b/src/py2.x/SortingAlgorithm/SelectionSort.py @@ -0,0 +1,28 @@ +# coding:utf8 +""" +选择排序和冒泡排序的区别在于: + +选择排序的前提是:找到最大值的位置,最后才进行1次交换 +而冒泡排序:相邻的值进行交换,一共进行n次交换 +""" + + +def selection_sort(l): + length = len(l) - 1 + + while length: + index = length + # 第一个数字,和后面每一个数字进行对比,找出最大值,放到最后!! + for j in range(length): + if l[j] > l[index]: + index = j + l[length], l[index] = l[index], l[length] + print len(l) - length, l + length -= 1 + + +if __name__ == "__main__": + l = [5, 1, 9, 3, 2, 7] + print l + selection_sort(l) + print("result: " + str(l)) \ No newline at end of file diff --git a/src/py2.x/SortingAlgorithm/ShellSort.py b/src/py2.x/SortingAlgorithm/ShellSort.py new file mode 100644 index 000000000..9f591a84b --- /dev/null +++ b/src/py2.x/SortingAlgorithm/ShellSort.py @@ -0,0 +1,25 @@ +# coding: utf8 + +def insert_sort(l, start, increment): + for i in range(start+increment, len(l), increment): + for j in range(start, len(l[:i]), increment): + if l[i] < l[j]: + l[i], l[j] = l[j], l[i] + print increment, '--',l + return l + +def shell_sort(l, increment): + # 依次进行分层 + while increment: + # 每一层,都进行n次插入排序 + for i in range(0, increment): + insert_sort(l, i, increment) + increment -= 1 + return l + +if __name__ == "__main__": + l = [5, 2, 9, 8, 1, 10, 3, 4, 7] + increment = len(l)/3+1 if len(l)%3 else len(l)/3 + print "开始", l + l = shell_sort(l, increment) + print "结束", l \ No newline at end of file diff --git a/src/py2.x/TreeRecursionIterator.py b/src/py2.x/TreeRecursionIterator.py new file mode 100644 index 000000000..ffb4be32f --- /dev/null +++ b/src/py2.x/TreeRecursionIterator.py @@ -0,0 +1,34 @@ +# coding:utf8 + +class Node(): + def __init__(self, value, left=None, right=None): + self.value = value + self.left = left + self.right = right + +def midRecusion(node): + if node is None: + return + midRecusion(node.left) + print node.value, + midRecusion(node.right) + +def midIterator(node): + stack = [] + while stack or node: + if node is not None: + stack.append(node) + node = node.left + else: + node = stack.pop(-1) + print node.value, + node = node.right + +if __name__ == "__main__": + node = Node("D", Node("B", Node("A"), Node("C")), Node("E", right=Node("G", left=Node("F")))) + + print('\n中序遍历<递归>:') + midRecusion(node) + + print('\n中序遍历<迭代>:') + midIterator(node) \ No newline at end of file diff --git a/src/py2.x/list2iteration.py b/src/py2.x/list2iteration.py new file mode 100644 index 000000000..145fd8335 --- /dev/null +++ b/src/py2.x/list2iteration.py @@ -0,0 +1,30 @@ +#!/usr/bin/python +# coding:utf8 +''' +迭代使用的是循环结构。 +递归使用的是选择结构。 +''' + +# 递归求解 +def calculate(l): + if len(l) <= 1: + return l[0] + value = calculate(l[1:]) + return 10**(len(l) - 1) * l[0] + value + + +# 迭代求解 +def calculate2(l): + result = 0 + while len(l) >= 1: + result += 10 ** (len(l)-1) * l[0] + l = l[1:] + return result + + +l1 = [1, 2, 3] +l2 = [4, 5] +sum = 0 +result = calculate(l1) + calculate(l2) +# result = calculate2(l1) + calculate2(l2) +print(result) From 8c5d5429e1528ae7124b2c20ea18891759815783 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Thu, 5 Apr 2018 14:14:39 +0800 Subject: [PATCH 429/473] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20License?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 674 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Readme.md | 4 +- 2 files changed, 676 insertions(+), 2 deletions(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..9cecc1d46 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Readme.md b/Readme.md index 9fafaced9..c28592379 100644 --- a/Readme.md +++ b/Readme.md @@ -4,7 +4,7 @@ ![](/images/SortingAlgorithm/八大排序算法性能.png) -| 名称 | 文档 | 代码 | +| 名称 | 动图 | 代码 | | --- | --- | --- | | 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/BubbleSort.py) | | 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | @@ -20,7 +20,7 @@ * [pocketgems 面试题](/docs/interview/pocketgems/pocketgems.md) * [WePay 面试题](/docs/interview/WePay/WePay.md) -## LeetCode算法题 +## LeetCode算法题 * [](docs/LeetCode/001._two_sum.md) * [](/docs/LeetCode/002._add_two_numbers.md) From 5f50fdcee2c684bb5fbccf13bb01baca905b768e Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Thu, 5 Apr 2018 14:23:08 +0800 Subject: [PATCH 430/473] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Readme.md | 318 --------------- docs/SortingAlgorithm/README.md | 693 ++++++++++++++------------------ 2 files changed, 308 insertions(+), 703 deletions(-) delete mode 100644 Readme.md diff --git a/Readme.md b/Readme.md deleted file mode 100644 index c28592379..000000000 --- a/Readme.md +++ /dev/null @@ -1,318 +0,0 @@ -# LeetCode 面试题 - -## [八大算法算](/docs/SortingAlgorithm/README.md) - -![](/images/SortingAlgorithm/八大排序算法性能.png) - -| 名称 | 动图 | 代码 | -| --- | --- | --- | -| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/BubbleSort.py) | -| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | -| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | -| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | -| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | -| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | -| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | - -## 面试问答 - -* [Google面试题](/docs/interview/Google/Google.md) -* [pocketgems 面试题](/docs/interview/pocketgems/pocketgems.md) -* [WePay 面试题](/docs/interview/WePay/WePay.md) - -## LeetCode算法题 - -* [](docs/LeetCode/001._two_sum.md) -* [](/docs/LeetCode/002._add_two_numbers.md) -* [](/docs/LeetCode/003._longest_substring_without_repeating_characters.md) -* [](/docs/LeetCode/004._median_of_two_sorted_arrays.md) -* [](/docs/LeetCode/005._longest_palindromic_substring.md) -* [](/docs/LeetCode/007._Reverse_Integer.md) -* [](/docs/LeetCode/008._string_to_integer_(atoi).md) -* [](/docs/LeetCode/010._regular_expression_matching.md) -* [](/docs/LeetCode/011._container_with_most_water.md) -* [](/docs/LeetCode/012._Integer_to_Roman.md) -* [](/docs/LeetCode/013._Roman_to_Integer.md) -* [](/docs/LeetCode/014._longest_common_prefix.md) -* [](/docs/LeetCode/015._3sum.md) -* [](/docs/LeetCode/016._3sum_closest.md) -* [](/docs/LeetCode/017._letter_combinations_of_a_phone_number.md) -* [](/docs/LeetCode/018._4sum.md) -* [](/docs/LeetCode/019._remove_nth_node_from_end_of_list.md) -* [](/docs/LeetCode/020._valid_parentheses.md) -* [](/docs/LeetCode/021._merge_two_sorted_lists.md) -* [](/docs/LeetCode/022._generate_parentheses.md) -* [](/docs/LeetCode/023._merge_k_sorted_lists.md) -* [](/docs/LeetCode/024._swap_nodes_in_pairs.md) -* [](/docs/LeetCode/026._Remove_Duplicates_from_Sorted_Array.md) -* [](/docs/LeetCode/027._Remove_Element.md) -* [](/docs/LeetCode/028._implement_strstr().md) -* [](/docs/LeetCode/030._Substring_with_Concatenation_of_All_Words.md) -* [](/docs/LeetCode/031._next_permutation.md) -* [](/docs/LeetCode/033._search_in_rotated_sorted_array.md) -* [](/docs/LeetCode/034._SearchforaRange.md) -* [](/docs/LeetCode/035._search_insert_position.md) -* [](/docs/LeetCode/038._Count_and_Say.md) -* [](/docs/LeetCode/039._combination_sum.md) -* [](/docs/LeetCode/040._combination_sum_ii.md) -* [](/docs/LeetCode/042._trapping_rain_water.md) -* [](/docs/LeetCode/043._multiply_strings.md) -* [](/docs/LeetCode/044._wildcard_matching.md) -* [](/docs/LeetCode/045._Jump_Game_II.md) -* [](/docs/LeetCode/046._permutations.md) -* [](/docs/LeetCode/047._permutations_ii.md) -* [](/docs/LeetCode/048._rotate_image.md) -* [](/docs/LeetCode/049._group_anagrams_python.md) -* [](/docs/LeetCode/050._pow(x,_n).md) -* [](/docs/LeetCode/051._n-queens.md) -* [](/docs/LeetCode/052._n-queens_ii.md) -* [](/docs/LeetCode/053._maximum_subarray.md) -* [](/docs/LeetCode/054._spiral_matrix.md) -* [](/docs/LeetCode/055._jump_game.md) -* [](/docs/LeetCode/056._Merge_Intervals.md) -* [](/docs/LeetCode/058._length_of_last_word.md) -* [](/docs/LeetCode/059._spiral_matrix_ii.md) -* [](/docs/LeetCode/060._permutation_sequence.md) -* [](/docs/LeetCode/061._rotate_list.md) -* [](/docs/LeetCode/064._minimum_path_sum.md) -* [](/docs/LeetCode/065.unique_paths_ii.md) -* [](/docs/LeetCode/066._plus_one.md) -* [](/docs/LeetCode/067._add_binary.md) -* [](/docs/LeetCode/069._sqrt(x).md) -* [](/docs/LeetCode/070.ClimbingStairs.md) -* [](/docs/LeetCode/072._edit_distance.md) -* [](/docs/LeetCode/073.SetMatrixZeroes.md) -* [](/docs/LeetCode/074._search_a_2d_matrix.md) -* [](/docs/LeetCode/075._sort_colors.md) -* [](/docs/LeetCode/076._Minimum_Window_Substring.md) -* [](/docs/LeetCode/077._combinations.md) -* [](/docs/LeetCode/078.Subsets.md) -* [](/docs/LeetCode/079._word_search.md) -* [](/docs/LeetCode/082._remove_duplicates_from_sorted_list_ii.md) -* [](/docs/LeetCode/083._remove_duplicates_from_sorted_list.md) -* [](/docs/LeetCode/086._partition_list.md) -* [](/docs/LeetCode/088._merge_sorted_array.md) -* [](/docs/LeetCode/089._gray_code.md) -* [](/docs/LeetCode/090._subsets_ii.md) -* [](/docs/LeetCode/091._decode_ways.md) -* [](/docs/LeetCode/092._reverse_linked_list_ii.md) -* [](/docs/LeetCode/093._restore_ip_addresses.md) -* [](/docs/LeetCode/094._binary_tree_inorder_traversal.md) -* [](/docs/LeetCode/096._unique_binary_search_trees.md) -* [](/docs/LeetCode/098._validate_binary_search_tree.md) -* [](/docs/LeetCode/100._same_tree.md) -* [](/docs/LeetCode/101._symmetric_tree.md) -* [](/docs/LeetCode/102._binary_tree_level_order_traversal.md) -* [](/docs/LeetCode/103._binary_tree_zigzag_level_order_traversal.md) -* [](/docs/LeetCode/104._maximum_depth_of_binary_tree.md) -* [](/docs/LeetCode/105._construct_binary_tree_from_preorder_and_inorder_traversal.md) -* [](/docs/LeetCode/106._construct_binary_tree_from_inorder_and_postorder_traversal.md) -* [](/docs/LeetCode/107._binary_tree_level_order_traversal_ii.md) -* [](/docs/LeetCode/108._convert_sorted_array_to_binary_search_tree.md) -* [](/docs/LeetCode/109._convert_sorted_list_to_binary_search_tree.md) -* [](/docs/LeetCode/110._balanced_binary_tree.md) -* [](/docs/LeetCode/111._minimum_depth_of_binary_tree.md) -* [](/docs/LeetCode/112._path_sum.md) -* [](/docs/LeetCode/113._path_sum_ii.md) -* [](/docs/LeetCode/114._flatten_binary_tree_to_linked_list.md) -* [](/docs/LeetCode/116._populating_next_right_pointers_in_each_node.md) -* [](/docs/LeetCode/118._pascal's_triangle.md) -* [](/docs/LeetCode/119.Pascal'sTriangleII.md) -* [](/docs/LeetCode/120.Triangle.md) -* [](/docs/LeetCode/121._Best_Time_to_Buy_and_Sell_Stock.md) -* [](/docs/LeetCode/125._valid_palindrome.md) -* [](/docs/LeetCode/126.WordLadderII.md) -* [](/docs/LeetCode/127._word_ladder.md) -* [](/docs/LeetCode/128._Longest_Consecutive_Sequence.md) -* [](/docs/LeetCode/129._sum_root_to_leaf_numbers.md) -* [](/docs/LeetCode/130._surrounded_regions.md) -* [](/docs/LeetCode/131._palindrome_partitioning.md) -* [](/docs/LeetCode/133._clone_graph.md) -* [](/docs/LeetCode/136._single_number.md) -* [](/docs/LeetCode/139._word_break.md) -* [](/docs/LeetCode/140._word_break_ii.md) -* [](/docs/LeetCode/141._linked_list_cycle.md) -* [](/docs/LeetCode/142_Linked_List_Cycle_II.md) -* [](/docs/LeetCode/143._reorder_list.md) -* [](/docs/LeetCode/144._binary_tree_preorder_traversal.md) -* [](/docs/LeetCode/145._binary_tree_postorder_traversal.md) -* [](/docs/LeetCode/147._insertion_sort_list.md) -* [](/docs/LeetCode/148._sort_list.md) -* [](/docs/LeetCode/150._evaluate_reverse_polish_notation.md) -* [](/docs/LeetCode/151._reverse_words_in_a_string.md) -* [](/docs/LeetCode/152._maximum_product_subarray.md) -* [](/docs/LeetCode/153._find_minimum_in_rotated_sorted_array.md) -* [](/docs/LeetCode/155._min_stack.md) -* [](/docs/LeetCode/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md) -* [](/docs/LeetCode/160._intersection_of_two_linked_lists.md) -* [](/docs/LeetCode/162._find_peak_element.md) -* [](/docs/LeetCode/165._compare_version_numbers.md) -* [](/docs/LeetCode/166._Fraction_to_Recurring_Decimal.md) -* [](/docs/LeetCode/167._two_sum_ii_-_input_array_is_sorted.md) -* [](/docs/LeetCode/168._excel_sheet_column_title.md) -* [](/docs/LeetCode/169._majority_element.md) -* [](/docs/LeetCode/171._excel_sheet_column_number.md) -* [](/docs/LeetCode/173._binary_search_tree_iterator.md) -* [](/docs/LeetCode/189._rotate_array.md) -* [](/docs/LeetCode/191._number_of_1_bits.md) -* [](/docs/LeetCode/198._house_robber.md) -* [](/docs/LeetCode/199._binary_tree_right_side_view.md) -* [](/docs/LeetCode/200._number_of_islands.md) -* [](/docs/LeetCode/203._remove_linked_list_elements.md) -* [](/docs/LeetCode/204._count_primes.md) -* [](/docs/LeetCode/205._isomorphic_strings.md) -* [](/docs/LeetCode/206._reverse_linked_list.md) -* [](/docs/LeetCode/207._course_schedule.md) -* [](/docs/LeetCode/208._implement_trie_(prefix_tree).md) -* [](/docs/LeetCode/210._course_schedule_ii.md) -* [](/docs/LeetCode/211.AddandSearchWord-Datastructuredesign.md) -* [](/docs/LeetCode/213._house_robber_ii.md) -* [](/docs/LeetCode/216._combination_sum_iii.md) -* [](/docs/LeetCode/217._contains_duplicate.md) -* [](/docs/LeetCode/218._The_Skyline_Problem.md) -* [](/docs/LeetCode/219._contains_duplicate_ii.md) -* [](/docs/LeetCode/221._maximal_square.md) -* [](/docs/LeetCode/222._count_complete_tree_nodes.md) -* [](/docs/LeetCode/223._rectangle_area.md) -* [](/docs/LeetCode/224.BasicCalculator.md) -* [](/docs/LeetCode/225._implement_stack_using_queues.md) -* [](/docs/LeetCode/226._invert_binary_tree.md) -* [](/docs/LeetCode/227._basic_calculator_ii.md) -* [](/docs/LeetCode/228._summary_ranges.md) -* [](/docs/LeetCode/229._majority_element_ii.md) -* [](/docs/LeetCode/230._kth_smallest_element_in_a_bst.md) -* [](/docs/LeetCode/231._Power_of_Two.md) -* [](/docs/LeetCode/232._implement_queue_using_stacks.md) -* [](/docs/LeetCode/234._palindrome_linked_list.md) -* [](/docs/LeetCode/235._lowest_common_ancestor_of_a_binary_search_tree.md) -* [](/docs/LeetCode/236._lowest_common_ancestor_of_a_binary_tree.md) -* [](/docs/LeetCode/237._delete_node_in_a_linked_list.md) -* [](/docs/LeetCode/238._product_of_array_except_self.md) -* [](/docs/LeetCode/240._search_a_2d_matrix_ii.md) -* [](/docs/LeetCode/242._valid_anagram.md) -* [](/docs/LeetCode/252.MeetingRooms.md) -* [](/docs/LeetCode/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md) -* [](/docs/LeetCode/256.PaintHouse.md) -* [](/docs/LeetCode/257._binary_tree_paths.md) -* [](/docs/LeetCode/258_Add_Digits.md) -* [](/docs/LeetCode/261.GraphValidTree.md) -* [](/docs/LeetCode/263._ugly_number.md) -* [](/docs/LeetCode/264._ugly_number_ii.md) -* [](/docs/LeetCode/265.PaintHouseII.md) -* [](/docs/LeetCode/266.PalindromePermutation.md) -* [](/docs/LeetCode/267.PalindromePermutationII.md) -* [](/docs/LeetCode/268._missing_number.md) -* [](/docs/LeetCode/270.ClosestBinarySearchTreeValue.md) -* [](/docs/LeetCode/276.PaintFence.md) -* [](/docs/LeetCode/277.FindtheCelebrity.md) -* [](/docs/LeetCode/278._First_Bad_Version.md) -* [](/docs/LeetCode/279._perfect_squares.md) -* [](/docs/LeetCode/280._Wiggle_Sort.md) -* [](/docs/LeetCode/283._move_zeroes.md) -* [](/docs/LeetCode/285._inorder_successor_in_bst.md) -* [](/docs/LeetCode/286.WallsandGates.md) -* [](/docs/LeetCode/289._game_of_life.md) -* [](/docs/LeetCode/290._word_pattern.md) -* [](/docs/LeetCode/292._nim_game.md) -* [](/docs/LeetCode/296.BestMeetingPoint.md) -* [](/docs/LeetCode/298.BinaryTreeLongestConsecutiveSequence.md) -* [](/docs/LeetCode/299._bulls_and_cows.md) -* [](/docs/LeetCode/300._longest_increasing_subsequence.md) -* [](/docs/LeetCode/303._range_sum_query_-_immutable.md) -* [](/docs/LeetCode/316._Remove_Duplicate_Letters.md) -* [](/docs/LeetCode/319._Bulb_Switcher.md) -* [](/docs/LeetCode/322.CoinChange.md) -* [](/docs/LeetCode/323.NumberofConnectedComponentsinanUndirectedGraph.md) -* [](/docs/LeetCode/324._Wiggle_Sort_II.md) -* [](/docs/LeetCode/326._power_of_three.md) -* [](/docs/LeetCode/328._odd_even_linked_list.md) -* [](/docs/LeetCode/334._increasing_triplet_subsequence.md) -* [](/docs/LeetCode/337._house_robber_iii.md) -* [](/docs/LeetCode/338.CountingBits.md) -* [](/docs/LeetCode/339.NestedListWeightSum.md) -* [](/docs/LeetCode/341._Flatten_Nested_List_Iterator.md) -* [](/docs/LeetCode/342._Power_of_Four.md) -* [](/docs/LeetCode/344._reverse_string.md) -* [](/docs/LeetCode/345._Reverse_Vowels_of_a_String.md) -* [](/docs/LeetCode/349._intersection_of_two_arrays.md) -* [](/docs/LeetCode/350._intersection_of_two_arrays_ii.md) -* [](/docs/LeetCode/353.DesignSnakeGame.md) -* [](/docs/LeetCode/364.NestedListWeightSumII.md) -* [](/docs/LeetCode/366.FindLeavesofBinaryTree.md) -* [](/docs/LeetCode/367._valid_perfect_square.md) -* [](/docs/LeetCode/369.PlusOneLinkedList.md) -* [](/docs/LeetCode/371._sum_of_two_integers.md) -* [](/docs/LeetCode/374._Guess_Number_Higher_or_Lower.md) -* [](/docs/LeetCode/377._combination_sum_iv.md) -* [](/docs/LeetCode/378._kth_smallest_element_in_a_sorted_matrix.md) -* [](/docs/LeetCode/380.InsertDeleteGetRandomO(1).md) -* [](/docs/LeetCode/381.InsertDeleteGetRandomO(1)-Duplicatesallowed.md) -* [](/docs/LeetCode/382._linked_list_random_node.md) -* [](/docs/LeetCode/383._ransom_note.md) -* [](/docs/LeetCode/384.ShuffleanArray.md) -* [](/docs/LeetCode/387._first_unique_character_in_a_string.md) -* [](/docs/LeetCode/388._Longest_Absolute_File_Path.md) -* [](/docs/LeetCode/389._find_the_difference.md) -* [](/docs/LeetCode/392._is_subsequence.md) -* [](/docs/LeetCode/394._decode_string.md) -* [](/docs/LeetCode/400.NthDigit.md) -* [](/docs/LeetCode/401._binary_watch.md) -* [](/docs/LeetCode/404._sum_of_left_leaves.md) -* [](/docs/LeetCode/405.ConvertaNumbertoHexadecimal.md) -* [](/docs/LeetCode/406._Queue_Reconstruction_by_Height.md) -* [](/docs/LeetCode/412._fizz_buzz.md) -* [](/docs/LeetCode/413.ArithmeticSlices.md) -* [](/docs/LeetCode/414._third_maximum_number.md) -* [](/docs/LeetCode/415._add_strings.md) -* [](/docs/LeetCode/416.PartitionEqualSubsetSum.md) -* [](/docs/LeetCode/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md) -* [](/docs/LeetCode/422.ValidWordSquare.md) -* [](/docs/LeetCode/434._number_of_segments_in_a_string.md) -* [](/docs/LeetCode/437._path_sum_iii.md) -* [](/docs/LeetCode/438._Find_All_Anagrams_in_a_String.md) -* [](/docs/LeetCode/439.TernaryExpressionParser.md) -* [](/docs/LeetCode/441._arranging_coins.md) -* [](/docs/LeetCode/448._Find_All_Numbers_Disappeared_in_an_Array.md) -* [](/docs/LeetCode/450.DeleteNodeinaBST.md) -* [](/docs/LeetCode/453._Minimum_Moves_to_Equal_Array_Elements.md) -* [](/docs/LeetCode/459._Repeated_Substring_Pattern.md) -* [](/docs/LeetCode/461._HammingDistance.md) -* [](/docs/LeetCode/463._Island_Perimeter.md) -* [](/docs/LeetCode/467._Unique_Substrings_in_Wraparound_String.md) -* [](/docs/LeetCode/469.ConvexPolygon.md) -* [](/docs/LeetCode/476._Number_Complement.md) -* [](/docs/LeetCode/477._Total_Hamming_Distance.md) -* [](/docs/LeetCode/485._Max_Consecutive_Ones.md) -* [](/docs/LeetCode/587._Erect_the_Fence.md) -* [](/docs/LeetCode/599._Minimum_Index_Sum_of_Two_Lists.md) -* [](/docs/LeetCode/647._Palindromic_Substrings.md) -* [](/docs/LeetCode/657._Judge_Route_Circle.md) -* [](/docs/LeetCode/665._Non-decreasing_Array.md) -* [](/docs/LeetCode/672._Bulb_Switcher_II.md) -* [](/docs/LeetCode/681._Next_Closest_Time.md) -* [](/docs/LeetCode/682._Baseball_Game.md) -* [](/docs/LeetCode/687._Longest_Univalue_Path.md) -* [](/docs/LeetCode/740._delete_and_earn.md) -* [](/docs/LeetCode/760._Find_Anagram_Mappings.md) - -## 推荐的一些LeetCode网站 - -1. [KrisYu的GItuhub](https://github.com/KrisYu/LeetCode-CLRS-Python) -2. [kamyu104的Github](https://github.com/kamyu104/LeetCode) -3. [数据结构与算法/leetcode/lintcode题解](https://algorithm.yuanbin.me/zh-hans/) -4. [Leetcode 讨论区](https://discuss.leetcode.com/) -5. [visualgo算法可视化网站](https://visualgo.net/en) -6. [Data Structure Visualization](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) -7. [我的算法学习之路 - Lucida](http://zh.lucida.me/blog/on-learning-algorithms/) -8. [HiredInTech](https://www.hiredintech.com/) System Design 的总结特别适合入门 -9. [mitcc的Github](https://github.com/mitcc/AlgoSolutions) -10. [小土刀的面试刷题笔记](http://wdxtub.com/interview/14520594642530.html) - - - 💪就是干! - - - - - - - diff --git a/docs/SortingAlgorithm/README.md b/docs/SortingAlgorithm/README.md index 189bfb603..2d6c32fc4 100644 --- a/docs/SortingAlgorithm/README.md +++ b/docs/SortingAlgorithm/README.md @@ -1,389 +1,312 @@ -## 前言 -八大排序,三大查找是《数据结构》当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法。 -常见的八大排序算法,他们之间关系如下: +# LeetCode 面试题 -![](/images/SortingAlgorithm/八大排序算法总结.png) - -他们的性能比较: +## [八大算法算](/docs/SortingAlgorithm/README.md) ![](/images/SortingAlgorithm/八大排序算法性能.png) -### 直接插入排序 (Insertion sort) - -![](/images/SortingAlgorithm/直接插入排序.gif) - -直接插入排序的核心思想就是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。 -因此,从上面的描述中我们可以发现,直接插入排序可以用两个循环完成: - -1. 第一层循环:遍历待比较的所有数组元素 -2. 第二层循环:将本轮选择的元素(selected)与已经排好序的元素(ordered)相比较。 - - 如果```selected > ordered```,那么将二者交换 - -```python -#直接插入排序 -def insert_sort(L): - #遍历数组中的所有元素,其中0号索引元素默认已排序,因此从1开始 - for x in range(1,len(L)): - #将该元素与已排序好的前序数组依次比较,如果该元素小,则交换 - #range(x-1,-1,-1):从x-1倒序循环到0 - for i in range(x-1,-1,-1): - #判断:如果符合条件则交换 - if L[i] > L[i+1]: - L[i], L[i+1] = L[i+1], L[i] -``` -### 希尔排序 (Shell sort) - -![](/images/SortingAlgorithm/希尔排序.png) - -希尔排序的算法思想:将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序。 -同样的:从上面的描述中我们可以发现:希尔排序的总体实现应该由三个循环完成: - -1. 第一层循环:将gap依次折半,对序列进行分组,直到gap=1 -2. 第二、三层循环:也即直接插入排序所需要的两次循环。具体描述见上。 - -```python -#希尔排序 -def insert_shell(L): - #初始化gap值,此处利用序列长度的一半为其赋值 - gap = int(len(L)/2) - #第一层循环:依次改变gap值对列表进行分组 - while (gap >= 1): - #下面:利用直接插入排序的思想对分组数据进行排序 - #range(gap,len(L)):从gap开始 - for x in range(gap,len(L)): - #range(x-gap,-1,-gap):从x-gap开始与选定元素开始倒序比较,每个比较元素之间间隔gap - for i in range(x-gap,-1,-gap): - #如果该组当中两个元素满足交换条件,则进行交换 - if L[i] > L[i+gap]: - L[i], L[i+gap] = L[i+gap], L[i] - #while循环条件折半 - gap = int((gap/2)) -``` - -### 简单选择排序 (Selection sort) - -![](/images/SortingAlgorithm/简单选择排序.gif) - -简单选择排序的基本思想:比较+交换。 - -1. 从待排序序列中,找到关键字最小的元素; -2. 如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换; -3. 从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。 -因此我们可以发现,简单选择排序也是通过两层循环实现。 - - 第一层循环:依次遍历序列当中的每一个元素 - - 第二层循环:将遍历得到的当前元素依次与余下的元素进行比较,符合最小元素的条件,则交换。 - -```python -# 简单选择排序 -def select_sort(L): -#依次遍历序列中的每一个元素 - for x in range(0,len(L)): -#将当前位置的元素定义此轮循环当中的最小值 - minimum = L[x] -#将该元素与剩下的元素依次比较寻找最小元素 - for i in range(x+1,len(L)): - if L[i] < minimum: - L[i], minimum = minimum, L[i] -#将比较后得到的真正的最小值赋值给当前位置 - L[x] = minimum -``` - -### 堆排序 (Heap sort) - -#### 堆的概念 - -堆:本质是一种数组对象。特别重要的一点性质:任意的叶子节点小于(或大于)它所有的父节点。对此,又分为大顶堆和小顶堆,大顶堆要求节点的元素都要大于其孩子,小顶堆要求节点元素都小于其左右孩子,两者对左右孩子的大小关系不做任何要求。 -利用堆排序,就是基于大顶堆或者小顶堆的一种排序方法。下面,我们通过大顶堆来实现。 - -基本思想: -堆排序可以按照以下步骤来完成: - -1. 首先将序列构建称为大顶堆; - -(这样满足了大顶堆那条性质:位于根节点的元素一定是当前序列的最大值) - -![](/images/SortingAlgorithm/构建大顶堆.png) - -2. 取出当前大顶堆的根节点,将其与序列末尾元素进行交换; - -(此时:序列末尾的元素为已排序的最大值;由于交换了元素,当前位于根节点的堆并不一定满足大顶堆的性质) - -3. 对交换后的n-1个序列元素进行调整,使其满足大顶堆的性质; - -![](/images/SortingAlgorithm/调整大顶堆.png) - -4. 重复2.3步骤,直至堆中只有1个元素为止 - -```python -#-------------------------堆排序-------------------------------- -#**********获取左右叶子节点********** -def LEFT(i): - return 2*i + 1 -def RIGHT(i): - return 2*i + 2 -#********** 调整大顶堆 ********** -#L:待调整序列 length: 序列长度 i:需要调整的结点 -def adjust_max_heap(L, length, i): -#定义一个int值保存当前序列最大值的下标 - largest = i -#获得序列左右叶子节点的下标 - left, right = LEFT(i), RIGHT(i) -#当左叶子节点的下标小于序列长度 并且 左叶子节点的值大于父节点时,将左叶子节点的下标赋值给largest - if (left < length) and (L[left] > L[i]): - largest = left -#当右叶子节点的下标小于序列长度 并且 右叶子节点的值大于父节点时,将右叶子节点的下标值赋值给largest - if (right < length) and (L[right] > L[largest]): - largest = right -#如果largest不等于i 说明当前的父节点不是最大值,需要交换值 - if (largest != i): - L[i], L[largest] = L[largest], L[i] - # 执行递归操作:两个任务:1 寻找最大值的下标;2.最大值与父节点交换 - adjust_max_heap(L, length, largest) -#********** 建立大顶堆 ********** -def build_max_heap(L): - length = len(L) - for x in range(int((length-1)/2), -1, -1): - adjust_max_heap(L, length, x) -#********** 堆排序 ********** -def heap_sort(L): -#先建立大顶堆,保证最大值位于根节点;并且父节点的值大于叶子结点 - build_max_heap(L) -#i:当前堆中序列的长度.初始化为序列的长度 - i = len(L) -#执行循环:1. 每次取出堆顶元素置于序列的最后(len-1,len-2,len-3...) -# 2. 调整堆,使其继续满足大顶堆的性质,注意实时修改堆中序列的长度 - while (i > 0): - L[i-1], L[0] = L[0], L[i-1] -#堆中序列长度减1 - i -= 1 -#调整大顶堆 - adjust_max_heap(L, i, 0) -``` -### 冒泡排序 (Bubble sort) - -![](/images/SortingAlgorithm/冒泡排序.gif) - -冒泡排序思路比较简单: - -1. 将序列当中的左右元素,依次比较,保证右边的元素始终大于左边的元素; -( 第一轮结束后,序列最后一个元素一定是当前序列的最大值;) -2. 对序列当中剩下的n-1个元素再次执行步骤1。 -3. 对于长度为n的序列,一共需要执行n-1轮比较 -(利用while循环可以减少执行次数) - -```python -#冒泡排序 -def bubble_sort(L): - length = len(L) -#序列长度为length,需要执行length-1轮交换 - for x in range(1, length): -#对于每一轮交换,都将序列当中的左右元素进行比较 -#每轮交换当中,由于序列最后的元素一定是最大的,因此每轮循环到序列未排序的位置即可 - for i in range(0, length-x): - if L[i] > L[i+1]: - L[i], L[i+1] = L[i+1], L[i] -``` - -### 快速排序 (Quick sort) - -![](/images/SortingAlgorithm/快速排序.gif) - -快速排序的基本思想:挖坑填数+分治法 - -1. 从序列当中选择一个基准数(pivot) -在这里我们选择序列当中第一个数作为基准数 -2. 将序列当中的所有数依次遍历,比基准数大的位于其右侧,比基准数小的位于其左侧 -3. 重复步骤1.2,直到所有子集当中只有一个元素为止。 - -用伪代码描述如下: -- i =L; j = R; 将基准数挖出形成第一个坑a[i]。 -- j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。 -- i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。 -- 再重复执行2,3二步,直到i==j,将基准数填入a[i]中 - -```python -#快速排序 -#L:待排序的序列;start排序的开始index,end序列末尾的index -#对于长度为length的序列:start = 0;end = length-1 -def quick_sort(L, start, end): - if start < end: - i, j, pivot = start, end, L[start] - while i < j: -#从右开始向左寻找第一个小于pivot的值 - while (i < j) and (L[j] >= pivot): - j -= 1 -#将小于pivot的值移到左边 - if (i < j): - L[i] = L[j] - i += 1 -#从左开始向右寻找第一个大于pivot的值 - while (i < j) and (L[i] <= pivot): - i += 1 -#将大于pivot的值移到右边 - if (i < j): - L[j] = L[i] - j -= 1 -#循环结束后,说明 i=j,此时左边的值全都小于pivot,右边的值全都大于pivot -#pivot的位置移动正确,那么此时只需对左右两侧的序列调用此函数进一步排序即可 -#递归调用函数:依次对左侧序列:从0 ~ i-1//右侧序列:从i+1 ~ end - L[i] = pivot -#左侧序列继续排序 - quick_sort(L, start, i-1) -#右侧序列继续排序 - quick_sort(L, i+1, end) -``` - -### 归并排序 (Merge sort) - -![](/images/SortingAlgorithm/归并排序.gif) - -1. 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个典型的应用。它的基本操作是:将已有的子序列合并,达到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 -2. 归并排序其实要做两件事: - - 分解----将序列每次折半拆分 - - 合并----将划分后的序列段两两排序合并 -因此,归并排序实际上就是两个操作,拆分+合并 -3. 如何合并? - - L[first...mid]为第一段,L[mid+1...last]为第二段,并且两端已经有序,现在我们要将两端合成达到L[first...last]并且也有序。 - - 首先依次从第一段与第二段中取出元素比较,将较小的元素赋值给temp[] - - 重复执行上一步,当某一段赋值结束,则将另一段剩下的元素赋值给temp[] - - 此时将temp[]中的元素复制给L[],则得到的L[first...last]有序 -4. 如何分解? - - 在这里,我们采用递归的方法,首先将待排序列分成A,B两组; - - 然后重复对A、B序列分组; - - 直到分组后组内只有一个元素,此时我们认为组内所有元素有序,则分组结束。 - -```python -# 归并排序 -#这是合并的函数 -# 将序列L[first...mid]与序列L[mid+1...last]进行合并 -def mergearray(L, first, mid, last, temp): -#对i,j,k分别进行赋值 - i, j, k = first, mid+1, 0 -#当左右两边都有数时进行比较,取较小的数 - while (i <= mid) and (j <= last): - if L[i] <= L[j]: - temp[k] = L[i] - i += 1 - k += 1 - else: - temp[k] = L[j] - j += 1 - k += 1 -#如果左边序列还有数 - while (i <= mid): - temp[k] = L[i] - i += 1 - k += 1 -#如果右边序列还有数 - while (j <= last): - temp[k] = L[j] - j += 1 - k += 1 -#将temp当中该段有序元素赋值给L待排序列使之部分有序 - for x in range(0, k): - L[first+x] = temp[x] -# 这是分组的函数 -def merge_sort(L, first, last, temp): - if first < last: - mid = int(((first + last) / 2)) -#使左边序列有序 - merge_sort(L, first, mid, temp) -#使右边序列有序 - merge_sort(L, mid+1, last, temp) -#将两个有序序列合并 - mergearray(L, first, mid, last, temp) -# 归并排序的函数 -def merge_sort_array(L): -#声明一个长度为len(L)的空列表 - temp = len(L)*[None] -#调用归并排序 - merge_sort(L, 0, len(L)-1, temp) -``` - -### 基数排序 (Radix sort) - -![](/images/SortingAlgorithm/基数排序.gif) - -1. 基数排序:通过序列中各个元素的值,对排序的N个元素进行若干趟的“分配”与“收集”来实现排序。 - - 分配:我们将L[i]中的元素取出,首先确定其个位上的数字,根据该数字分配到与之序号相同的桶中 - - 收集:当序列中所有的元素都分配到对应的桶中,再按照顺序依次将桶中的元素收集形成新的一个待排序列L[ ] - - 对新形成的序列L[]重复执行分配和收集元素中的十位、百位...直到分配完该序列中的最高位,则排序结束 -2. 根据上述“基数排序”的展示,我们可以清楚的看到整个实现的过程 - -```python -#************************基数排序**************************** -#确定排序的次数 -#排序的顺序跟序列中最大数的位数相关 -def radix_sort_nums(L): - maxNum = L[0] -#寻找序列中的最大数 - for x in L: - if maxNum < x: - maxNum = x -#确定序列中的最大元素的位数 - times = 0 - while (maxNum > 0): - maxNum = int((maxNum/10)) - times += 1 - return times -#找到num从低到高第pos位的数据 -def get_num_pos(num, pos): - return (int((num/(10**(pos-1))))) % 10 -#基数排序 -def radix_sort(L): - count = 10 * [None] #存放各个桶的数据统计个数 - bucket = len(L) * [None] #暂时存放排序结果 -#从低位到高位依次执行循环 - for pos in range(1, radix_sort_nums(L)+1): - #置空各个桶的数据统计 - for x in range(0, 10): - count[x] = 0 - #统计当前该位(个位,十位,百位....)的元素数目 - for x in range(0, len(L)): - #统计各个桶将要装进去的元素个数 - j = get_num_pos(int(L[x]), pos) - count[j] += 1 - #count[i]表示第i个桶的右边界索引 - for x in range(1,10): - count[x] += count[x-1] - #将数据依次装入桶中 - for x in range(len(L)-1, -1, -1): - #求出元素第K位的数字 - j = get_num_pos(L[x], pos) - #放入对应的桶中,count[j]-1是第j个桶的右边界索引 - bucket[count[j]-1] = L[x] - #对应桶的装入数据索引-1 - count[j] -= 1 - # 将已分配好的桶中数据再倒出来,此时已是对应当前位数有序的表 - for x in range(0, len(L)): - L[x] = bucket[x] -``` - - - - - -## 运行时间实测 -10w数据 -``` -直接插入排序:1233.581131 -希尔排序:1409.8012320000003 -简单选择排序:466.66974500000015 -堆排序:1.2036720000000969 -冒泡排序:751.274449 -#**************************************************** -快速排序:1.0000003385357559e-06 -#快速排序有误:实际上并未执行 -#RecursionError: maximum recursion depth exceeded in comparison -#**************************************************** -归并排序:0.8262230000000272 -基数排序:1.1162899999999354 -``` -从运行结果上来看,堆排序、归并排序、基数排序真的快。 -对于快速排序迭代深度超过的问题,可以将考虑将快排通过非递归的方式进行实现。 - -## Resources - -1. [算法导论》笔记汇总](http://mindlee.com/2011/08/21/study-notes-directory/) -2. [八大排序算法的 Python 实现](http://python.jobbole.com/82270/) -3. [数据结构常见的八大排序算法(详细整理)](https://www.jianshu.com/p/7d037c332a9d) +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | + +## 面试问答 + +* [Google面试题](/docs/interview/Google/Google.md) +* [pocketgems 面试题](/docs/interview/pocketgems/pocketgems.md) +* [WePay 面试题](/docs/interview/WePay/WePay.md) + +## LeetCode算法题 + +* [](docs/某类别/001._two_sum.md) +* [](/docs/某类别/002._add_two_numbers.md) +* [](/docs/某类别/003._longest_substring_without_repeating_characters.md) +* [](/docs/某类别/004._median_of_two_sorted_arrays.md) +* [](/docs/某类别/005._longest_palindromic_substring.md) +* [](/docs/某类别/007._Reverse_Integer.md) +* [](/docs/某类别/008._string_to_integer_(atoi).md) +* [](/docs/某类别/010._regular_expression_matching.md) +* [](/docs/某类别/011._container_with_most_water.md) +* [](/docs/某类别/012._Integer_to_Roman.md) +* [](/docs/某类别/013._Roman_to_Integer.md) +* [](/docs/某类别/014._longest_common_prefix.md) +* [](/docs/某类别/015._3sum.md) +* [](/docs/某类别/016._3sum_closest.md) +* [](/docs/某类别/017._letter_combinations_of_a_phone_number.md) +* [](/docs/某类别/018._4sum.md) +* [](/docs/某类别/019._remove_nth_node_from_end_of_list.md) +* [](/docs/某类别/020._valid_parentheses.md) +* [](/docs/某类别/021._merge_two_sorted_lists.md) +* [](/docs/某类别/022._generate_parentheses.md) +* [](/docs/某类别/023._merge_k_sorted_lists.md) +* [](/docs/某类别/024._swap_nodes_in_pairs.md) +* [](/docs/某类别/026._Remove_Duplicates_from_Sorted_Array.md) +* [](/docs/某类别/027._Remove_Element.md) +* [](/docs/某类别/028._implement_strstr().md) +* [](/docs/某类别/030._Substring_with_Concatenation_of_All_Words.md) +* [](/docs/某类别/031._next_permutation.md) +* [](/docs/某类别/033._search_in_rotated_sorted_array.md) +* [](/docs/某类别/034._SearchforaRange.md) +* [](/docs/某类别/035._search_insert_position.md) +* [](/docs/某类别/038._Count_and_Say.md) +* [](/docs/某类别/039._combination_sum.md) +* [](/docs/某类别/040._combination_sum_ii.md) +* [](/docs/某类别/042._trapping_rain_water.md) +* [](/docs/某类别/043._multiply_strings.md) +* [](/docs/某类别/044._wildcard_matching.md) +* [](/docs/某类别/045._Jump_Game_II.md) +* [](/docs/某类别/046._permutations.md) +* [](/docs/某类别/047._permutations_ii.md) +* [](/docs/某类别/048._rotate_image.md) +* [](/docs/某类别/049._group_anagrams_python.md) +* [](/docs/某类别/050._pow(x,_n).md) +* [](/docs/某类别/051._n-queens.md) +* [](/docs/某类别/052._n-queens_ii.md) +* [](/docs/某类别/053._maximum_subarray.md) +* [](/docs/某类别/054._spiral_matrix.md) +* [](/docs/某类别/055._jump_game.md) +* [](/docs/某类别/056._Merge_Intervals.md) +* [](/docs/某类别/058._length_of_last_word.md) +* [](/docs/某类别/059._spiral_matrix_ii.md) +* [](/docs/某类别/060._permutation_sequence.md) +* [](/docs/某类别/061._rotate_list.md) +* [](/docs/某类别/064._minimum_path_sum.md) +* [](/docs/某类别/065.unique_paths_ii.md) +* [](/docs/某类别/066._plus_one.md) +* [](/docs/某类别/067._add_binary.md) +* [](/docs/某类别/069._sqrt(x).md) +* [](/docs/某类别/070.ClimbingStairs.md) +* [](/docs/某类别/072._edit_distance.md) +* [](/docs/某类别/073.SetMatrixZeroes.md) +* [](/docs/某类别/074._search_a_2d_matrix.md) +* [](/docs/某类别/075._sort_colors.md) +* [](/docs/某类别/076._Minimum_Window_Substring.md) +* [](/docs/某类别/077._combinations.md) +* [](/docs/某类别/078.Subsets.md) +* [](/docs/某类别/079._word_search.md) +* [](/docs/某类别/082._remove_duplicates_from_sorted_list_ii.md) +* [](/docs/某类别/083._remove_duplicates_from_sorted_list.md) +* [](/docs/某类别/086._partition_list.md) +* [](/docs/某类别/088._merge_sorted_array.md) +* [](/docs/某类别/089._gray_code.md) +* [](/docs/某类别/090._subsets_ii.md) +* [](/docs/某类别/091._decode_ways.md) +* [](/docs/某类别/092._reverse_linked_list_ii.md) +* [](/docs/某类别/093._restore_ip_addresses.md) +* [](/docs/某类别/094._binary_tree_inorder_traversal.md) +* [](/docs/某类别/096._unique_binary_search_trees.md) +* [](/docs/某类别/098._validate_binary_search_tree.md) +* [](/docs/某类别/100._same_tree.md) +* [](/docs/某类别/101._symmetric_tree.md) +* [](/docs/某类别/102._binary_tree_level_order_traversal.md) +* [](/docs/某类别/103._binary_tree_zigzag_level_order_traversal.md) +* [](/docs/某类别/104._maximum_depth_of_binary_tree.md) +* [](/docs/某类别/105._construct_binary_tree_from_preorder_and_inorder_traversal.md) +* [](/docs/某类别/106._construct_binary_tree_from_inorder_and_postorder_traversal.md) +* [](/docs/某类别/107._binary_tree_level_order_traversal_ii.md) +* [](/docs/某类别/108._convert_sorted_array_to_binary_search_tree.md) +* [](/docs/某类别/109._convert_sorted_list_to_binary_search_tree.md) +* [](/docs/某类别/110._balanced_binary_tree.md) +* [](/docs/某类别/111._minimum_depth_of_binary_tree.md) +* [](/docs/某类别/112._path_sum.md) +* [](/docs/某类别/113._path_sum_ii.md) +* [](/docs/某类别/114._flatten_binary_tree_to_linked_list.md) +* [](/docs/某类别/116._populating_next_right_pointers_in_each_node.md) +* [](/docs/某类别/118._pascal's_triangle.md) +* [](/docs/某类别/119.Pascal'sTriangleII.md) +* [](/docs/某类别/120.Triangle.md) +* [](/docs/某类别/121._Best_Time_to_Buy_and_Sell_Stock.md) +* [](/docs/某类别/125._valid_palindrome.md) +* [](/docs/某类别/126.WordLadderII.md) +* [](/docs/某类别/127._word_ladder.md) +* [](/docs/某类别/128._Longest_Consecutive_Sequence.md) +* [](/docs/某类别/129._sum_root_to_leaf_numbers.md) +* [](/docs/某类别/130._surrounded_regions.md) +* [](/docs/某类别/131._palindrome_partitioning.md) +* [](/docs/某类别/133._clone_graph.md) +* [](/docs/某类别/136._single_number.md) +* [](/docs/某类别/139._word_break.md) +* [](/docs/某类别/140._word_break_ii.md) +* [](/docs/某类别/141._linked_list_cycle.md) +* [](/docs/某类别/142_Linked_List_Cycle_II.md) +* [](/docs/某类别/143._reorder_list.md) +* [](/docs/某类别/144._binary_tree_preorder_traversal.md) +* [](/docs/某类别/145._binary_tree_postorder_traversal.md) +* [](/docs/某类别/147._insertion_sort_list.md) +* [](/docs/某类别/148._sort_list.md) +* [](/docs/某类别/150._evaluate_reverse_polish_notation.md) +* [](/docs/某类别/151._reverse_words_in_a_string.md) +* [](/docs/某类别/152._maximum_product_subarray.md) +* [](/docs/某类别/153._find_minimum_in_rotated_sorted_array.md) +* [](/docs/某类别/155._min_stack.md) +* [](/docs/某类别/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md) +* [](/docs/某类别/160._intersection_of_two_linked_lists.md) +* [](/docs/某类别/162._find_peak_element.md) +* [](/docs/某类别/165._compare_version_numbers.md) +* [](/docs/某类别/166._Fraction_to_Recurring_Decimal.md) +* [](/docs/某类别/167._two_sum_ii_-_input_array_is_sorted.md) +* [](/docs/某类别/168._excel_sheet_column_title.md) +* [](/docs/某类别/169._majority_element.md) +* [](/docs/某类别/171._excel_sheet_column_number.md) +* [](/docs/某类别/173._binary_search_tree_iterator.md) +* [](/docs/某类别/189._rotate_array.md) +* [](/docs/某类别/191._number_of_1_bits.md) +* [](/docs/某类别/198._house_robber.md) +* [](/docs/某类别/199._binary_tree_right_side_view.md) +* [](/docs/某类别/200._number_of_islands.md) +* [](/docs/某类别/203._remove_linked_list_elements.md) +* [](/docs/某类别/204._count_primes.md) +* [](/docs/某类别/205._isomorphic_strings.md) +* [](/docs/某类别/206._reverse_linked_list.md) +* [](/docs/某类别/207._course_schedule.md) +* [](/docs/某类别/208._implement_trie_(prefix_tree).md) +* [](/docs/某类别/210._course_schedule_ii.md) +* [](/docs/某类别/211.AddandSearchWord-Datastructuredesign.md) +* [](/docs/某类别/213._house_robber_ii.md) +* [](/docs/某类别/216._combination_sum_iii.md) +* [](/docs/某类别/217._contains_duplicate.md) +* [](/docs/某类别/218._The_Skyline_Problem.md) +* [](/docs/某类别/219._contains_duplicate_ii.md) +* [](/docs/某类别/221._maximal_square.md) +* [](/docs/某类别/222._count_complete_tree_nodes.md) +* [](/docs/某类别/223._rectangle_area.md) +* [](/docs/某类别/224.BasicCalculator.md) +* [](/docs/某类别/225._implement_stack_using_queues.md) +* [](/docs/某类别/226._invert_binary_tree.md) +* [](/docs/某类别/227._basic_calculator_ii.md) +* [](/docs/某类别/228._summary_ranges.md) +* [](/docs/某类别/229._majority_element_ii.md) +* [](/docs/某类别/230._kth_smallest_element_in_a_bst.md) +* [](/docs/某类别/231._Power_of_Two.md) +* [](/docs/某类别/232._implement_queue_using_stacks.md) +* [](/docs/某类别/234._palindrome_linked_list.md) +* [](/docs/某类别/235._lowest_common_ancestor_of_a_binary_search_tree.md) +* [](/docs/某类别/236._lowest_common_ancestor_of_a_binary_tree.md) +* [](/docs/某类别/237._delete_node_in_a_linked_list.md) +* [](/docs/某类别/238._product_of_array_except_self.md) +* [](/docs/某类别/240._search_a_2d_matrix_ii.md) +* [](/docs/某类别/242._valid_anagram.md) +* [](/docs/某类别/252.MeetingRooms.md) +* [](/docs/某类别/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md) +* [](/docs/某类别/256.PaintHouse.md) +* [](/docs/某类别/257._binary_tree_paths.md) +* [](/docs/某类别/258_Add_Digits.md) +* [](/docs/某类别/261.GraphValidTree.md) +* [](/docs/某类别/263._ugly_number.md) +* [](/docs/某类别/264._ugly_number_ii.md) +* [](/docs/某类别/265.PaintHouseII.md) +* [](/docs/某类别/266.PalindromePermutation.md) +* [](/docs/某类别/267.PalindromePermutationII.md) +* [](/docs/某类别/268._missing_number.md) +* [](/docs/某类别/270.ClosestBinarySearchTreeValue.md) +* [](/docs/某类别/276.PaintFence.md) +* [](/docs/某类别/277.FindtheCelebrity.md) +* [](/docs/某类别/278._First_Bad_Version.md) +* [](/docs/某类别/279._perfect_squares.md) +* [](/docs/某类别/280._Wiggle_Sort.md) +* [](/docs/某类别/283._move_zeroes.md) +* [](/docs/某类别/285._inorder_successor_in_bst.md) +* [](/docs/某类别/286.WallsandGates.md) +* [](/docs/某类别/289._game_of_life.md) +* [](/docs/某类别/290._word_pattern.md) +* [](/docs/某类别/292._nim_game.md) +* [](/docs/某类别/296.BestMeetingPoint.md) +* [](/docs/某类别/298.BinaryTreeLongestConsecutiveSequence.md) +* [](/docs/某类别/299._bulls_and_cows.md) +* [](/docs/某类别/300._longest_increasing_subsequence.md) +* [](/docs/某类别/303._range_sum_query_-_immutable.md) +* [](/docs/某类别/316._Remove_Duplicate_Letters.md) +* [](/docs/某类别/319._Bulb_Switcher.md) +* [](/docs/某类别/322.CoinChange.md) +* [](/docs/某类别/323.NumberofConnectedComponentsinanUndirectedGraph.md) +* [](/docs/某类别/324._Wiggle_Sort_II.md) +* [](/docs/某类别/326._power_of_three.md) +* [](/docs/某类别/328._odd_even_linked_list.md) +* [](/docs/某类别/334._increasing_triplet_subsequence.md) +* [](/docs/某类别/337._house_robber_iii.md) +* [](/docs/某类别/338.CountingBits.md) +* [](/docs/某类别/339.NestedListWeightSum.md) +* [](/docs/某类别/341._Flatten_Nested_List_Iterator.md) +* [](/docs/某类别/342._Power_of_Four.md) +* [](/docs/某类别/344._reverse_string.md) +* [](/docs/某类别/345._Reverse_Vowels_of_a_String.md) +* [](/docs/某类别/349._intersection_of_two_arrays.md) +* [](/docs/某类别/350._intersection_of_two_arrays_ii.md) +* [](/docs/某类别/353.DesignSnakeGame.md) +* [](/docs/某类别/364.NestedListWeightSumII.md) +* [](/docs/某类别/366.FindLeavesofBinaryTree.md) +* [](/docs/某类别/367._valid_perfect_square.md) +* [](/docs/某类别/369.PlusOneLinkedList.md) +* [](/docs/某类别/371._sum_of_two_integers.md) +* [](/docs/某类别/374._Guess_Number_Higher_or_Lower.md) +* [](/docs/某类别/377._combination_sum_iv.md) +* [](/docs/某类别/378._kth_smallest_element_in_a_sorted_matrix.md) +* [](/docs/某类别/380.InsertDeleteGetRandomO(1).md) +* [](/docs/某类别/381.InsertDeleteGetRandomO(1)-Duplicatesallowed.md) +* [](/docs/某类别/382._linked_list_random_node.md) +* [](/docs/某类别/383._ransom_note.md) +* [](/docs/某类别/384.ShuffleanArray.md) +* [](/docs/某类别/387._first_unique_character_in_a_string.md) +* [](/docs/某类别/388._Longest_Absolute_File_Path.md) +* [](/docs/某类别/389._find_the_difference.md) +* [](/docs/某类别/392._is_subsequence.md) +* [](/docs/某类别/394._decode_string.md) +* [](/docs/某类别/400.NthDigit.md) +* [](/docs/某类别/401._binary_watch.md) +* [](/docs/某类别/404._sum_of_left_leaves.md) +* [](/docs/某类别/405.ConvertaNumbertoHexadecimal.md) +* [](/docs/某类别/406._Queue_Reconstruction_by_Height.md) +* [](/docs/某类别/412._fizz_buzz.md) +* [](/docs/某类别/413.ArithmeticSlices.md) +* [](/docs/某类别/414._third_maximum_number.md) +* [](/docs/某类别/415._add_strings.md) +* [](/docs/某类别/416.PartitionEqualSubsetSum.md) +* [](/docs/某类别/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md) +* [](/docs/某类别/422.ValidWordSquare.md) +* [](/docs/某类别/434._number_of_segments_in_a_string.md) +* [](/docs/某类别/437._path_sum_iii.md) +* [](/docs/某类别/438._Find_All_Anagrams_in_a_String.md) +* [](/docs/某类别/439.TernaryExpressionParser.md) +* [](/docs/某类别/441._arranging_coins.md) +* [](/docs/某类别/448._Find_All_Numbers_Disappeared_in_an_Array.md) +* [](/docs/某类别/450.DeleteNodeinaBST.md) +* [](/docs/某类别/453._Minimum_Moves_to_Equal_Array_Elements.md) +* [](/docs/某类别/459._Repeated_Substring_Pattern.md) +* [](/docs/某类别/461._HammingDistance.md) +* [](/docs/某类别/463._Island_Perimeter.md) +* [](/docs/某类别/467._Unique_Substrings_in_Wraparound_String.md) +* [](/docs/某类别/469.ConvexPolygon.md) +* [](/docs/某类别/476._Number_Complement.md) +* [](/docs/某类别/477._Total_Hamming_Distance.md) +* [](/docs/某类别/485._Max_Consecutive_Ones.md) +* [](/docs/某类别/587._Erect_the_Fence.md) +* [](/docs/某类别/599._Minimum_Index_Sum_of_Two_Lists.md) +* [](/docs/某类别/647._Palindromic_Substrings.md) +* [](/docs/某类别/657._Judge_Route_Circle.md) +* [](/docs/某类别/665._Non-decreasing_Array.md) +* [](/docs/某类别/672._Bulb_Switcher_II.md) +* [](/docs/某类别/681._Next_Closest_Time.md) +* [](/docs/某类别/682._Baseball_Game.md) +* [](/docs/某类别/687._Longest_Univalue_Path.md) +* [](/docs/某类别/740._delete_and_earn.md) +* [](/docs/某类别/760._Find_Anagram_Mappings.md) + +## 推荐的一些LeetCode网站 + +1. [KrisYu的GItuhub](https://github.com/KrisYu/LeetCode-CLRS-Python) +2. [kamyu104的Github](https://github.com/kamyu104/LeetCode) +3. [数据结构与算法/leetcode/lintcode题解](https://algorithm.yuanbin.me/zh-hans/) +4. [Leetcode 讨论区](https://discuss.leetcode.com/) +5. [visualgo算法可视化网站](https://visualgo.net/en) +6. [Data Structure Visualization](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) +7. [我的算法学习之路 - Lucida](http://zh.lucida.me/blog/on-learning-algorithms/) +8. [HiredInTech](https://www.hiredintech.com/) System Design 的总结特别适合入门 +9. [mitcc的Github](https://github.com/mitcc/AlgoSolutions) +10. [小土刀的面试刷题笔记](http://wdxtub.com/interview/14520594642530.html) + + - 💪就是干! + \ No newline at end of file From bcf54df0b3c5db98a0476f6dc501059782848b57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=87=E5=88=BB?= Date: Thu, 5 Apr 2018 14:25:30 +0800 Subject: [PATCH 431/473] Create README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..aa9fcd7f9 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# LeetCode +LeetCode 面试题 From 272647c72765b49eccdc21a5f1fcbd1edbbd9216 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Thu, 5 Apr 2018 14:34:01 +0800 Subject: [PATCH 432/473] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 313 ++++++++++++++- docs/SortingAlgorithm/README.md | 690 ++++++++++++++++++-------------- 2 files changed, 693 insertions(+), 310 deletions(-) diff --git a/README.md b/README.md index aa9fcd7f9..7f0f815c4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,311 @@ -# LeetCode -LeetCode 面试题 +# LeetCode 面试题 + +## [八大算法算](/docs/SortingAlgorithm/README.md) + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | + +## 面试问答 + +* [Google面试题](/docs/interview/Google/Google.md) +* [pocketgems 面试题](/docs/interview/pocketgems/pocketgems.md) +* [WePay 面试题](/docs/interview/WePay/WePay.md) + +## LeetCode算法题 + +* [](docs/某类别/001._two_sum.md) +* [](/docs/某类别/002._add_two_numbers.md) +* [](/docs/某类别/003._longest_substring_without_repeating_characters.md) +* [](/docs/某类别/004._median_of_two_sorted_arrays.md) +* [](/docs/某类别/005._longest_palindromic_substring.md) +* [](/docs/某类别/007._Reverse_Integer.md) +* [](/docs/某类别/008._string_to_integer_(atoi).md) +* [](/docs/某类别/010._regular_expression_matching.md) +* [](/docs/某类别/011._container_with_most_water.md) +* [](/docs/某类别/012._Integer_to_Roman.md) +* [](/docs/某类别/013._Roman_to_Integer.md) +* [](/docs/某类别/014._longest_common_prefix.md) +* [](/docs/某类别/015._3sum.md) +* [](/docs/某类别/016._3sum_closest.md) +* [](/docs/某类别/017._letter_combinations_of_a_phone_number.md) +* [](/docs/某类别/018._4sum.md) +* [](/docs/某类别/019._remove_nth_node_from_end_of_list.md) +* [](/docs/某类别/020._valid_parentheses.md) +* [](/docs/某类别/021._merge_two_sorted_lists.md) +* [](/docs/某类别/022._generate_parentheses.md) +* [](/docs/某类别/023._merge_k_sorted_lists.md) +* [](/docs/某类别/024._swap_nodes_in_pairs.md) +* [](/docs/某类别/026._Remove_Duplicates_from_Sorted_Array.md) +* [](/docs/某类别/027._Remove_Element.md) +* [](/docs/某类别/028._implement_strstr().md) +* [](/docs/某类别/030._Substring_with_Concatenation_of_All_Words.md) +* [](/docs/某类别/031._next_permutation.md) +* [](/docs/某类别/033._search_in_rotated_sorted_array.md) +* [](/docs/某类别/034._SearchforaRange.md) +* [](/docs/某类别/035._search_insert_position.md) +* [](/docs/某类别/038._Count_and_Say.md) +* [](/docs/某类别/039._combination_sum.md) +* [](/docs/某类别/040._combination_sum_ii.md) +* [](/docs/某类别/042._trapping_rain_water.md) +* [](/docs/某类别/043._multiply_strings.md) +* [](/docs/某类别/044._wildcard_matching.md) +* [](/docs/某类别/045._Jump_Game_II.md) +* [](/docs/某类别/046._permutations.md) +* [](/docs/某类别/047._permutations_ii.md) +* [](/docs/某类别/048._rotate_image.md) +* [](/docs/某类别/049._group_anagrams_python.md) +* [](/docs/某类别/050._pow(x,_n).md) +* [](/docs/某类别/051._n-queens.md) +* [](/docs/某类别/052._n-queens_ii.md) +* [](/docs/某类别/053._maximum_subarray.md) +* [](/docs/某类别/054._spiral_matrix.md) +* [](/docs/某类别/055._jump_game.md) +* [](/docs/某类别/056._Merge_Intervals.md) +* [](/docs/某类别/058._length_of_last_word.md) +* [](/docs/某类别/059._spiral_matrix_ii.md) +* [](/docs/某类别/060._permutation_sequence.md) +* [](/docs/某类别/061._rotate_list.md) +* [](/docs/某类别/064._minimum_path_sum.md) +* [](/docs/某类别/065.unique_paths_ii.md) +* [](/docs/某类别/066._plus_one.md) +* [](/docs/某类别/067._add_binary.md) +* [](/docs/某类别/069._sqrt(x).md) +* [](/docs/某类别/070.ClimbingStairs.md) +* [](/docs/某类别/072._edit_distance.md) +* [](/docs/某类别/073.SetMatrixZeroes.md) +* [](/docs/某类别/074._search_a_2d_matrix.md) +* [](/docs/某类别/075._sort_colors.md) +* [](/docs/某类别/076._Minimum_Window_Substring.md) +* [](/docs/某类别/077._combinations.md) +* [](/docs/某类别/078.Subsets.md) +* [](/docs/某类别/079._word_search.md) +* [](/docs/某类别/082._remove_duplicates_from_sorted_list_ii.md) +* [](/docs/某类别/083._remove_duplicates_from_sorted_list.md) +* [](/docs/某类别/086._partition_list.md) +* [](/docs/某类别/088._merge_sorted_array.md) +* [](/docs/某类别/089._gray_code.md) +* [](/docs/某类别/090._subsets_ii.md) +* [](/docs/某类别/091._decode_ways.md) +* [](/docs/某类别/092._reverse_linked_list_ii.md) +* [](/docs/某类别/093._restore_ip_addresses.md) +* [](/docs/某类别/094._binary_tree_inorder_traversal.md) +* [](/docs/某类别/096._unique_binary_search_trees.md) +* [](/docs/某类别/098._validate_binary_search_tree.md) +* [](/docs/某类别/100._same_tree.md) +* [](/docs/某类别/101._symmetric_tree.md) +* [](/docs/某类别/102._binary_tree_level_order_traversal.md) +* [](/docs/某类别/103._binary_tree_zigzag_level_order_traversal.md) +* [](/docs/某类别/104._maximum_depth_of_binary_tree.md) +* [](/docs/某类别/105._construct_binary_tree_from_preorder_and_inorder_traversal.md) +* [](/docs/某类别/106._construct_binary_tree_from_inorder_and_postorder_traversal.md) +* [](/docs/某类别/107._binary_tree_level_order_traversal_ii.md) +* [](/docs/某类别/108._convert_sorted_array_to_binary_search_tree.md) +* [](/docs/某类别/109._convert_sorted_list_to_binary_search_tree.md) +* [](/docs/某类别/110._balanced_binary_tree.md) +* [](/docs/某类别/111._minimum_depth_of_binary_tree.md) +* [](/docs/某类别/112._path_sum.md) +* [](/docs/某类别/113._path_sum_ii.md) +* [](/docs/某类别/114._flatten_binary_tree_to_linked_list.md) +* [](/docs/某类别/116._populating_next_right_pointers_in_each_node.md) +* [](/docs/某类别/118._pascal's_triangle.md) +* [](/docs/某类别/119.Pascal'sTriangleII.md) +* [](/docs/某类别/120.Triangle.md) +* [](/docs/某类别/121._Best_Time_to_Buy_and_Sell_Stock.md) +* [](/docs/某类别/125._valid_palindrome.md) +* [](/docs/某类别/126.WordLadderII.md) +* [](/docs/某类别/127._word_ladder.md) +* [](/docs/某类别/128._Longest_Consecutive_Sequence.md) +* [](/docs/某类别/129._sum_root_to_leaf_numbers.md) +* [](/docs/某类别/130._surrounded_regions.md) +* [](/docs/某类别/131._palindrome_partitioning.md) +* [](/docs/某类别/133._clone_graph.md) +* [](/docs/某类别/136._single_number.md) +* [](/docs/某类别/139._word_break.md) +* [](/docs/某类别/140._word_break_ii.md) +* [](/docs/某类别/141._linked_list_cycle.md) +* [](/docs/某类别/142_Linked_List_Cycle_II.md) +* [](/docs/某类别/143._reorder_list.md) +* [](/docs/某类别/144._binary_tree_preorder_traversal.md) +* [](/docs/某类别/145._binary_tree_postorder_traversal.md) +* [](/docs/某类别/147._insertion_sort_list.md) +* [](/docs/某类别/148._sort_list.md) +* [](/docs/某类别/150._evaluate_reverse_polish_notation.md) +* [](/docs/某类别/151._reverse_words_in_a_string.md) +* [](/docs/某类别/152._maximum_product_subarray.md) +* [](/docs/某类别/153._find_minimum_in_rotated_sorted_array.md) +* [](/docs/某类别/155._min_stack.md) +* [](/docs/某类别/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md) +* [](/docs/某类别/160._intersection_of_two_linked_lists.md) +* [](/docs/某类别/162._find_peak_element.md) +* [](/docs/某类别/165._compare_version_numbers.md) +* [](/docs/某类别/166._Fraction_to_Recurring_Decimal.md) +* [](/docs/某类别/167._two_sum_ii_-_input_array_is_sorted.md) +* [](/docs/某类别/168._excel_sheet_column_title.md) +* [](/docs/某类别/169._majority_element.md) +* [](/docs/某类别/171._excel_sheet_column_number.md) +* [](/docs/某类别/173._binary_search_tree_iterator.md) +* [](/docs/某类别/189._rotate_array.md) +* [](/docs/某类别/191._number_of_1_bits.md) +* [](/docs/某类别/198._house_robber.md) +* [](/docs/某类别/199._binary_tree_right_side_view.md) +* [](/docs/某类别/200._number_of_islands.md) +* [](/docs/某类别/203._remove_linked_list_elements.md) +* [](/docs/某类别/204._count_primes.md) +* [](/docs/某类别/205._isomorphic_strings.md) +* [](/docs/某类别/206._reverse_linked_list.md) +* [](/docs/某类别/207._course_schedule.md) +* [](/docs/某类别/208._implement_trie_(prefix_tree).md) +* [](/docs/某类别/210._course_schedule_ii.md) +* [](/docs/某类别/211.AddandSearchWord-Datastructuredesign.md) +* [](/docs/某类别/213._house_robber_ii.md) +* [](/docs/某类别/216._combination_sum_iii.md) +* [](/docs/某类别/217._contains_duplicate.md) +* [](/docs/某类别/218._The_Skyline_Problem.md) +* [](/docs/某类别/219._contains_duplicate_ii.md) +* [](/docs/某类别/221._maximal_square.md) +* [](/docs/某类别/222._count_complete_tree_nodes.md) +* [](/docs/某类别/223._rectangle_area.md) +* [](/docs/某类别/224.BasicCalculator.md) +* [](/docs/某类别/225._implement_stack_using_queues.md) +* [](/docs/某类别/226._invert_binary_tree.md) +* [](/docs/某类别/227._basic_calculator_ii.md) +* [](/docs/某类别/228._summary_ranges.md) +* [](/docs/某类别/229._majority_element_ii.md) +* [](/docs/某类别/230._kth_smallest_element_in_a_bst.md) +* [](/docs/某类别/231._Power_of_Two.md) +* [](/docs/某类别/232._implement_queue_using_stacks.md) +* [](/docs/某类别/234._palindrome_linked_list.md) +* [](/docs/某类别/235._lowest_common_ancestor_of_a_binary_search_tree.md) +* [](/docs/某类别/236._lowest_common_ancestor_of_a_binary_tree.md) +* [](/docs/某类别/237._delete_node_in_a_linked_list.md) +* [](/docs/某类别/238._product_of_array_except_self.md) +* [](/docs/某类别/240._search_a_2d_matrix_ii.md) +* [](/docs/某类别/242._valid_anagram.md) +* [](/docs/某类别/252.MeetingRooms.md) +* [](/docs/某类别/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md) +* [](/docs/某类别/256.PaintHouse.md) +* [](/docs/某类别/257._binary_tree_paths.md) +* [](/docs/某类别/258_Add_Digits.md) +* [](/docs/某类别/261.GraphValidTree.md) +* [](/docs/某类别/263._ugly_number.md) +* [](/docs/某类别/264._ugly_number_ii.md) +* [](/docs/某类别/265.PaintHouseII.md) +* [](/docs/某类别/266.PalindromePermutation.md) +* [](/docs/某类别/267.PalindromePermutationII.md) +* [](/docs/某类别/268._missing_number.md) +* [](/docs/某类别/270.ClosestBinarySearchTreeValue.md) +* [](/docs/某类别/276.PaintFence.md) +* [](/docs/某类别/277.FindtheCelebrity.md) +* [](/docs/某类别/278._First_Bad_Version.md) +* [](/docs/某类别/279._perfect_squares.md) +* [](/docs/某类别/280._Wiggle_Sort.md) +* [](/docs/某类别/283._move_zeroes.md) +* [](/docs/某类别/285._inorder_successor_in_bst.md) +* [](/docs/某类别/286.WallsandGates.md) +* [](/docs/某类别/289._game_of_life.md) +* [](/docs/某类别/290._word_pattern.md) +* [](/docs/某类别/292._nim_game.md) +* [](/docs/某类别/296.BestMeetingPoint.md) +* [](/docs/某类别/298.BinaryTreeLongestConsecutiveSequence.md) +* [](/docs/某类别/299._bulls_and_cows.md) +* [](/docs/某类别/300._longest_increasing_subsequence.md) +* [](/docs/某类别/303._range_sum_query_-_immutable.md) +* [](/docs/某类别/316._Remove_Duplicate_Letters.md) +* [](/docs/某类别/319._Bulb_Switcher.md) +* [](/docs/某类别/322.CoinChange.md) +* [](/docs/某类别/323.NumberofConnectedComponentsinanUndirectedGraph.md) +* [](/docs/某类别/324._Wiggle_Sort_II.md) +* [](/docs/某类别/326._power_of_three.md) +* [](/docs/某类别/328._odd_even_linked_list.md) +* [](/docs/某类别/334._increasing_triplet_subsequence.md) +* [](/docs/某类别/337._house_robber_iii.md) +* [](/docs/某类别/338.CountingBits.md) +* [](/docs/某类别/339.NestedListWeightSum.md) +* [](/docs/某类别/341._Flatten_Nested_List_Iterator.md) +* [](/docs/某类别/342._Power_of_Four.md) +* [](/docs/某类别/344._reverse_string.md) +* [](/docs/某类别/345._Reverse_Vowels_of_a_String.md) +* [](/docs/某类别/349._intersection_of_two_arrays.md) +* [](/docs/某类别/350._intersection_of_two_arrays_ii.md) +* [](/docs/某类别/353.DesignSnakeGame.md) +* [](/docs/某类别/364.NestedListWeightSumII.md) +* [](/docs/某类别/366.FindLeavesofBinaryTree.md) +* [](/docs/某类别/367._valid_perfect_square.md) +* [](/docs/某类别/369.PlusOneLinkedList.md) +* [](/docs/某类别/371._sum_of_two_integers.md) +* [](/docs/某类别/374._Guess_Number_Higher_or_Lower.md) +* [](/docs/某类别/377._combination_sum_iv.md) +* [](/docs/某类别/378._kth_smallest_element_in_a_sorted_matrix.md) +* [](/docs/某类别/380.InsertDeleteGetRandomO(1).md) +* [](/docs/某类别/381.InsertDeleteGetRandomO(1)-Duplicatesallowed.md) +* [](/docs/某类别/382._linked_list_random_node.md) +* [](/docs/某类别/383._ransom_note.md) +* [](/docs/某类别/384.ShuffleanArray.md) +* [](/docs/某类别/387._first_unique_character_in_a_string.md) +* [](/docs/某类别/388._Longest_Absolute_File_Path.md) +* [](/docs/某类别/389._find_the_difference.md) +* [](/docs/某类别/392._is_subsequence.md) +* [](/docs/某类别/394._decode_string.md) +* [](/docs/某类别/400.NthDigit.md) +* [](/docs/某类别/401._binary_watch.md) +* [](/docs/某类别/404._sum_of_left_leaves.md) +* [](/docs/某类别/405.ConvertaNumbertoHexadecimal.md) +* [](/docs/某类别/406._Queue_Reconstruction_by_Height.md) +* [](/docs/某类别/412._fizz_buzz.md) +* [](/docs/某类别/413.ArithmeticSlices.md) +* [](/docs/某类别/414._third_maximum_number.md) +* [](/docs/某类别/415._add_strings.md) +* [](/docs/某类别/416.PartitionEqualSubsetSum.md) +* [](/docs/某类别/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md) +* [](/docs/某类别/422.ValidWordSquare.md) +* [](/docs/某类别/434._number_of_segments_in_a_string.md) +* [](/docs/某类别/437._path_sum_iii.md) +* [](/docs/某类别/438._Find_All_Anagrams_in_a_String.md) +* [](/docs/某类别/439.TernaryExpressionParser.md) +* [](/docs/某类别/441._arranging_coins.md) +* [](/docs/某类别/448._Find_All_Numbers_Disappeared_in_an_Array.md) +* [](/docs/某类别/450.DeleteNodeinaBST.md) +* [](/docs/某类别/453._Minimum_Moves_to_Equal_Array_Elements.md) +* [](/docs/某类别/459._Repeated_Substring_Pattern.md) +* [](/docs/某类别/461._HammingDistance.md) +* [](/docs/某类别/463._Island_Perimeter.md) +* [](/docs/某类别/467._Unique_Substrings_in_Wraparound_String.md) +* [](/docs/某类别/469.ConvexPolygon.md) +* [](/docs/某类别/476._Number_Complement.md) +* [](/docs/某类别/477._Total_Hamming_Distance.md) +* [](/docs/某类别/485._Max_Consecutive_Ones.md) +* [](/docs/某类别/587._Erect_the_Fence.md) +* [](/docs/某类别/599._Minimum_Index_Sum_of_Two_Lists.md) +* [](/docs/某类别/647._Palindromic_Substrings.md) +* [](/docs/某类别/657._Judge_Route_Circle.md) +* [](/docs/某类别/665._Non-decreasing_Array.md) +* [](/docs/某类别/672._Bulb_Switcher_II.md) +* [](/docs/某类别/681._Next_Closest_Time.md) +* [](/docs/某类别/682._Baseball_Game.md) +* [](/docs/某类别/687._Longest_Univalue_Path.md) +* [](/docs/某类别/740._delete_and_earn.md) +* [](/docs/某类别/760._Find_Anagram_Mappings.md) + +## 推荐的一些LeetCode网站 + +1. [KrisYu的GItuhub](https://github.com/KrisYu/LeetCode-CLRS-Python) +2. [kamyu104的Github](https://github.com/kamyu104/LeetCode) +3. [数据结构与算法/leetcode/lintcode题解](https://algorithm.yuanbin.me/zh-hans/) +4. [Leetcode 讨论区](https://discuss.leetcode.com/) +5. [visualgo算法可视化网站](https://visualgo.net/en) +6. [Data Structure Visualization](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) +7. [我的算法学习之路 - Lucida](http://zh.lucida.me/blog/on-learning-algorithms/) +8. [HiredInTech](https://www.hiredintech.com/) System Design 的总结特别适合入门 +9. [mitcc的Github](https://github.com/mitcc/AlgoSolutions) +10. [小土刀的面试刷题笔记](http://wdxtub.com/interview/14520594642530.html) + + - 💪就是干! diff --git a/docs/SortingAlgorithm/README.md b/docs/SortingAlgorithm/README.md index 2d6c32fc4..83b327202 100644 --- a/docs/SortingAlgorithm/README.md +++ b/docs/SortingAlgorithm/README.md @@ -1,312 +1,386 @@ -# LeetCode 面试题 +## 前言 +八大排序,三大查找是《数据结构》当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法。 +常见的八大排序算法,他们之间关系如下: -## [八大算法算](/docs/SortingAlgorithm/README.md) +![](/images/SortingAlgorithm/八大排序算法总结.png) + +他们的性能比较: ![](/images/SortingAlgorithm/八大排序算法性能.png) -| 名称 | 动图 | 代码 | -| --- | --- | --- | -| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/BubbleSort.py) | -| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | -| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | -| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | -| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | -| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | -| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | - -## 面试问答 - -* [Google面试题](/docs/interview/Google/Google.md) -* [pocketgems 面试题](/docs/interview/pocketgems/pocketgems.md) -* [WePay 面试题](/docs/interview/WePay/WePay.md) - -## LeetCode算法题 - -* [](docs/某类别/001._two_sum.md) -* [](/docs/某类别/002._add_two_numbers.md) -* [](/docs/某类别/003._longest_substring_without_repeating_characters.md) -* [](/docs/某类别/004._median_of_two_sorted_arrays.md) -* [](/docs/某类别/005._longest_palindromic_substring.md) -* [](/docs/某类别/007._Reverse_Integer.md) -* [](/docs/某类别/008._string_to_integer_(atoi).md) -* [](/docs/某类别/010._regular_expression_matching.md) -* [](/docs/某类别/011._container_with_most_water.md) -* [](/docs/某类别/012._Integer_to_Roman.md) -* [](/docs/某类别/013._Roman_to_Integer.md) -* [](/docs/某类别/014._longest_common_prefix.md) -* [](/docs/某类别/015._3sum.md) -* [](/docs/某类别/016._3sum_closest.md) -* [](/docs/某类别/017._letter_combinations_of_a_phone_number.md) -* [](/docs/某类别/018._4sum.md) -* [](/docs/某类别/019._remove_nth_node_from_end_of_list.md) -* [](/docs/某类别/020._valid_parentheses.md) -* [](/docs/某类别/021._merge_two_sorted_lists.md) -* [](/docs/某类别/022._generate_parentheses.md) -* [](/docs/某类别/023._merge_k_sorted_lists.md) -* [](/docs/某类别/024._swap_nodes_in_pairs.md) -* [](/docs/某类别/026._Remove_Duplicates_from_Sorted_Array.md) -* [](/docs/某类别/027._Remove_Element.md) -* [](/docs/某类别/028._implement_strstr().md) -* [](/docs/某类别/030._Substring_with_Concatenation_of_All_Words.md) -* [](/docs/某类别/031._next_permutation.md) -* [](/docs/某类别/033._search_in_rotated_sorted_array.md) -* [](/docs/某类别/034._SearchforaRange.md) -* [](/docs/某类别/035._search_insert_position.md) -* [](/docs/某类别/038._Count_and_Say.md) -* [](/docs/某类别/039._combination_sum.md) -* [](/docs/某类别/040._combination_sum_ii.md) -* [](/docs/某类别/042._trapping_rain_water.md) -* [](/docs/某类别/043._multiply_strings.md) -* [](/docs/某类别/044._wildcard_matching.md) -* [](/docs/某类别/045._Jump_Game_II.md) -* [](/docs/某类别/046._permutations.md) -* [](/docs/某类别/047._permutations_ii.md) -* [](/docs/某类别/048._rotate_image.md) -* [](/docs/某类别/049._group_anagrams_python.md) -* [](/docs/某类别/050._pow(x,_n).md) -* [](/docs/某类别/051._n-queens.md) -* [](/docs/某类别/052._n-queens_ii.md) -* [](/docs/某类别/053._maximum_subarray.md) -* [](/docs/某类别/054._spiral_matrix.md) -* [](/docs/某类别/055._jump_game.md) -* [](/docs/某类别/056._Merge_Intervals.md) -* [](/docs/某类别/058._length_of_last_word.md) -* [](/docs/某类别/059._spiral_matrix_ii.md) -* [](/docs/某类别/060._permutation_sequence.md) -* [](/docs/某类别/061._rotate_list.md) -* [](/docs/某类别/064._minimum_path_sum.md) -* [](/docs/某类别/065.unique_paths_ii.md) -* [](/docs/某类别/066._plus_one.md) -* [](/docs/某类别/067._add_binary.md) -* [](/docs/某类别/069._sqrt(x).md) -* [](/docs/某类别/070.ClimbingStairs.md) -* [](/docs/某类别/072._edit_distance.md) -* [](/docs/某类别/073.SetMatrixZeroes.md) -* [](/docs/某类别/074._search_a_2d_matrix.md) -* [](/docs/某类别/075._sort_colors.md) -* [](/docs/某类别/076._Minimum_Window_Substring.md) -* [](/docs/某类别/077._combinations.md) -* [](/docs/某类别/078.Subsets.md) -* [](/docs/某类别/079._word_search.md) -* [](/docs/某类别/082._remove_duplicates_from_sorted_list_ii.md) -* [](/docs/某类别/083._remove_duplicates_from_sorted_list.md) -* [](/docs/某类别/086._partition_list.md) -* [](/docs/某类别/088._merge_sorted_array.md) -* [](/docs/某类别/089._gray_code.md) -* [](/docs/某类别/090._subsets_ii.md) -* [](/docs/某类别/091._decode_ways.md) -* [](/docs/某类别/092._reverse_linked_list_ii.md) -* [](/docs/某类别/093._restore_ip_addresses.md) -* [](/docs/某类别/094._binary_tree_inorder_traversal.md) -* [](/docs/某类别/096._unique_binary_search_trees.md) -* [](/docs/某类别/098._validate_binary_search_tree.md) -* [](/docs/某类别/100._same_tree.md) -* [](/docs/某类别/101._symmetric_tree.md) -* [](/docs/某类别/102._binary_tree_level_order_traversal.md) -* [](/docs/某类别/103._binary_tree_zigzag_level_order_traversal.md) -* [](/docs/某类别/104._maximum_depth_of_binary_tree.md) -* [](/docs/某类别/105._construct_binary_tree_from_preorder_and_inorder_traversal.md) -* [](/docs/某类别/106._construct_binary_tree_from_inorder_and_postorder_traversal.md) -* [](/docs/某类别/107._binary_tree_level_order_traversal_ii.md) -* [](/docs/某类别/108._convert_sorted_array_to_binary_search_tree.md) -* [](/docs/某类别/109._convert_sorted_list_to_binary_search_tree.md) -* [](/docs/某类别/110._balanced_binary_tree.md) -* [](/docs/某类别/111._minimum_depth_of_binary_tree.md) -* [](/docs/某类别/112._path_sum.md) -* [](/docs/某类别/113._path_sum_ii.md) -* [](/docs/某类别/114._flatten_binary_tree_to_linked_list.md) -* [](/docs/某类别/116._populating_next_right_pointers_in_each_node.md) -* [](/docs/某类别/118._pascal's_triangle.md) -* [](/docs/某类别/119.Pascal'sTriangleII.md) -* [](/docs/某类别/120.Triangle.md) -* [](/docs/某类别/121._Best_Time_to_Buy_and_Sell_Stock.md) -* [](/docs/某类别/125._valid_palindrome.md) -* [](/docs/某类别/126.WordLadderII.md) -* [](/docs/某类别/127._word_ladder.md) -* [](/docs/某类别/128._Longest_Consecutive_Sequence.md) -* [](/docs/某类别/129._sum_root_to_leaf_numbers.md) -* [](/docs/某类别/130._surrounded_regions.md) -* [](/docs/某类别/131._palindrome_partitioning.md) -* [](/docs/某类别/133._clone_graph.md) -* [](/docs/某类别/136._single_number.md) -* [](/docs/某类别/139._word_break.md) -* [](/docs/某类别/140._word_break_ii.md) -* [](/docs/某类别/141._linked_list_cycle.md) -* [](/docs/某类别/142_Linked_List_Cycle_II.md) -* [](/docs/某类别/143._reorder_list.md) -* [](/docs/某类别/144._binary_tree_preorder_traversal.md) -* [](/docs/某类别/145._binary_tree_postorder_traversal.md) -* [](/docs/某类别/147._insertion_sort_list.md) -* [](/docs/某类别/148._sort_list.md) -* [](/docs/某类别/150._evaluate_reverse_polish_notation.md) -* [](/docs/某类别/151._reverse_words_in_a_string.md) -* [](/docs/某类别/152._maximum_product_subarray.md) -* [](/docs/某类别/153._find_minimum_in_rotated_sorted_array.md) -* [](/docs/某类别/155._min_stack.md) -* [](/docs/某类别/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md) -* [](/docs/某类别/160._intersection_of_two_linked_lists.md) -* [](/docs/某类别/162._find_peak_element.md) -* [](/docs/某类别/165._compare_version_numbers.md) -* [](/docs/某类别/166._Fraction_to_Recurring_Decimal.md) -* [](/docs/某类别/167._two_sum_ii_-_input_array_is_sorted.md) -* [](/docs/某类别/168._excel_sheet_column_title.md) -* [](/docs/某类别/169._majority_element.md) -* [](/docs/某类别/171._excel_sheet_column_number.md) -* [](/docs/某类别/173._binary_search_tree_iterator.md) -* [](/docs/某类别/189._rotate_array.md) -* [](/docs/某类别/191._number_of_1_bits.md) -* [](/docs/某类别/198._house_robber.md) -* [](/docs/某类别/199._binary_tree_right_side_view.md) -* [](/docs/某类别/200._number_of_islands.md) -* [](/docs/某类别/203._remove_linked_list_elements.md) -* [](/docs/某类别/204._count_primes.md) -* [](/docs/某类别/205._isomorphic_strings.md) -* [](/docs/某类别/206._reverse_linked_list.md) -* [](/docs/某类别/207._course_schedule.md) -* [](/docs/某类别/208._implement_trie_(prefix_tree).md) -* [](/docs/某类别/210._course_schedule_ii.md) -* [](/docs/某类别/211.AddandSearchWord-Datastructuredesign.md) -* [](/docs/某类别/213._house_robber_ii.md) -* [](/docs/某类别/216._combination_sum_iii.md) -* [](/docs/某类别/217._contains_duplicate.md) -* [](/docs/某类别/218._The_Skyline_Problem.md) -* [](/docs/某类别/219._contains_duplicate_ii.md) -* [](/docs/某类别/221._maximal_square.md) -* [](/docs/某类别/222._count_complete_tree_nodes.md) -* [](/docs/某类别/223._rectangle_area.md) -* [](/docs/某类别/224.BasicCalculator.md) -* [](/docs/某类别/225._implement_stack_using_queues.md) -* [](/docs/某类别/226._invert_binary_tree.md) -* [](/docs/某类别/227._basic_calculator_ii.md) -* [](/docs/某类别/228._summary_ranges.md) -* [](/docs/某类别/229._majority_element_ii.md) -* [](/docs/某类别/230._kth_smallest_element_in_a_bst.md) -* [](/docs/某类别/231._Power_of_Two.md) -* [](/docs/某类别/232._implement_queue_using_stacks.md) -* [](/docs/某类别/234._palindrome_linked_list.md) -* [](/docs/某类别/235._lowest_common_ancestor_of_a_binary_search_tree.md) -* [](/docs/某类别/236._lowest_common_ancestor_of_a_binary_tree.md) -* [](/docs/某类别/237._delete_node_in_a_linked_list.md) -* [](/docs/某类别/238._product_of_array_except_self.md) -* [](/docs/某类别/240._search_a_2d_matrix_ii.md) -* [](/docs/某类别/242._valid_anagram.md) -* [](/docs/某类别/252.MeetingRooms.md) -* [](/docs/某类别/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md) -* [](/docs/某类别/256.PaintHouse.md) -* [](/docs/某类别/257._binary_tree_paths.md) -* [](/docs/某类别/258_Add_Digits.md) -* [](/docs/某类别/261.GraphValidTree.md) -* [](/docs/某类别/263._ugly_number.md) -* [](/docs/某类别/264._ugly_number_ii.md) -* [](/docs/某类别/265.PaintHouseII.md) -* [](/docs/某类别/266.PalindromePermutation.md) -* [](/docs/某类别/267.PalindromePermutationII.md) -* [](/docs/某类别/268._missing_number.md) -* [](/docs/某类别/270.ClosestBinarySearchTreeValue.md) -* [](/docs/某类别/276.PaintFence.md) -* [](/docs/某类别/277.FindtheCelebrity.md) -* [](/docs/某类别/278._First_Bad_Version.md) -* [](/docs/某类别/279._perfect_squares.md) -* [](/docs/某类别/280._Wiggle_Sort.md) -* [](/docs/某类别/283._move_zeroes.md) -* [](/docs/某类别/285._inorder_successor_in_bst.md) -* [](/docs/某类别/286.WallsandGates.md) -* [](/docs/某类别/289._game_of_life.md) -* [](/docs/某类别/290._word_pattern.md) -* [](/docs/某类别/292._nim_game.md) -* [](/docs/某类别/296.BestMeetingPoint.md) -* [](/docs/某类别/298.BinaryTreeLongestConsecutiveSequence.md) -* [](/docs/某类别/299._bulls_and_cows.md) -* [](/docs/某类别/300._longest_increasing_subsequence.md) -* [](/docs/某类别/303._range_sum_query_-_immutable.md) -* [](/docs/某类别/316._Remove_Duplicate_Letters.md) -* [](/docs/某类别/319._Bulb_Switcher.md) -* [](/docs/某类别/322.CoinChange.md) -* [](/docs/某类别/323.NumberofConnectedComponentsinanUndirectedGraph.md) -* [](/docs/某类别/324._Wiggle_Sort_II.md) -* [](/docs/某类别/326._power_of_three.md) -* [](/docs/某类别/328._odd_even_linked_list.md) -* [](/docs/某类别/334._increasing_triplet_subsequence.md) -* [](/docs/某类别/337._house_robber_iii.md) -* [](/docs/某类别/338.CountingBits.md) -* [](/docs/某类别/339.NestedListWeightSum.md) -* [](/docs/某类别/341._Flatten_Nested_List_Iterator.md) -* [](/docs/某类别/342._Power_of_Four.md) -* [](/docs/某类别/344._reverse_string.md) -* [](/docs/某类别/345._Reverse_Vowels_of_a_String.md) -* [](/docs/某类别/349._intersection_of_two_arrays.md) -* [](/docs/某类别/350._intersection_of_two_arrays_ii.md) -* [](/docs/某类别/353.DesignSnakeGame.md) -* [](/docs/某类别/364.NestedListWeightSumII.md) -* [](/docs/某类别/366.FindLeavesofBinaryTree.md) -* [](/docs/某类别/367._valid_perfect_square.md) -* [](/docs/某类别/369.PlusOneLinkedList.md) -* [](/docs/某类别/371._sum_of_two_integers.md) -* [](/docs/某类别/374._Guess_Number_Higher_or_Lower.md) -* [](/docs/某类别/377._combination_sum_iv.md) -* [](/docs/某类别/378._kth_smallest_element_in_a_sorted_matrix.md) -* [](/docs/某类别/380.InsertDeleteGetRandomO(1).md) -* [](/docs/某类别/381.InsertDeleteGetRandomO(1)-Duplicatesallowed.md) -* [](/docs/某类别/382._linked_list_random_node.md) -* [](/docs/某类别/383._ransom_note.md) -* [](/docs/某类别/384.ShuffleanArray.md) -* [](/docs/某类别/387._first_unique_character_in_a_string.md) -* [](/docs/某类别/388._Longest_Absolute_File_Path.md) -* [](/docs/某类别/389._find_the_difference.md) -* [](/docs/某类别/392._is_subsequence.md) -* [](/docs/某类别/394._decode_string.md) -* [](/docs/某类别/400.NthDigit.md) -* [](/docs/某类别/401._binary_watch.md) -* [](/docs/某类别/404._sum_of_left_leaves.md) -* [](/docs/某类别/405.ConvertaNumbertoHexadecimal.md) -* [](/docs/某类别/406._Queue_Reconstruction_by_Height.md) -* [](/docs/某类别/412._fizz_buzz.md) -* [](/docs/某类别/413.ArithmeticSlices.md) -* [](/docs/某类别/414._third_maximum_number.md) -* [](/docs/某类别/415._add_strings.md) -* [](/docs/某类别/416.PartitionEqualSubsetSum.md) -* [](/docs/某类别/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md) -* [](/docs/某类别/422.ValidWordSquare.md) -* [](/docs/某类别/434._number_of_segments_in_a_string.md) -* [](/docs/某类别/437._path_sum_iii.md) -* [](/docs/某类别/438._Find_All_Anagrams_in_a_String.md) -* [](/docs/某类别/439.TernaryExpressionParser.md) -* [](/docs/某类别/441._arranging_coins.md) -* [](/docs/某类别/448._Find_All_Numbers_Disappeared_in_an_Array.md) -* [](/docs/某类别/450.DeleteNodeinaBST.md) -* [](/docs/某类别/453._Minimum_Moves_to_Equal_Array_Elements.md) -* [](/docs/某类别/459._Repeated_Substring_Pattern.md) -* [](/docs/某类别/461._HammingDistance.md) -* [](/docs/某类别/463._Island_Perimeter.md) -* [](/docs/某类别/467._Unique_Substrings_in_Wraparound_String.md) -* [](/docs/某类别/469.ConvexPolygon.md) -* [](/docs/某类别/476._Number_Complement.md) -* [](/docs/某类别/477._Total_Hamming_Distance.md) -* [](/docs/某类别/485._Max_Consecutive_Ones.md) -* [](/docs/某类别/587._Erect_the_Fence.md) -* [](/docs/某类别/599._Minimum_Index_Sum_of_Two_Lists.md) -* [](/docs/某类别/647._Palindromic_Substrings.md) -* [](/docs/某类别/657._Judge_Route_Circle.md) -* [](/docs/某类别/665._Non-decreasing_Array.md) -* [](/docs/某类别/672._Bulb_Switcher_II.md) -* [](/docs/某类别/681._Next_Closest_Time.md) -* [](/docs/某类别/682._Baseball_Game.md) -* [](/docs/某类别/687._Longest_Univalue_Path.md) -* [](/docs/某类别/740._delete_and_earn.md) -* [](/docs/某类别/760._Find_Anagram_Mappings.md) - -## 推荐的一些LeetCode网站 - -1. [KrisYu的GItuhub](https://github.com/KrisYu/LeetCode-CLRS-Python) -2. [kamyu104的Github](https://github.com/kamyu104/LeetCode) -3. [数据结构与算法/leetcode/lintcode题解](https://algorithm.yuanbin.me/zh-hans/) -4. [Leetcode 讨论区](https://discuss.leetcode.com/) -5. [visualgo算法可视化网站](https://visualgo.net/en) -6. [Data Structure Visualization](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) -7. [我的算法学习之路 - Lucida](http://zh.lucida.me/blog/on-learning-algorithms/) -8. [HiredInTech](https://www.hiredintech.com/) System Design 的总结特别适合入门 -9. [mitcc的Github](https://github.com/mitcc/AlgoSolutions) -10. [小土刀的面试刷题笔记](http://wdxtub.com/interview/14520594642530.html) - - - 💪就是干! - \ No newline at end of file +### 直接插入排序 (Insertion sort) + +![](/images/SortingAlgorithm/直接插入排序.gif) + +直接插入排序的核心思想就是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。 +因此,从上面的描述中我们可以发现,直接插入排序可以用两个循环完成: + +1. 第一层循环:遍历待比较的所有数组元素 +2. 第二层循环:将本轮选择的元素(selected)与已经排好序的元素(ordered)相比较。 + - 如果```selected > ordered```,那么将二者交换 + +```python +#直接插入排序 +def insert_sort(L): + #遍历数组中的所有元素,其中0号索引元素默认已排序,因此从1开始 + for x in range(1,len(L)): + #将该元素与已排序好的前序数组依次比较,如果该元素小,则交换 + #range(x-1,-1,-1):从x-1倒序循环到0 + for i in range(x-1,-1,-1): + #判断:如果符合条件则交换 + if L[i] > L[i+1]: + L[i], L[i+1] = L[i+1], L[i] +``` +### 希尔排序 (Shell sort) + +![](/images/SortingAlgorithm/希尔排序.png) + +希尔排序的算法思想:将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序。 +同样的:从上面的描述中我们可以发现:希尔排序的总体实现应该由三个循环完成: + +1. 第一层循环:将gap依次折半,对序列进行分组,直到gap=1 +2. 第二、三层循环:也即直接插入排序所需要的两次循环。具体描述见上。 + +```python +#希尔排序 +def insert_shell(L): + #初始化gap值,此处利用序列长度的一半为其赋值 + gap = int(len(L)/2) + #第一层循环:依次改变gap值对列表进行分组 + while (gap >= 1): + #下面:利用直接插入排序的思想对分组数据进行排序 + #range(gap,len(L)):从gap开始 + for x in range(gap,len(L)): + #range(x-gap,-1,-gap):从x-gap开始与选定元素开始倒序比较,每个比较元素之间间隔gap + for i in range(x-gap,-1,-gap): + #如果该组当中两个元素满足交换条件,则进行交换 + if L[i] > L[i+gap]: + L[i], L[i+gap] = L[i+gap], L[i] + #while循环条件折半 + gap = int((gap/2)) +``` + +### 简单选择排序 (Selection sort) + +![](/images/SortingAlgorithm/简单选择排序.gif) + +简单选择排序的基本思想:比较+交换。 + +1. 从待排序序列中,找到关键字最小的元素; +2. 如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换; +3. 从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。 +因此我们可以发现,简单选择排序也是通过两层循环实现。 + - 第一层循环:依次遍历序列当中的每一个元素 + - 第二层循环:将遍历得到的当前元素依次与余下的元素进行比较,符合最小元素的条件,则交换。 + +```python +# 简单选择排序 +def select_sort(L): +#依次遍历序列中的每一个元素 + for x in range(0,len(L)): +#将当前位置的元素定义此轮循环当中的最小值 + minimum = L[x] +#将该元素与剩下的元素依次比较寻找最小元素 + for i in range(x+1,len(L)): + if L[i] < minimum: + L[i], minimum = minimum, L[i] +#将比较后得到的真正的最小值赋值给当前位置 + L[x] = minimum +``` + +### 堆排序 (Heap sort) + +#### 堆的概念 + +堆:本质是一种数组对象。特别重要的一点性质:任意的叶子节点小于(或大于)它所有的父节点。对此,又分为大顶堆和小顶堆,大顶堆要求节点的元素都要大于其孩子,小顶堆要求节点元素都小于其左右孩子,两者对左右孩子的大小关系不做任何要求。 +利用堆排序,就是基于大顶堆或者小顶堆的一种排序方法。下面,我们通过大顶堆来实现。 + +基本思想: +堆排序可以按照以下步骤来完成: + +1. 首先将序列构建称为大顶堆; + +(这样满足了大顶堆那条性质:位于根节点的元素一定是当前序列的最大值) + +![](/images/SortingAlgorithm/构建大顶堆.png) + +2. 取出当前大顶堆的根节点,将其与序列末尾元素进行交换; + +(此时:序列末尾的元素为已排序的最大值;由于交换了元素,当前位于根节点的堆并不一定满足大顶堆的性质) + +3. 对交换后的n-1个序列元素进行调整,使其满足大顶堆的性质; + +![](/images/SortingAlgorithm/调整大顶堆.png) + +4. 重复2.3步骤,直至堆中只有1个元素为止 + +```python +#-------------------------堆排序-------------------------------- +#**********获取左右叶子节点********** +def LEFT(i): + return 2*i + 1 +def RIGHT(i): + return 2*i + 2 +#********** 调整大顶堆 ********** +#L:待调整序列 length: 序列长度 i:需要调整的结点 +def adjust_max_heap(L, length, i): +#定义一个int值保存当前序列最大值的下标 + largest = i +#获得序列左右叶子节点的下标 + left, right = LEFT(i), RIGHT(i) +#当左叶子节点的下标小于序列长度 并且 左叶子节点的值大于父节点时,将左叶子节点的下标赋值给largest + if (left < length) and (L[left] > L[i]): + largest = left +#当右叶子节点的下标小于序列长度 并且 右叶子节点的值大于父节点时,将右叶子节点的下标值赋值给largest + if (right < length) and (L[right] > L[largest]): + largest = right +#如果largest不等于i 说明当前的父节点不是最大值,需要交换值 + if (largest != i): + L[i], L[largest] = L[largest], L[i] + # 执行递归操作:两个任务:1 寻找最大值的下标;2.最大值与父节点交换 + adjust_max_heap(L, length, largest) +#********** 建立大顶堆 ********** +def build_max_heap(L): + length = len(L) + for x in range(int((length-1)/2), -1, -1): + adjust_max_heap(L, length, x) +#********** 堆排序 ********** +def heap_sort(L): +#先建立大顶堆,保证最大值位于根节点;并且父节点的值大于叶子结点 + build_max_heap(L) +#i:当前堆中序列的长度.初始化为序列的长度 + i = len(L) +#执行循环:1. 每次取出堆顶元素置于序列的最后(len-1,len-2,len-3...) +# 2. 调整堆,使其继续满足大顶堆的性质,注意实时修改堆中序列的长度 + while (i > 0): + L[i-1], L[0] = L[0], L[i-1] +#堆中序列长度减1 + i -= 1 +#调整大顶堆 + adjust_max_heap(L, i, 0) +``` +### 冒泡排序 (Bubble sort) + +![](/images/SortingAlgorithm/冒泡排序.gif) + +冒泡排序思路比较简单: + +1. 将序列当中的左右元素,依次比较,保证右边的元素始终大于左边的元素; +( 第一轮结束后,序列最后一个元素一定是当前序列的最大值;) +2. 对序列当中剩下的n-1个元素再次执行步骤1。 +3. 对于长度为n的序列,一共需要执行n-1轮比较 +(利用while循环可以减少执行次数) + +```python +#冒泡排序 +def bubble_sort(L): + length = len(L) +#序列长度为length,需要执行length-1轮交换 + for x in range(1, length): +#对于每一轮交换,都将序列当中的左右元素进行比较 +#每轮交换当中,由于序列最后的元素一定是最大的,因此每轮循环到序列未排序的位置即可 + for i in range(0, length-x): + if L[i] > L[i+1]: + L[i], L[i+1] = L[i+1], L[i] +``` + +### 快速排序 (Quick sort) + +![](/images/SortingAlgorithm/快速排序.gif) + +快速排序的基本思想:挖坑填数+分治法 + +1. 从序列当中选择一个基准数(pivot) +在这里我们选择序列当中第一个数作为基准数 +2. 将序列当中的所有数依次遍历,比基准数大的位于其右侧,比基准数小的位于其左侧 +3. 重复步骤1.2,直到所有子集当中只有一个元素为止。 + +用伪代码描述如下: +- i =L; j = R; 将基准数挖出形成第一个坑a[i]。 +- j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。 +- i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。 +- 再重复执行2,3二步,直到i==j,将基准数填入a[i]中 + +```python +#快速排序 +#L:待排序的序列;start排序的开始index,end序列末尾的index +#对于长度为length的序列:start = 0;end = length-1 +def quick_sort(L, start, end): + if start < end: + i, j, pivot = start, end, L[start] + while i < j: +#从右开始向左寻找第一个小于pivot的值 + while (i < j) and (L[j] >= pivot): + j -= 1 +#将小于pivot的值移到左边 + if (i < j): + L[i] = L[j] + i += 1 +#从左开始向右寻找第一个大于pivot的值 + while (i < j) and (L[i] <= pivot): + i += 1 +#将大于pivot的值移到右边 + if (i < j): + L[j] = L[i] + j -= 1 +#循环结束后,说明 i=j,此时左边的值全都小于pivot,右边的值全都大于pivot +#pivot的位置移动正确,那么此时只需对左右两侧的序列调用此函数进一步排序即可 +#递归调用函数:依次对左侧序列:从0 ~ i-1//右侧序列:从i+1 ~ end + L[i] = pivot +#左侧序列继续排序 + quick_sort(L, start, i-1) +#右侧序列继续排序 + quick_sort(L, i+1, end) +``` + +### 归并排序 (Merge sort) + +![](/images/SortingAlgorithm/归并排序.gif) + +1. 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个典型的应用。它的基本操作是:将已有的子序列合并,达到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 +2. 归并排序其实要做两件事: + - 分解----将序列每次折半拆分 + - 合并----将划分后的序列段两两排序合并 +因此,归并排序实际上就是两个操作,拆分+合并 +3. 如何合并? + - L[first...mid]为第一段,L[mid+1...last]为第二段,并且两端已经有序,现在我们要将两端合成达到L[first...last]并且也有序。 + - 首先依次从第一段与第二段中取出元素比较,将较小的元素赋值给temp[] + - 重复执行上一步,当某一段赋值结束,则将另一段剩下的元素赋值给temp[] + - 此时将temp[]中的元素复制给L[],则得到的L[first...last]有序 +4. 如何分解? + - 在这里,我们采用递归的方法,首先将待排序列分成A,B两组; + - 然后重复对A、B序列分组; + - 直到分组后组内只有一个元素,此时我们认为组内所有元素有序,则分组结束。 + +```python +# 归并排序 +#这是合并的函数 +# 将序列L[first...mid]与序列L[mid+1...last]进行合并 +def mergearray(L, first, mid, last, temp): +#对i,j,k分别进行赋值 + i, j, k = first, mid+1, 0 +#当左右两边都有数时进行比较,取较小的数 + while (i <= mid) and (j <= last): + if L[i] <= L[j]: + temp[k] = L[i] + i += 1 + k += 1 + else: + temp[k] = L[j] + j += 1 + k += 1 +#如果左边序列还有数 + while (i <= mid): + temp[k] = L[i] + i += 1 + k += 1 +#如果右边序列还有数 + while (j <= last): + temp[k] = L[j] + j += 1 + k += 1 +#将temp当中该段有序元素赋值给L待排序列使之部分有序 + for x in range(0, k): + L[first+x] = temp[x] +# 这是分组的函数 +def merge_sort(L, first, last, temp): + if first < last: + mid = int(((first + last) / 2)) +#使左边序列有序 + merge_sort(L, first, mid, temp) +#使右边序列有序 + merge_sort(L, mid+1, last, temp) +#将两个有序序列合并 + mergearray(L, first, mid, last, temp) +# 归并排序的函数 +def merge_sort_array(L): +#声明一个长度为len(L)的空列表 + temp = len(L)*[None] +#调用归并排序 + merge_sort(L, 0, len(L)-1, temp) +``` + +### 基数排序 (Radix sort) + +![](/images/SortingAlgorithm/基数排序.gif) + +1. 基数排序:通过序列中各个元素的值,对排序的N个元素进行若干趟的“分配”与“收集”来实现排序。 + - 分配:我们将L[i]中的元素取出,首先确定其个位上的数字,根据该数字分配到与之序号相同的桶中 + - 收集:当序列中所有的元素都分配到对应的桶中,再按照顺序依次将桶中的元素收集形成新的一个待排序列L[ ] + - 对新形成的序列L[]重复执行分配和收集元素中的十位、百位...直到分配完该序列中的最高位,则排序结束 +2. 根据上述“基数排序”的展示,我们可以清楚的看到整个实现的过程 + +```python +#************************基数排序**************************** +#确定排序的次数 +#排序的顺序跟序列中最大数的位数相关 +def radix_sort_nums(L): + maxNum = L[0] +#寻找序列中的最大数 + for x in L: + if maxNum < x: + maxNum = x +#确定序列中的最大元素的位数 + times = 0 + while (maxNum > 0): + maxNum = int((maxNum/10)) + times += 1 + return times +#找到num从低到高第pos位的数据 +def get_num_pos(num, pos): + return (int((num/(10**(pos-1))))) % 10 +#基数排序 +def radix_sort(L): + count = 10 * [None] #存放各个桶的数据统计个数 + bucket = len(L) * [None] #暂时存放排序结果 +#从低位到高位依次执行循环 + for pos in range(1, radix_sort_nums(L)+1): + #置空各个桶的数据统计 + for x in range(0, 10): + count[x] = 0 + #统计当前该位(个位,十位,百位....)的元素数目 + for x in range(0, len(L)): + #统计各个桶将要装进去的元素个数 + j = get_num_pos(int(L[x]), pos) + count[j] += 1 + #count[i]表示第i个桶的右边界索引 + for x in range(1,10): + count[x] += count[x-1] + #将数据依次装入桶中 + for x in range(len(L)-1, -1, -1): + #求出元素第K位的数字 + j = get_num_pos(L[x], pos) + #放入对应的桶中,count[j]-1是第j个桶的右边界索引 + bucket[count[j]-1] = L[x] + #对应桶的装入数据索引-1 + count[j] -= 1 + # 将已分配好的桶中数据再倒出来,此时已是对应当前位数有序的表 + for x in range(0, len(L)): + L[x] = bucket[x] +``` + +## 运行时间实测 + +10w数据 +``` +直接插入排序:1233.581131 +希尔排序:1409.8012320000003 +简单选择排序:466.66974500000015 +堆排序:1.2036720000000969 +冒泡排序:751.274449 +#**************************************************** +快速排序:1.0000003385357559e-06 +#快速排序有误:实际上并未执行 +#RecursionError: maximum recursion depth exceeded in comparison +#**************************************************** +归并排序:0.8262230000000272 +基数排序:1.1162899999999354 +``` +从运行结果上来看,堆排序、归并排序、基数排序真的快。 +对于快速排序迭代深度超过的问题,可以将考虑将快排通过非递归的方式进行实现。 + +## Resources + +1. [算法导论》笔记汇总](http://mindlee.com/2011/08/21/study-notes-directory/) +2. [八大排序算法的 Python 实现](http://python.jobbole.com/82270/) +3. [数据结构常见的八大排序算法(详细整理)](https://www.jianshu.com/p/7d037c332a9d) From 057e7a12122599ae4ddfb835a1ef1b595617f081 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Thu, 5 Apr 2018 14:37:16 +0800 Subject: [PATCH 433/473] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7f0f815c4..940a4301c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # LeetCode 面试题 -## [八大算法算](/docs/SortingAlgorithm/README.md) +## [八大排序算法](/docs/SortingAlgorithm/README.md) ![](/images/SortingAlgorithm/八大排序算法性能.png) From 6acdb14db1b5b1bb7c6bf409d7fe2bfdb3cb49d8 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Thu, 5 Apr 2018 01:50:12 -0500 Subject: [PATCH 434/473] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 940a4301c..bf1be3417 100644 --- a/README.md +++ b/README.md @@ -308,4 +308,7 @@ 9. [mitcc的Github](https://github.com/mitcc/AlgoSolutions) 10. [小土刀的面试刷题笔记](http://wdxtub.com/interview/14520594642530.html) + +Please note, this repository is inspired from [KrisYu](https://github.com/KrisYu/LeetCode-CLRS-Python). However, it has been modified, added and imrpoved to reflect our knowledge, wisdom and effort. + - 💪就是干! From 1437b7e7332a3f406d34bcc8367f3040e900eba9 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Thu, 5 Apr 2018 01:50:59 -0500 Subject: [PATCH 435/473] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bf1be3417..31bf2b468 100644 --- a/README.md +++ b/README.md @@ -309,6 +309,6 @@ 10. [小土刀的面试刷题笔记](http://wdxtub.com/interview/14520594642530.html) -Please note, this repository is inspired from [KrisYu](https://github.com/KrisYu/LeetCode-CLRS-Python). However, it has been modified, added and imrpoved to reflect our knowledge, wisdom and effort. +### Please note, this repository is inspired from [KrisYu](https://github.com/KrisYu/LeetCode-CLRS-Python). However, it has been modified, added and imrpoved to reflect our knowledge, wisdom and effort. - 💪就是干! From 5c1450b8644182e8a9c6d7f9ff31cf23dc9ad93f Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Thu, 5 Apr 2018 16:46:33 -0500 Subject: [PATCH 436/473] Update 126. Word Ladder II.md --- docs/126. Word Ladder II.md | 74 ++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/docs/126. Word Ladder II.md b/docs/126. Word Ladder II.md index e6ef281cc..99e75f495 100644 --- a/docs/126. Word Ladder II.md +++ b/docs/126. Word Ladder II.md @@ -1,4 +1,4 @@ -###126. Word Ladder II +### 126. Word Ladder II 题目: @@ -19,8 +19,8 @@ Hard 就是基本的bfs,典型的level order traverse 有两个坑: -1. 不要判断字典里的某两个word是否只相差一个字母,而是要判断某个word的邻居(和他只相差一个字母的所有word)是否在字典里,这样的改进会使这一步的复杂度下降了很多,否则超时妥妥 -2. 记录每一层已经访问过的word,一层结束后把他们加到大的visited里面,记住每次要访问的word不可以是在visited里面的 +1. 不要判断字典里的某两个word是否只相差一个字母,而是要判断某个word的邻居(和他只相差一个字母的所有word)是否在字典里,这样的改进会使这一步的复杂度下降很多,否则超时妥妥 +2. 每一轮访问过的word一定要从字典中删除掉,否则一定会超时 最后见到end word就收 完成 @@ -41,58 +41,56 @@ Hard cog ``` -生成了如下的一个trace 字典,然后再根据这个来寻找路径 +routine 字典,然后再根据这个来寻找路径 `{'cog': ['log', 'dog'], 'hit': [], 'log': ['lot'], 'dog': ['dot'], 'hot': ['hit'], 'lot': ['hot'], 'dot': ['hot']}` +```'cog': ['log', 'dog']```这里的意思就是说在走到```'cog'```之前尝试过了```'log'```和```'dog'```,即previous tried node + 而生成字典的过程就是BFS的,此处保证寻找的路径就是最短的。 AC代码: -``` +```python class Solution(object): - def findLadders(self, beginWord, endWord, wordlist): + def findLadders(self, beginWord, endWord, wordList): """ :type beginWord: str :type endWord: str - :type wordlist: Set[str] - :rtype: List[List[int]] + :type wordList: List[str] + :rtype: List[List[str]] """ + def backtrack(result, trace, path, word): - if len(trace[word]) == 0: - result.append([word] + path) - else: - for prev in trace[word]: - backtrack(result, trace, [word] + path, prev) - - - wordSet = set(wordlist) - wordSet.add(beginWord) - wordSet.add(endWord) - - result, trace, current = [], {word: [] for word in wordSet}, set([beginWord]) - # print result, trace, current - while current and endWord not in current: - for word in current: - wordSet.remove(word) - net = set([]) - for word in current: - for i in range(len(word)): - for j in 'abcdefghijklmnopqrstuvwxyz': - candidate = word[:i] + j + word[i+1:] - if candidate in wordSet: - trace[candidate].append(word) - net.add(candidate) - current = net - - if current: - backtrack(result, trace, [], endWord) - return result + if len(trace[word]) == 0: + result.append([word] + path) + else: + for prev in trace[word]: + backtrack(result, trace, [word] + path, prev) + + lookup = set(wordList) | set([beginWord]) + res, cur, routine = [], set([beginWord]), {word: [] for word in lookup} + while cur and endWord not in cur: + next_queue = set() + for word in cur: + lookup.remove(word) + for word in cur: + for i in range(len(word)): + for j in 'abcdefghijklmnopqrstuvwxyz': + candidate = word[:i] + j + word[i + 1:] + if candidate in lookup: + next_queue.add(candidate) + routine[candidate].append(word) + cur = next_queue + + if cur: + backtrack(res, routine, [], endWord) + return res ``` -这样可以beat 约 60% +这样可以beat 69.09% From a64ed933e416a07498d0f4af971c50e604f290f1 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Fri, 6 Apr 2018 12:03:05 -0500 Subject: [PATCH 437/473] Update 008._string_to_integer_(atoi).md --- docs/008._string_to_integer_(atoi).md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/008._string_to_integer_(atoi).md b/docs/008._string_to_integer_(atoi).md index c8a9ce4fd..4ff1cddcf 100644 --- a/docs/008._string_to_integer_(atoi).md +++ b/docs/008._string_to_integer_(atoi).md @@ -1,17 +1,23 @@ -###8. String to Integer (atoi) +### 8. String to Integer (atoi) 题目: 难度: -Easy +Medium 需要考虑比较多的边界条件&特殊情况 +1. 首先输入可能会有空格,所以先去掉空格 +2. 去掉空格后要考虑空字符串情况 +3. 字符串首位可能会有正负号,要考虑 +4. 开始转换成数字,题目说只要遇到非数字就可以break了 +5. 结果太大或者太小超过```int```限制就要返回特定数字 ```2147483647``` 或者 ```-2147483648``` +6. 根据之前的正负号结果返回对应数值 -``` +```python class Solution(object): def myAtoi(self, str): """ @@ -44,4 +50,4 @@ class Solution(object): strNum = 0 - strNum return strNum -``` \ No newline at end of file +``` From ac232fbda248870c9bfd59b21da6208823d20568 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Fri, 6 Apr 2018 12:14:31 -0500 Subject: [PATCH 438/473] Create 009._Palindrome_Number.md --- docs/009._Palindrome_Number.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 docs/009._Palindrome_Number.md diff --git a/docs/009._Palindrome_Number.md b/docs/009._Palindrome_Number.md new file mode 100644 index 000000000..c31957d81 --- /dev/null +++ b/docs/009._Palindrome_Number.md @@ -0,0 +1,31 @@ +### 9. Palindrome Number + +题目: + + +难度: +Medium + + +- 首先负数肯定不是palindrome +- 其次如果一个数字是一个正数,并且能被我0整除那它肯定也不是palindrome + +这样降低了复杂度 + +```python +class Solution(object): + def isPalindrome(self, x): + """ + :type x: int + :rtype: bool + """ + if x < 0 or (x != 0 and x % 10 == 0 ): + return False + rev, y = 0, x + while x > 0: + rev = rev * 10 + x % 10 + x /= 10 + return y == rev + +``` + From 283dcf85452c7227e053a4a3ff24796c65509b33 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Fri, 6 Apr 2018 12:14:48 -0500 Subject: [PATCH 439/473] Update 009._Palindrome_Number.md --- docs/009._Palindrome_Number.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/009._Palindrome_Number.md b/docs/009._Palindrome_Number.md index c31957d81..8e14084f7 100644 --- a/docs/009._Palindrome_Number.md +++ b/docs/009._Palindrome_Number.md @@ -19,7 +19,7 @@ class Solution(object): :type x: int :rtype: bool """ - if x < 0 or (x != 0 and x % 10 == 0 ): + if x < 0 or (x != 0 and x % 10 == 0): return False rev, y = 0, x while x > 0: From b6b80b9bd016a030180350d00f0c9a493b9de4ac Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Fri, 6 Apr 2018 20:05:28 -0500 Subject: [PATCH 440/473] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 31bf2b468..f9547934f 100644 --- a/README.md +++ b/README.md @@ -309,6 +309,6 @@ 10. [小土刀的面试刷题笔记](http://wdxtub.com/interview/14520594642530.html) -### Please note, this repository is inspired from [KrisYu](https://github.com/KrisYu/LeetCode-CLRS-Python). However, it has been modified, added and imrpoved to reflect our knowledge, wisdom and effort. +### Please note, this repository is inspired from [KrisYu](https://github.com/KrisYu/LeetCode-CLRS-Python). However, it has been modified, added and improved to reflect our knowledge, wisdom and effort. - 💪就是干! From 67ef661c2129a3587b0a7fcaddd1b705b78e3222 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Fri, 6 Apr 2018 20:33:21 -0500 Subject: [PATCH 441/473] =?UTF-8?q?Create=20=E5=BC=80=E5=8F=91=E5=B2=97?= =?UTF-8?q?=E4=BD=8D(Java)=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\262\227\344\275\215(Java)\346\200\273\347\273\223.md" | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 "docs/interview/\345\274\200\345\217\221\345\262\227\344\275\215(Java)\346\200\273\347\273\223.md" diff --git "a/docs/interview/\345\274\200\345\217\221\345\262\227\344\275\215(Java)\346\200\273\347\273\223.md" "b/docs/interview/\345\274\200\345\217\221\345\262\227\344\275\215(Java)\346\200\273\347\273\223.md" new file mode 100644 index 000000000..ceebd095e --- /dev/null +++ "b/docs/interview/\345\274\200\345\217\221\345\262\227\344\275\215(Java)\346\200\273\347\273\223.md" @@ -0,0 +1,7 @@ +最近正在面试,最开始因为没有这样准备过,所以总是被问的一脸懵逼,相信很多人跟我有过一样的经历,时间长就是忘了嘛,对不对,无奈。 +🔥一上来打算好好整理下,面试前过一遍,岂不是美滋滋! + +# Java基础 +## 1. 面向对象和面向过程的区别 +- 面向过程强调动作,物体本身只是一个属性或者参数,具体为一件事该怎么做。 ```吃.(狗,屎) 吃.(🐶, 💩)``` +- 面向对象强调object,动作只是一个函数,具体为一件事该让谁去做。 ```狗.吃(屎) 🐶.吃(💩)``` From b21dd0e3b52d08dc4c588befd03fe69d4b1eb16c Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Fri, 6 Apr 2018 21:16:03 -0500 Subject: [PATCH 442/473] =?UTF-8?q?Update=20=E5=BC=80=E5=8F=91=E5=B2=97?= =?UTF-8?q?=E4=BD=8D(Java)=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\275\215(Java)\346\200\273\347\273\223.md" | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git "a/docs/interview/\345\274\200\345\217\221\345\262\227\344\275\215(Java)\346\200\273\347\273\223.md" "b/docs/interview/\345\274\200\345\217\221\345\262\227\344\275\215(Java)\346\200\273\347\273\223.md" index ceebd095e..705bc0449 100644 --- "a/docs/interview/\345\274\200\345\217\221\345\262\227\344\275\215(Java)\346\200\273\347\273\223.md" +++ "b/docs/interview/\345\274\200\345\217\221\345\262\227\344\275\215(Java)\346\200\273\347\273\223.md" @@ -1,7 +1,35 @@ 最近正在面试,最开始因为没有这样准备过,所以总是被问的一脸懵逼,相信很多人跟我有过一样的经历,时间长就是忘了嘛,对不对,无奈。 -🔥一上来打算好好整理下,面试前过一遍,岂不是美滋滋! +怒🔥一上来打算好好整理下,面试前过一遍,岂不是美滋滋! # Java基础 ## 1. 面向对象和面向过程的区别 - 面向过程强调动作,物体本身只是一个属性或者参数,具体为一件事该怎么做。 ```吃.(狗,屎) 吃.(🐶, 💩)``` -- 面向对象强调object,动作只是一个函数,具体为一件事该让谁去做。 ```狗.吃(屎) 🐶.吃(💩)``` + - 优点:性能比面向对象高,因为类调用时需要实例化,比较消耗资源;较底层的东西比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 + - 缺点:没有面向对象易维护、易复用、易扩展 +- 面向对象强调object,动作只是一个函数,具体为一件事该让谁去做。         ```狗.吃(屎) 🐶.吃(💩)``` + - 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 + - 缺点:性能比面向过程低 + +## 2. Java的四个基本特性(抽象、封装、继承,多态) +- ***抽象***:就是把现实生活中的某一类东西提取出来,用类或者接口表示。抽象包括两个方面:一个是数据抽象,一个是过程抽象。数据抽象也就是对象的属性。过程抽象是对象的行为特征。 +- ***封装***:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行封装隐藏。封装分为属性的封装和方法的封装。 +    - 1. 安全 +    - 2. 将内外隔离 +    - 3. 便于使用 +    - 4. 提供重复性,具有模块化 +- ***继承***:父类抽取多类事物的共性,不同子类继承父类根据自身条件不同对父类方法进行重载或重写。 +- ***多态***:从某种角度上来说,封装和继承就是为了多态而做准备的。多态采用的方法是动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。多态必须同时满足三个条件: + - 1. 要有继承 + - 2. 要有重写 + - 3. 父类引用指向子类对象 + + 多态其实就是父类提供一个接口,基于同一个接口,使用不同的实例就可以使用不同的功能 + ```java + Father f = new Son(); + ``` +## 3. 重载和重写的区别 +- 重载:发生在同一个类中,方法名必须相同,参数类型、个数或者顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。 +- 重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private则子类中就不是重写。 + +# 4. 构造器Constructor是否可被override +构造器不能被重写,不能用static修饰构造器,只能用public,private,protected这三个权限修饰符,且不能有返回语句。 From 670dd16a2cd738480066b122a3b88829b303e6bf Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Fri, 6 Apr 2018 23:14:38 -0500 Subject: [PATCH 443/473] Update 019._remove_nth_node_from_end_of_list.md --- docs/019._remove_nth_node_from_end_of_list.md | 80 +++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/docs/019._remove_nth_node_from_end_of_list.md b/docs/019._remove_nth_node_from_end_of_list.md index eca0f9ac5..9afa344d4 100644 --- a/docs/019._remove_nth_node_from_end_of_list.md +++ b/docs/019._remove_nth_node_from_end_of_list.md @@ -1,41 +1,41 @@ -###19. Remove Nth Node From End of List - -题目: - - - - -难度: Easy - - -AC击败了95.80%的Python用户,技巧 dummy head 和双指针。 - - +### 19. Remove Nth Node From End of List + +题目: + + + + +难度: Medium + + +AC击败了95.80%的Python用户,技巧 dummy head 和双指针。 +切记最后要返回```dummy.next```而不是```head```,因为有这样一种情况,删掉节点后```linked list```空了,那返回```head```的话结果显然不同。如: +输入链表为```[1]```, ```n = 1```, 应该返回```None```而不是```[1]``` + +```python +class Solution(object): + def removeNthFromEnd(self, head, n): + """ + :type head: ListNode + :type n: int + :rtype: ListNode + """ + dummy = ListNode(-1) + dummy.next = head + p, q = dummy, dummy + + for i in range(n): + q = q.next + + while q.next: + p = p.next + q = q.next + + p.next = p.next.next + return dummy.next + ``` -class Solution(object): - def removeNthFromEnd(self, head, n): - """ - :type head: ListNode - :type n: int - :rtype: ListNode - """ - dummy = ListNode(-1) - dummy.next = head - p = dummy - q = dummy - - for i in range(n): - q = q.next - - while q.next: - p = p.next - q = q.next - - p.next = p.next.next - return dummy.next - -``` - - - - + + + + From 396384a3a85c769652ffbde006acf1994d6cbfc9 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Fri, 6 Apr 2018 23:21:03 -0500 Subject: [PATCH 444/473] Update 019._remove_nth_node_from_end_of_list.md --- docs/019._remove_nth_node_from_end_of_list.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/019._remove_nth_node_from_end_of_list.md b/docs/019._remove_nth_node_from_end_of_list.md index 9afa344d4..5bdefb7a0 100644 --- a/docs/019._remove_nth_node_from_end_of_list.md +++ b/docs/019._remove_nth_node_from_end_of_list.md @@ -9,6 +9,7 @@ AC击败了95.80%的Python用户,技巧 dummy head 和双指针。 + 切记最后要返回```dummy.next```而不是```head```,因为有这样一种情况,删掉节点后```linked list```空了,那返回```head```的话结果显然不同。如: 输入链表为```[1]```, ```n = 1```, 应该返回```None```而不是```[1]``` From 8ea62e8a2d9baa3c96642cba51c423d4f965a77a Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 00:02:39 -0500 Subject: [PATCH 445/473] Create 006._ZigZag_Conversion.md --- docs/006._ZigZag_Conversion.md | 67 ++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 docs/006._ZigZag_Conversion.md diff --git a/docs/006._ZigZag_Conversion.md b/docs/006._ZigZag_Conversion.md new file mode 100644 index 000000000..f0ef15acf --- /dev/null +++ b/docs/006._ZigZag_Conversion.md @@ -0,0 +1,67 @@ +### 6. ZigZag Conversion + +题目: + + + +难度: + +Medium + + +思路 + +参考大神[pharrellyhy](https://leetcode.com/problems/zigzag-conversion/discuss/3404/Python-O(n)-Solution-in-96ms-(99.43)?page=2)的思路, +纵向思维考虑,```index```从```0```开始,我们要一直自增直到```numRows-1```,此时又一直自减到```0```,重复执行。 +多给个例子:```s = “abcdefghijklmn”```, ```numRows = 4``` +``` +a g m +b f h l n +c e i k +d j +``` +看明白了吗,下来上去,下来上去,zigzag + + +```python +class Solution(object): + def convert(self, s, numRows): + """ + :type s: str + :type numRows: int + :rtype: str + """ + if numRows == 1 or numRows >= len(s): + return s + + L = [''] * numRows + index, step = 0, 1 + + for x in s: + L[index] += x + if index == 0: + step = 1 + elif index == numRows -1: + step = -1 + index += step + + return ''.join(L) +``` +假设用我上面给的例子,并且在```L[index] += x```这一行后面打印出index, step, L的值, 输出结果如下: +``` +(0, 1, ['a', '', '', '']) +(1, 1, ['a', 'b', '', '']) +(2, 1, ['a', 'b', 'c', '']) +(3, 1, ['a', 'b', 'c', 'd']) +(2, -1, ['a', 'b', 'ce', 'd']) +(1, -1, ['a', 'bf', 'ce', 'd']) +(0, -1, ['ag', 'bf', 'ce', 'd']) +(1, 1, ['ag', 'bfh', 'ce', 'd']) +(2, 1, ['ag', 'bfh', 'cei', 'd']) +(3, 1, ['ag', 'bfh', 'cei', 'dj']) +(2, -1, ['ag', 'bfh', 'ceik', 'dj']) +(1, -1, ['ag', 'bfhl', 'ceik', 'dj']) +(0, -1, ['agm', 'bfhl', 'ceik', 'dj']) +(1, 1, ['agm', 'bfhln', 'ceik', 'dj']) +``` + From ae111cc40d400e537a3b932dd323bcc2ba71fc33 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 00:03:38 -0500 Subject: [PATCH 446/473] Update 006._ZigZag_Conversion.md --- docs/006._ZigZag_Conversion.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/006._ZigZag_Conversion.md b/docs/006._ZigZag_Conversion.md index f0ef15acf..cc7bcbe33 100644 --- a/docs/006._ZigZag_Conversion.md +++ b/docs/006._ZigZag_Conversion.md @@ -12,8 +12,8 @@ Medium 思路 参考大神[pharrellyhy](https://leetcode.com/problems/zigzag-conversion/discuss/3404/Python-O(n)-Solution-in-96ms-(99.43)?page=2)的思路, -纵向思维考虑,```index```从```0```开始,我们要一直自增直到```numRows-1```,此时又一直自减到```0```,重复执行。 -多给个例子:```s = “abcdefghijklmn”```, ```numRows = 4``` +纵向思维考虑,```index```从```0```开始,我们要一直***自增***直到```numRows-1```,此后又一直***自减***到```0```,重复执行。 +给个例子容易懂一些:```s = “abcdefghijklmn”```, ```numRows = 4``` ``` a g m b f h l n From b02d37adf65566c9d65d5274b102d8a96b845e7b Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 00:08:02 -0500 Subject: [PATCH 447/473] add one interview content --- .../paipaidai.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 "docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" diff --git "a/docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" "b/docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" new file mode 100644 index 000000000..1ca2679b3 --- /dev/null +++ "b/docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" @@ -0,0 +1,34 @@ +如图,![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/interview%20question/WePay/WePay.jpg) + +就是一个slide windows 的题目 + +```python +inputs = [5,1,2,100,2,2] +def alert(inputs, windowSize, allowedIncrease): + b = [] + tmp = {} + for i in range(len(inputs) - windowSize): + for j in range(i, i+windowSize+1): + if j in tmp.keys(): + if j > len(inputs) - windowSize-1: + tmp.get(j).append(inputs[i+1:i + windowSize+1]) + else: + tmp.get(j).append(inputs[i:i+windowSize]) + else: + print(j,j, i, i+ windowSize) + if j > len(inputs) - windowSize -1: + tmp[j] = [inputs[i+1:i + windowSize+1]] + else: + tmp[j] = [inputs[i:i+windowSize]] + b = [inputs[i:i+windowSize] for i in range(len(inputs)-windowSize)] + print(tmp) + for num in tmp.keys(): + if all(inputs[num] > sum(lis)/windowSize*allowedIncrease for lis in tmp.get(num)): + return True + b = [sum(i)/windowSize for i in b] + for i in range(len(b)): + if any(b[i] > b[j]*allowedIncrease for j in range(i)): + return True + return False +print(alert(inputs,3,1.5)) +``` From b5e06ca884e55f81ef337c999660b178d9a8de02 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 00:35:45 -0500 Subject: [PATCH 448/473] Update paipaidai.md --- .../paipaidai.md" | 125 +++++++++++++----- 1 file changed, 91 insertions(+), 34 deletions(-) diff --git "a/docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" "b/docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" index 1ca2679b3..03b55ddab 100644 --- "a/docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" +++ "b/docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" @@ -1,34 +1,91 @@ -如图,![](https://github.com/Lisanaaa/thinking_in_lc/blob/master/interview%20question/WePay/WePay.jpg) - -就是一个slide windows 的题目 - -```python -inputs = [5,1,2,100,2,2] -def alert(inputs, windowSize, allowedIncrease): - b = [] - tmp = {} - for i in range(len(inputs) - windowSize): - for j in range(i, i+windowSize+1): - if j in tmp.keys(): - if j > len(inputs) - windowSize-1: - tmp.get(j).append(inputs[i+1:i + windowSize+1]) - else: - tmp.get(j).append(inputs[i:i+windowSize]) - else: - print(j,j, i, i+ windowSize) - if j > len(inputs) - windowSize -1: - tmp[j] = [inputs[i+1:i + windowSize+1]] - else: - tmp[j] = [inputs[i:i+windowSize]] - b = [inputs[i:i+windowSize] for i in range(len(inputs)-windowSize)] - print(tmp) - for num in tmp.keys(): - if all(inputs[num] > sum(lis)/windowSize*allowedIncrease for lis in tmp.get(num)): - return True - b = [sum(i)/windowSize for i in b] - for i in range(len(b)): - if any(b[i] > b[j]*allowedIncrease for j in range(i)): - return True - return False -print(alert(inputs,3,1.5)) -``` +# 一轮(一个很nice的QA小姐姐) +## 1. 介绍自己及相关项目 + +## 2. 一道简单算法热身,2个排好序的数组,如何取出它们中相同的元素 +答:O(N),就是两个数组同时从```index = 0```开始比较,小的往前进一步,如果相同就加入到```res```中,这样```n```步肯定可以走完。所以是```O(N)``` + +## 3. 类是怎么加载的 +答:五大步骤:加载、验证、准备、解析、初始化,其中解析根据是静态绑定还是动态绑定, 略... +详见[类加载机制](https://blog.csdn.net/ns_code/article/details/17881581),当时在这里看到的,就记了一下 + +## 4. GC 的原理 +答:没引用的对象就是可以回收的了,不定时选择回收与否, 略... + +## 5. 栈和堆内存的区别 +答:略... + +## 6. 永生代是什么,为啥要有这个 +答:略... + +## 7. Spring如何实现AOP和IOC +答:略... + +## 8. 平常开发管理代码用什么方法,Git clone 还是 Git branch,解释一下它们的区别 +答:平常用Git branch,就是按照功能,bug修复开分支,不断merge, 略... + +## 9. 解释RESTful的好处 +答:根据方法不同判断api的功能,非常方便,略... + +## 10. 遇到的困难和如何解决的 +答:略... + +## 11. 你有什么问题要问我的 +答:内心。。没啥要问的哈哈哈😂,略... + + +# 第二轮(一个很严谨的后端开发小哥哥) +## 1. 45分钟做了一套java试题(20单选,2编程,2问答) +反馈:说我做得还可以 + +## 1. 介绍自己及相关项目 + +## 2. 简单解释下面向对象的基本概念:继承、封装和多态 +答: +- 继承就是说现在有一个类A,我们如果想要有更多的有着相同功能的类,那么只要继承最开始的这个类A,我们就可以拥有跟类A一样的功能,根据自己条件的不同还可以对A的方法进行重写或者重载 +- 封装使得内部功能和外部隔离开来,一来安全,二来可以更加具有模块化 +- 多态就是说,类似于Father f = new Son();这种,这种可以用于任何时候我们想应用更加specific功能的时候,此时多态就产生效果了。嗯,多态其实就是基于同一个接口,使用不同的实例就可以使用不同的功能 + +## 3. Java应用程序有没有可能内存泄露?具体场景。如果有一个Java应用程序在生产上发现有内存泄漏问题,作为开发人员你打算如何对其进行问题定位?现在就有这么一个程序,代码也给到你,你怎么弄?流程思路? +答:第一印象是使用测试工具,先进行模块化检测,我一般手动,注释掉一部分然后检查,采用二分法,一般可以定位到,然后仔细检查下代码逻辑,看看会不会有长期不用的对象仍然被引用着。我觉得工业上肯定会有很多高级工具可以检查内存,但是目前我还没有使用过 + +## 4. 简单讲讲哈希表的数据结构和算法(get/put操作)。 +答:略...小学生题目不会估计就GG了 + +## 5. 如果有一个100G的大文件(假定文件里头都是一行行的字符串记录、每个记录约100个字符),要求对这个文件进行排序,请给出你的排序算法。 +答:过程讨论持续15分钟,先后给出3种方法不断优化。 +- 我们可以先遍历所有行,根据每行的前3个字符作为键放到一个hash结构中,这样问题已经可以用O(N^2*lgn)解决了。被否决,有可能前三个字符都是一样的,需要对整个字符串进行排序 +- 或者我们可以先搞一个Trie树,然后遍历一遍全部存好,每一最后字符再多存一个数字表示这一字符串出现次数,然后对这个Trie树进行层次遍历,依次append,返回。回复说文件有100G大小,假设你手头电脑只有8g内存。嗯嗯,我可能会采用先把所有的文件分开很多份分别处理,关键在于最后怎么合并起来还是有序的 +- 其实就是外部排序,先将这个大文件分成很多份,把这些子文件依次读入内存,并利用自定义的有效的内部排序方法(也就是我的方法吧)对它们进行排序,再将排序后得到的有序子文件重新写入外存;可以使用多路归并排序。 + +## 6. 谈谈你对软件研发生命周期过程的理解,如何确保软件的质量。 +答:生命周期主要有问题定义,可行性分析,系统架构设计,编码实现,测试,验收,最后维护。至于确保软件的质量,就是要选用好的,合适的软件生命周期模型。 +大概模型有瀑布模型,螺旋模型,快速原型模型。 +- 需求明确,使用瀑布模型; +- 需求很不明确,快速原型模型; +- 项目不确定性太多使用螺旋模型 + +## 7. 你是如何管理自己的时间的?举一个你设定并达成目标的例子。 +答:略... + +## 8. 你如何理解领导力?举一个由你主动牵头推进的事情。 +答:略... + +## 9. 谈谈你的强项和弱项,基于对自己的认识,你打算如何规划你的职业道路? +答:略... + +## 10. 你有什么问题要问我的 +答:这次我准备了,哈哈哈哈😂,不告诉你们,略... + + +总结: +1. 两点最重要:1)开放学习成长的心态,2)积极主动 +2. 后端开发的话,一开始协助做好单元和性能测试,做样例sample,先学习,证明有足够能力后,开始自己独立设计和开发小型模块。最重要的内容是打好基本功,写好像模像样的单元测试,养成良好的工程习惯。 + + + + + + + + + From f0348679f5a60984ec2dd7f9e2cc10561e1e6cc4 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 00:37:04 -0500 Subject: [PATCH 449/473] Update paipaidai.md --- .../paipaidai.md" | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git "a/docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" "b/docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" index 03b55ddab..6c0b2babb 100644 --- "a/docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" +++ "b/docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" @@ -1,83 +1,83 @@ # 一轮(一个很nice的QA小姐姐) -## 1. 介绍自己及相关项目 +### 1. 介绍自己及相关项目 -## 2. 一道简单算法热身,2个排好序的数组,如何取出它们中相同的元素 +### 2. 一道简单算法热身,2个排好序的数组,如何取出它们中相同的元素 答:O(N),就是两个数组同时从```index = 0```开始比较,小的往前进一步,如果相同就加入到```res```中,这样```n```步肯定可以走完。所以是```O(N)``` -## 3. 类是怎么加载的 +### 3. 类是怎么加载的 答:五大步骤:加载、验证、准备、解析、初始化,其中解析根据是静态绑定还是动态绑定, 略... 详见[类加载机制](https://blog.csdn.net/ns_code/article/details/17881581),当时在这里看到的,就记了一下 -## 4. GC 的原理 +### 4. GC 的原理 答:没引用的对象就是可以回收的了,不定时选择回收与否, 略... -## 5. 栈和堆内存的区别 +### 5. 栈和堆内存的区别 答:略... -## 6. 永生代是什么,为啥要有这个 +### 6. 永生代是什么,为啥要有这个 答:略... -## 7. Spring如何实现AOP和IOC +### 7. Spring如何实现AOP和IOC 答:略... -## 8. 平常开发管理代码用什么方法,Git clone 还是 Git branch,解释一下它们的区别 +### 8. 平常开发管理代码用什么方法,Git clone 还是 Git branch,解释一下它们的区别 答:平常用Git branch,就是按照功能,bug修复开分支,不断merge, 略... -## 9. 解释RESTful的好处 +### 9. 解释RESTful的好处 答:根据方法不同判断api的功能,非常方便,略... -## 10. 遇到的困难和如何解决的 +### 10. 遇到的困难和如何解决的 答:略... -## 11. 你有什么问题要问我的 +### 11. 你有什么问题要问我的 答:内心。。没啥要问的哈哈哈😂,略... # 第二轮(一个很严谨的后端开发小哥哥) -## 1. 45分钟做了一套java试题(20单选,2编程,2问答) +### 1. 45分钟做了一套java试题(20单选,2编程,2问答) 反馈:说我做得还可以 -## 1. 介绍自己及相关项目 +### 1. 介绍自己及相关项目 -## 2. 简单解释下面向对象的基本概念:继承、封装和多态 +### 2. 简单解释下面向对象的基本概念:继承、封装和多态 答: - 继承就是说现在有一个类A,我们如果想要有更多的有着相同功能的类,那么只要继承最开始的这个类A,我们就可以拥有跟类A一样的功能,根据自己条件的不同还可以对A的方法进行重写或者重载 - 封装使得内部功能和外部隔离开来,一来安全,二来可以更加具有模块化 - 多态就是说,类似于Father f = new Son();这种,这种可以用于任何时候我们想应用更加specific功能的时候,此时多态就产生效果了。嗯,多态其实就是基于同一个接口,使用不同的实例就可以使用不同的功能 -## 3. Java应用程序有没有可能内存泄露?具体场景。如果有一个Java应用程序在生产上发现有内存泄漏问题,作为开发人员你打算如何对其进行问题定位?现在就有这么一个程序,代码也给到你,你怎么弄?流程思路? +### 3. Java应用程序有没有可能内存泄露?具体场景。如果有一个Java应用程序在生产上发现有内存泄漏问题,作为开发人员你打算如何对其进行问题定位?现在就有这么一个程序,代码也给到你,你怎么弄?流程思路? 答:第一印象是使用测试工具,先进行模块化检测,我一般手动,注释掉一部分然后检查,采用二分法,一般可以定位到,然后仔细检查下代码逻辑,看看会不会有长期不用的对象仍然被引用着。我觉得工业上肯定会有很多高级工具可以检查内存,但是目前我还没有使用过 -## 4. 简单讲讲哈希表的数据结构和算法(get/put操作)。 +### 4. 简单讲讲哈希表的数据结构和算法(get/put操作)。 答:略...小学生题目不会估计就GG了 -## 5. 如果有一个100G的大文件(假定文件里头都是一行行的字符串记录、每个记录约100个字符),要求对这个文件进行排序,请给出你的排序算法。 +### 5. 如果有一个100G的大文件(假定文件里头都是一行行的字符串记录、每个记录约100个字符),要求对这个文件进行排序,请给出你的排序算法。 答:过程讨论持续15分钟,先后给出3种方法不断优化。 - 我们可以先遍历所有行,根据每行的前3个字符作为键放到一个hash结构中,这样问题已经可以用O(N^2*lgn)解决了。被否决,有可能前三个字符都是一样的,需要对整个字符串进行排序 - 或者我们可以先搞一个Trie树,然后遍历一遍全部存好,每一最后字符再多存一个数字表示这一字符串出现次数,然后对这个Trie树进行层次遍历,依次append,返回。回复说文件有100G大小,假设你手头电脑只有8g内存。嗯嗯,我可能会采用先把所有的文件分开很多份分别处理,关键在于最后怎么合并起来还是有序的 - 其实就是外部排序,先将这个大文件分成很多份,把这些子文件依次读入内存,并利用自定义的有效的内部排序方法(也就是我的方法吧)对它们进行排序,再将排序后得到的有序子文件重新写入外存;可以使用多路归并排序。 -## 6. 谈谈你对软件研发生命周期过程的理解,如何确保软件的质量。 +### 6. 谈谈你对软件研发生命周期过程的理解,如何确保软件的质量。 答:生命周期主要有问题定义,可行性分析,系统架构设计,编码实现,测试,验收,最后维护。至于确保软件的质量,就是要选用好的,合适的软件生命周期模型。 大概模型有瀑布模型,螺旋模型,快速原型模型。 - 需求明确,使用瀑布模型; - 需求很不明确,快速原型模型; - 项目不确定性太多使用螺旋模型 -## 7. 你是如何管理自己的时间的?举一个你设定并达成目标的例子。 +### 7. 你是如何管理自己的时间的?举一个你设定并达成目标的例子。 答:略... -## 8. 你如何理解领导力?举一个由你主动牵头推进的事情。 +### 8. 你如何理解领导力?举一个由你主动牵头推进的事情。 答:略... -## 9. 谈谈你的强项和弱项,基于对自己的认识,你打算如何规划你的职业道路? +### 9. 谈谈你的强项和弱项,基于对自己的认识,你打算如何规划你的职业道路? 答:略... -## 10. 你有什么问题要问我的 +### 10. 你有什么问题要问我的 答:这次我准备了,哈哈哈哈😂,不告诉你们,略... -总结: +# 总结: 1. 两点最重要:1)开放学习成长的心态,2)积极主动 2. 后端开发的话,一开始协助做好单元和性能测试,做样例sample,先学习,证明有足够能力后,开始自己独立设计和开发小型模块。最重要的内容是打好基本功,写好像模像样的单元测试,养成良好的工程习惯。 From 0abf01453130936dfe61a664629b134003fabdc0 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 00:37:23 -0500 Subject: [PATCH 450/473] Update paipaidai.md --- .../\346\213\215\346\213\215\350\264\267/paipaidai.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" "b/docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" index 6c0b2babb..74b73713d 100644 --- "a/docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" +++ "b/docs/interview/\346\213\215\346\213\215\350\264\267/paipaidai.md" @@ -1,4 +1,4 @@ -# 一轮(一个很nice的QA小姐姐) +# 第一轮(一个很nice的QA小姐姐) ### 1. 介绍自己及相关项目 ### 2. 一道简单算法热身,2个排好序的数组,如何取出它们中相同的元素 From aceb68be85ff276eb3ad23d8a74edd00ef2a41e6 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:16:16 -0500 Subject: [PATCH 451/473] Reconstructuring the whole repository, expanding the scope from Leetcode to Algorithms --- .../Algorithm Templates/Sort}/BubbleSort.py | 0 .../Algorithm Templates/Sort}/InsertSort.py | 0 .../Algorithm Templates/Sort}/MergeSort.py | 0 .../Algorithm Templates/Sort}/QuickSort.py | 0 .../Sort}/SelectionSort.py | 0 .../Algorithm Templates/Sort}/ShellSort.py | 0 docs/{ => Leetcode Solutions}/001._two_sum.md | 0 .../002._add_two_numbers.md | 0 ..._substring_without_repeating_characters.md | 0 .../004._median_of_two_sorted_arrays.md | 0 .../005._longest_palindromic_substring.md | 0 .../006._ZigZag_Conversion.md | 0 .../007._Reverse_Integer.md | 0 .../008._string_to_integer_(atoi).md | 0 .../009._Palindrome_Number.md | 0 .../010._regular_expression_matching.md | 0 .../011._container_with_most_water.md | 0 .../012._Integer_to_Roman.md | 0 .../013._Roman_to_Integer.md | 0 .../014._longest_common_prefix.md | 0 docs/{ => Leetcode Solutions}/015._3sum.md | 0 .../016._3sum_closest.md | 0 ...._letter_combinations_of_a_phone_number.md | 0 docs/{ => Leetcode Solutions}/018._4sum.md | 0 .../019._remove_nth_node_from_end_of_list.md | 0 .../020._valid_parentheses.md | 0 .../021._merge_two_sorted_lists.md | 0 .../022._generate_parentheses.md | 0 .../023._merge_k_sorted_lists.md | 0 .../024._swap_nodes_in_pairs.md | 0 ...26._Remove_Duplicates_from_Sorted_Array.md | 0 .../027._Remove_Element.md | 0 .../028._implement_strstr().md | 0 ...bstring_with_Concatenation_of_All_Words.md | 0 .../031._next_permutation.md | 0 .../033._search_in_rotated_sorted_array.md | 0 .../034._Search for a Range.md | 0 .../035._search_insert_position.md | 0 .../038._Count_and_Say.md | 0 .../039._combination_sum.md | 0 .../040._combination_sum_ii.md | 0 .../042._trapping_rain_water.md | 0 .../043._multiply_strings.md | 0 .../044._wildcard_matching.md | 0 .../045._Jump_Game_II.md | 0 .../046._permutations.md | 0 .../047._permutations_ii.md | 0 .../048._rotate_image.md | 0 .../049._group_anagrams_python.md | 0 .../050._pow(x,_n).md | 0 .../{ => Leetcode Solutions}/051._n-queens.md | 0 .../052._n-queens_ii.md | 0 .../053._maximum_subarray.md | 0 .../054._spiral_matrix.md | 0 .../055._jump_game.md | 0 .../056._Merge_Intervals.md | 0 .../058._length_of_last_word.md | 0 .../059._spiral_matrix_ii.md | 0 .../060._permutation_sequence.md | 0 .../061._rotate_list.md | 0 .../064._minimum_path_sum.md | 0 .../065.unique_paths_ii.md | 0 .../{ => Leetcode Solutions}/066._plus_one.md | 0 .../067._add_binary.md | 0 docs/{ => Leetcode Solutions}/069._sqrt(x).md | 0 .../070. Climbing Stairs.md | 0 .../072._edit_distance.md | 0 .../073. Set Matrix Zeroes.md | 0 .../074._search_a_2d_matrix.md | 0 .../075._sort_colors.md | 0 .../076._Minimum_Window_Substring.md | 0 .../077._combinations.md | 0 docs/{ => Leetcode Solutions}/078.Subsets .md | 0 .../079._word_search.md | 0 ...._remove_duplicates_from_sorted_list_ii.md | 0 ...083._remove_duplicates_from_sorted_list.md | 0 .../086._partition_list.md | 0 .../088._merge_sorted_array.md | 0 .../089._gray_code.md | 0 .../090._subsets_ii.md | 0 .../091._decode_ways.md | 0 .../092._reverse_linked_list_ii.md | 0 .../093._restore_ip_addresses.md | 0 .../094._binary_tree_inorder_traversal.md | 0 .../096._unique_binary_search_trees.md | 0 .../098._validate_binary_search_tree.md | 0 .../100._same_tree.md | 0 .../101._symmetric_tree.md | 0 .../102._binary_tree_level_order_traversal.md | 0 ...inary_tree_zigzag_level_order_traversal.md | 0 .../104._maximum_depth_of_binary_tree.md | 0 ...ree_from_preorder_and_inorder_traversal.md | 0 ...ee_from_inorder_and_postorder_traversal.md | 0 ...7._binary_tree_level_order_traversal_ii.md | 0 ...vert_sorted_array_to_binary_search_tree.md | 0 ...nvert_sorted_list_to_binary_search_tree.md | 0 .../110._balanced_binary_tree.md | 0 .../111._minimum_depth_of_binary_tree.md | 0 .../{ => Leetcode Solutions}/112._path_sum.md | 0 .../113._path_sum_ii.md | 0 ...114._flatten_binary_tree_to_linked_list.md | 0 ...lating_next_right_pointers_in_each_node.md | 0 .../118._pascal's_triangle.md | 0 .../119. Pascal's Triangle II.md | 0 .../{ => Leetcode Solutions}/120. Triangle.md | 0 .../121._Best_Time_to_Buy_and_Sell_Stock.md | 0 .../125._valid_palindrome.md | 0 .../126. Word Ladder II.md | 0 .../127._word_ladder.md | 0 .../128._Longest_Consecutive_Sequence.md | 0 .../129._sum_root_to_leaf_numbers.md | 0 .../130._surrounded_regions.md | 0 .../131._palindrome_partitioning.md | 0 .../133._clone_graph.md | 0 .../136._single_number.md | 0 .../139._word_break.md | 0 .../140._word_break_ii.md | 0 .../141._linked_list_cycle.md | 0 .../142_Linked_List_Cycle_II.md | 0 .../143._reorder_list.md | 0 .../144._binary_tree_preorder_traversal.md | 0 .../145._binary_tree_postorder_traversal.md | 0 .../147._insertion_sort_list.md | 0 .../148._sort_list.md | 0 .../150._evaluate_reverse_polish_notation.md | 0 .../151._reverse_words_in_a_string.md | 0 .../152._maximum_product_subarray.md | 0 ...3._find_minimum_in_rotated_sorted_array.md | 0 .../155._min_stack.md | 0 ...ng_with_At_Most_Two_Distinct_Characters.md | 0 .../160._intersection_of_two_linked_lists.md | 0 .../162._find_peak_element.md | 0 .../165._compare_version_numbers.md | 0 .../166._Fraction_to_Recurring_Decimal.md | 0 ...167._two_sum_ii_-_input_array_is_sorted.md | 0 .../168._excel_sheet_column_title.md | 0 .../169._majority_element.md | 0 .../171._excel_sheet_column_number.md | 0 .../173._binary_search_tree_iterator.md | 0 .../189._rotate_array.md | 0 .../191._number_of_1_bits.md | 0 .../198._house_robber.md | 0 .../199._binary_tree_right_side_view.md | 0 .../200._number_of_islands.md | 0 .../203._remove_linked_list_elements.md | 0 .../204._count_primes.md | 0 .../205._isomorphic_strings.md | 0 .../206._reverse_linked_list.md | 0 .../207._course_schedule.md | 0 .../208._implement_trie_(prefix_tree).md | 0 .../210._course_schedule_ii.md | 0 ...and Search Word - Data structure design.md | 0 .../213._house_robber_ii.md | 0 .../216._combination_sum_iii.md | 0 .../217._contains_duplicate.md | 0 .../218._The _Skyline_Problem .md | 0 .../219._contains_duplicate_ii.md | 0 .../221._maximal_square.md | 0 .../222._count_complete_tree_nodes.md | 0 .../223._rectangle_area.md | 0 .../224. Basic Calculator .md | 0 .../225._implement_stack_using_queues.md | 0 .../226._invert_binary_tree.md | 0 .../227._basic_calculator_ii.md | 0 .../228._summary_ranges.md | 0 .../229._majority_element_ii.md | 0 .../230._kth_smallest_element_in_a_bst.md | 0 .../231. _Power_of_Two.md | 0 .../232._implement_queue_using_stacks.md | 0 .../234._palindrome_linked_list.md | 0 ...common_ancestor_of_a_binary_search_tree.md | 0 ...lowest_common_ancestor_of_a_binary_tree.md | 0 .../237._delete_node_in_a_linked_list.md | 0 .../238._product_of_array_except_self.md | 0 .../240._search_a_2d_matrix_ii.md | 0 .../242._valid_anagram.md | 0 .../252. Meeting Rooms.md | 0 ...Preorder_Sequence_in_Binary_Search_Tree.md | 0 .../256. Paint House.md | 0 .../257._binary_tree_paths.md | 0 .../258_ Add_Digits.md | 0 .../261. Graph Valid Tree.md | 0 .../263._ugly_number.md | 0 .../264._ugly_number_ii.md | 0 .../265. Paint House II.md | 0 .../266. Palindrome Permutation.md | 0 .../267. Palindrome Permutation II.md | 0 .../268._missing_number.md | 0 .../270. Closest Binary Search Tree Value.md | 0 .../276. Paint Fence.md | 0 .../277. Find the Celebrity.md | 0 .../278._First_Bad _Version.md | 0 .../279._perfect_squares.md | 0 .../280._Wiggle_Sort.md | 0 .../283._move_zeroes.md | 0 .../285._inorder_successor_in_bst.md | 0 .../286. Walls and Gates.md | 0 .../289._game_of_life.md | 0 .../290._word_pattern.md | 0 .../{ => Leetcode Solutions}/292._nim_game.md | 0 .../296. Best Meeting Point.md | 0 ...inary Tree Longest Consecutive Sequence.md | 0 .../299._bulls_and_cows.md | 0 .../300._longest_increasing_subsequence.md | 0 .../303._range_sum_query_-_immutable.md | 0 .../316._Remove_Duplicate_Letters.md | 0 .../319._Bulb_Switcher.md | 0 .../322. Coin Change.md | 0 ...ected Components in an Undirected Graph.md | 0 .../324._Wiggle_Sort_II.md | 0 .../326._power_of_three.md | 0 .../328._odd_even_linked_list.md | 0 .../334._increasing_triplet_subsequence.md | 0 .../337._house_robber_iii.md | 0 .../338. Counting Bits.md | 0 .../339. Nested List Weight Sum.md | 0 .../341._Flatten_Nested_List_Iterator.md | 0 .../342._Power_of_Four.md | 0 .../344._reverse_string.md | 0 .../345._Reverse_Vowels_of_a_String.md | 0 .../349._intersection_of_two_arrays.md | 0 .../350._intersection_of_two_arrays_ii.md | 0 .../353. Design Snake Game.md | 0 .../364. Nested List Weight Sum II.md | 0 .../366. Find Leaves of Binary Tree.md | 0 .../367._valid_perfect_square.md | 0 .../369.Plus One Linked List.md | 0 .../371._sum_of_two_integers.md | 0 .../374._Guess_Number_Higher_or_Lower.md | 0 .../377._combination_sum_iv.md | 0 ...kth_smallest_element_in_a_sorted_matrix.md | 0 .../380. Insert Delete GetRandom O(1).md | 0 ...ete GetRandom O(1) - Duplicates allowed.md | 0 .../382._linked_list_random_node.md | 0 .../383._ransom_note.md | 0 .../384. Shuffle an Array.md | 0 ...387._first_unique_character_in_a_string.md | 0 .../388._Longest_Absolute_File_Path.md | 0 .../389._find_the_difference.md | 0 .../392._is_subsequence.md | 0 .../394._decode_string.md | 0 .../400. Nth Digit.md | 0 .../401._binary_watch.md | 0 .../404._sum_of_left_leaves.md | 0 .../405. Convert a Number to Hexadecimal.md | 0 .../406._Queue_Reconstruction_by_Height.md | 0 .../412._fizz_buzz.md | 0 .../413. Arithmetic Slices.md | 0 .../414._third_maximum_number.md | 0 .../415._add_strings.md | 0 .../416. Partition Equal Subset Sum.md | 0 ..._Maximum_XOR_of_Two_Numbers_in_an_Array.md | 0 .../422. Valid Word Square.md | 0 .../434._number_of_segments_in_a_string.md | 0 .../437._path_sum_iii.md | 0 .../438._Find_All_Anagrams_in_a_String.md | 0 .../439. Ternary Expression Parser.md | 0 .../441._arranging_coins.md | 0 ...ind_All_Numbers_Disappeared_in_an_Array.md | 0 .../450. Delete Node in a BST.md | 0 ...._Minimum_Moves_to_Equal_Array_Elements.md | 0 .../459._Repeated_Substring_Pattern.md | 0 .../461._Hamming Distance.md | 0 .../463._Island_Perimeter.md | 0 ..._Unique_Substrings_in_Wraparound_String.md | 0 .../469. Convex Polygon.md | 0 .../476._Number_Complement.md | 0 .../477._Total_Hamming_Distance.md | 0 .../485._Max_Consecutive_Ones.md | 0 .../587._Erect_the_Fence .md | 0 .../599._Minimum_Index_Sum_of_Two_Lists.md | 0 .../647._Palindromic_Substrings.md | 0 .../657._Judge_Route_Circle.md | 0 .../665._Non-decreasing_Array.md | 0 .../672._Bulb_Switcher_II.md | 0 .../681._Next_Closest_Time.md | 0 .../682._Baseball_Game.md | 0 .../687._Longest_Univalue_Path.md | 0 .../740._delete_and_earn.md | 0 .../760._Find_Anagram_Mappings.md | 0 ...h \344\270\215\346\230\223\345\206\231.md" | 0 .../Data Structure and Algorthim Review.md | 0 .../Summarization}/Dynamic Programming.md | 0 ...hing Algorithms \342\200\223 topcoder.pdf" | Bin ...13\347\232\204\350\275\254\346\215\242.md" | 0 .../LinkedList\346\212\200\345\267\247.md" | 0 .../Summarization}/Maximal Square.pdf | Bin ...00\345\267\247\347\254\224\350\256\260.py" | 0 .../Range Sum Query 2D - Immutable.pdf | Bin .../Recusrion & BackTracking.md | 0 .../backtracking\346\200\235\350\267\257.md" | 0 ..._a_linked_list\351\227\256\351\242\230.md" | 0 ...60\347\232\204\346\200\235\350\267\257.md" | 0 ...47\232\204\345\220\204\347\247\215pass.md" | 0 .../Summarization}/slide_windows_template.md | 0 ...\214_graph_search\357\274\214_dfs,_bfs.md" | 0 .../\344\275\215\350\277\220\347\256\227.md" | 0 ...22\345\210\227\347\256\227\346\263\225.md" | 0 .../\345\205\253\346\216\222\345\272\217.md" | 0 ...06\345\220\210\351\227\256\351\242\230.md" | 0 .../\346\200\273\347\273\223.md" | 0 ...04\345\220\210\351\227\256\351\242\230.md" | 0 .../\351\200\222\345\275\222_recursion.md" | 0 src/py3.x/TreeRecursionIterator.py | 34 ++++++++++++++++++ src/py3.x/list2iteration.py | 30 ++++++++++++++++ 305 files changed, 64 insertions(+) rename {src/py2.x/SortingAlgorithm => docs/Algorithm Templates/Sort}/BubbleSort.py (100%) rename {src/py2.x/SortingAlgorithm => docs/Algorithm Templates/Sort}/InsertSort.py (100%) rename {src/py2.x/SortingAlgorithm => docs/Algorithm Templates/Sort}/MergeSort.py (100%) rename {src/py2.x/SortingAlgorithm => docs/Algorithm Templates/Sort}/QuickSort.py (100%) rename {src/py2.x/SortingAlgorithm => docs/Algorithm Templates/Sort}/SelectionSort.py (100%) rename {src/py2.x/SortingAlgorithm => docs/Algorithm Templates/Sort}/ShellSort.py (100%) rename docs/{ => Leetcode Solutions}/001._two_sum.md (100%) rename docs/{ => Leetcode Solutions}/002._add_two_numbers.md (100%) rename docs/{ => Leetcode Solutions}/003._longest_substring_without_repeating_characters.md (100%) rename docs/{ => Leetcode Solutions}/004._median_of_two_sorted_arrays.md (100%) rename docs/{ => Leetcode Solutions}/005._longest_palindromic_substring.md (100%) rename docs/{ => Leetcode Solutions}/006._ZigZag_Conversion.md (100%) rename docs/{ => Leetcode Solutions}/007._Reverse_Integer.md (100%) rename docs/{ => Leetcode Solutions}/008._string_to_integer_(atoi).md (100%) rename docs/{ => Leetcode Solutions}/009._Palindrome_Number.md (100%) rename docs/{ => Leetcode Solutions}/010._regular_expression_matching.md (100%) rename docs/{ => Leetcode Solutions}/011._container_with_most_water.md (100%) rename docs/{ => Leetcode Solutions}/012._Integer_to_Roman.md (100%) rename docs/{ => Leetcode Solutions}/013._Roman_to_Integer.md (100%) rename docs/{ => Leetcode Solutions}/014._longest_common_prefix.md (100%) rename docs/{ => Leetcode Solutions}/015._3sum.md (100%) rename docs/{ => Leetcode Solutions}/016._3sum_closest.md (100%) rename docs/{ => Leetcode Solutions}/017._letter_combinations_of_a_phone_number.md (100%) rename docs/{ => Leetcode Solutions}/018._4sum.md (100%) rename docs/{ => Leetcode Solutions}/019._remove_nth_node_from_end_of_list.md (100%) rename docs/{ => Leetcode Solutions}/020._valid_parentheses.md (100%) rename docs/{ => Leetcode Solutions}/021._merge_two_sorted_lists.md (100%) rename docs/{ => Leetcode Solutions}/022._generate_parentheses.md (100%) rename docs/{ => Leetcode Solutions}/023._merge_k_sorted_lists.md (100%) rename docs/{ => Leetcode Solutions}/024._swap_nodes_in_pairs.md (100%) rename docs/{ => Leetcode Solutions}/026._Remove_Duplicates_from_Sorted_Array.md (100%) rename docs/{ => Leetcode Solutions}/027._Remove_Element.md (100%) rename docs/{ => Leetcode Solutions}/028._implement_strstr().md (100%) rename docs/{ => Leetcode Solutions}/030._Substring_with_Concatenation_of_All_Words.md (100%) rename docs/{ => Leetcode Solutions}/031._next_permutation.md (100%) rename docs/{ => Leetcode Solutions}/033._search_in_rotated_sorted_array.md (100%) rename docs/{ => Leetcode Solutions}/034._Search for a Range.md (100%) rename docs/{ => Leetcode Solutions}/035._search_insert_position.md (100%) rename docs/{ => Leetcode Solutions}/038._Count_and_Say.md (100%) rename docs/{ => Leetcode Solutions}/039._combination_sum.md (100%) rename docs/{ => Leetcode Solutions}/040._combination_sum_ii.md (100%) rename docs/{ => Leetcode Solutions}/042._trapping_rain_water.md (100%) rename docs/{ => Leetcode Solutions}/043._multiply_strings.md (100%) rename docs/{ => Leetcode Solutions}/044._wildcard_matching.md (100%) rename docs/{ => Leetcode Solutions}/045._Jump_Game_II.md (100%) rename docs/{ => Leetcode Solutions}/046._permutations.md (100%) rename docs/{ => Leetcode Solutions}/047._permutations_ii.md (100%) rename docs/{ => Leetcode Solutions}/048._rotate_image.md (100%) rename docs/{ => Leetcode Solutions}/049._group_anagrams_python.md (100%) rename docs/{ => Leetcode Solutions}/050._pow(x,_n).md (100%) rename docs/{ => Leetcode Solutions}/051._n-queens.md (100%) rename docs/{ => Leetcode Solutions}/052._n-queens_ii.md (100%) rename docs/{ => Leetcode Solutions}/053._maximum_subarray.md (100%) rename docs/{ => Leetcode Solutions}/054._spiral_matrix.md (100%) rename docs/{ => Leetcode Solutions}/055._jump_game.md (100%) rename docs/{ => Leetcode Solutions}/056._Merge_Intervals.md (100%) rename docs/{ => Leetcode Solutions}/058._length_of_last_word.md (100%) rename docs/{ => Leetcode Solutions}/059._spiral_matrix_ii.md (100%) rename docs/{ => Leetcode Solutions}/060._permutation_sequence.md (100%) rename docs/{ => Leetcode Solutions}/061._rotate_list.md (100%) rename docs/{ => Leetcode Solutions}/064._minimum_path_sum.md (100%) rename docs/{ => Leetcode Solutions}/065.unique_paths_ii.md (100%) rename docs/{ => Leetcode Solutions}/066._plus_one.md (100%) rename docs/{ => Leetcode Solutions}/067._add_binary.md (100%) rename docs/{ => Leetcode Solutions}/069._sqrt(x).md (100%) rename docs/{ => Leetcode Solutions}/070. Climbing Stairs.md (100%) rename docs/{ => Leetcode Solutions}/072._edit_distance.md (100%) rename docs/{ => Leetcode Solutions}/073. Set Matrix Zeroes.md (100%) rename docs/{ => Leetcode Solutions}/074._search_a_2d_matrix.md (100%) rename docs/{ => Leetcode Solutions}/075._sort_colors.md (100%) rename docs/{ => Leetcode Solutions}/076._Minimum_Window_Substring.md (100%) rename docs/{ => Leetcode Solutions}/077._combinations.md (100%) rename docs/{ => Leetcode Solutions}/078.Subsets .md (100%) rename docs/{ => Leetcode Solutions}/079._word_search.md (100%) rename docs/{ => Leetcode Solutions}/082._remove_duplicates_from_sorted_list_ii.md (100%) rename docs/{ => Leetcode Solutions}/083._remove_duplicates_from_sorted_list.md (100%) rename docs/{ => Leetcode Solutions}/086._partition_list.md (100%) rename docs/{ => Leetcode Solutions}/088._merge_sorted_array.md (100%) rename docs/{ => Leetcode Solutions}/089._gray_code.md (100%) rename docs/{ => Leetcode Solutions}/090._subsets_ii.md (100%) rename docs/{ => Leetcode Solutions}/091._decode_ways.md (100%) rename docs/{ => Leetcode Solutions}/092._reverse_linked_list_ii.md (100%) rename docs/{ => Leetcode Solutions}/093._restore_ip_addresses.md (100%) rename docs/{ => Leetcode Solutions}/094._binary_tree_inorder_traversal.md (100%) rename docs/{ => Leetcode Solutions}/096._unique_binary_search_trees.md (100%) rename docs/{ => Leetcode Solutions}/098._validate_binary_search_tree.md (100%) rename docs/{ => Leetcode Solutions}/100._same_tree.md (100%) rename docs/{ => Leetcode Solutions}/101._symmetric_tree.md (100%) rename docs/{ => Leetcode Solutions}/102._binary_tree_level_order_traversal.md (100%) rename docs/{ => Leetcode Solutions}/103._binary_tree_zigzag_level_order_traversal.md (100%) rename docs/{ => Leetcode Solutions}/104._maximum_depth_of_binary_tree.md (100%) rename docs/{ => Leetcode Solutions}/105._construct_binary_tree_from_preorder_and_inorder_traversal.md (100%) rename docs/{ => Leetcode Solutions}/106._construct_binary_tree_from_inorder_and_postorder_traversal.md (100%) rename docs/{ => Leetcode Solutions}/107._binary_tree_level_order_traversal_ii.md (100%) rename docs/{ => Leetcode Solutions}/108._convert_sorted_array_to_binary_search_tree.md (100%) rename docs/{ => Leetcode Solutions}/109._convert_sorted_list_to_binary_search_tree.md (100%) rename docs/{ => Leetcode Solutions}/110._balanced_binary_tree.md (100%) rename docs/{ => Leetcode Solutions}/111._minimum_depth_of_binary_tree.md (100%) rename docs/{ => Leetcode Solutions}/112._path_sum.md (100%) rename docs/{ => Leetcode Solutions}/113._path_sum_ii.md (100%) rename docs/{ => Leetcode Solutions}/114._flatten_binary_tree_to_linked_list.md (100%) rename docs/{ => Leetcode Solutions}/116._populating_next_right_pointers_in_each_node.md (100%) rename docs/{ => Leetcode Solutions}/118._pascal's_triangle.md (100%) rename docs/{ => Leetcode Solutions}/119. Pascal's Triangle II.md (100%) rename docs/{ => Leetcode Solutions}/120. Triangle.md (100%) rename docs/{ => Leetcode Solutions}/121._Best_Time_to_Buy_and_Sell_Stock.md (100%) rename docs/{ => Leetcode Solutions}/125._valid_palindrome.md (100%) rename docs/{ => Leetcode Solutions}/126. Word Ladder II.md (100%) rename docs/{ => Leetcode Solutions}/127._word_ladder.md (100%) rename docs/{ => Leetcode Solutions}/128._Longest_Consecutive_Sequence.md (100%) rename docs/{ => Leetcode Solutions}/129._sum_root_to_leaf_numbers.md (100%) rename docs/{ => Leetcode Solutions}/130._surrounded_regions.md (100%) rename docs/{ => Leetcode Solutions}/131._palindrome_partitioning.md (100%) rename docs/{ => Leetcode Solutions}/133._clone_graph.md (100%) rename docs/{ => Leetcode Solutions}/136._single_number.md (100%) rename docs/{ => Leetcode Solutions}/139._word_break.md (100%) rename docs/{ => Leetcode Solutions}/140._word_break_ii.md (100%) rename docs/{ => Leetcode Solutions}/141._linked_list_cycle.md (100%) rename docs/{ => Leetcode Solutions}/142_Linked_List_Cycle_II.md (100%) rename docs/{ => Leetcode Solutions}/143._reorder_list.md (100%) rename docs/{ => Leetcode Solutions}/144._binary_tree_preorder_traversal.md (100%) rename docs/{ => Leetcode Solutions}/145._binary_tree_postorder_traversal.md (100%) rename docs/{ => Leetcode Solutions}/147._insertion_sort_list.md (100%) rename docs/{ => Leetcode Solutions}/148._sort_list.md (100%) rename docs/{ => Leetcode Solutions}/150._evaluate_reverse_polish_notation.md (100%) rename docs/{ => Leetcode Solutions}/151._reverse_words_in_a_string.md (100%) rename docs/{ => Leetcode Solutions}/152._maximum_product_subarray.md (100%) rename docs/{ => Leetcode Solutions}/153._find_minimum_in_rotated_sorted_array.md (100%) rename docs/{ => Leetcode Solutions}/155._min_stack.md (100%) rename docs/{ => Leetcode Solutions}/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md (100%) rename docs/{ => Leetcode Solutions}/160._intersection_of_two_linked_lists.md (100%) rename docs/{ => Leetcode Solutions}/162._find_peak_element.md (100%) rename docs/{ => Leetcode Solutions}/165._compare_version_numbers.md (100%) rename docs/{ => Leetcode Solutions}/166._Fraction_to_Recurring_Decimal.md (100%) rename docs/{ => Leetcode Solutions}/167._two_sum_ii_-_input_array_is_sorted.md (100%) rename docs/{ => Leetcode Solutions}/168._excel_sheet_column_title.md (100%) rename docs/{ => Leetcode Solutions}/169._majority_element.md (100%) rename docs/{ => Leetcode Solutions}/171._excel_sheet_column_number.md (100%) rename docs/{ => Leetcode Solutions}/173._binary_search_tree_iterator.md (100%) rename docs/{ => Leetcode Solutions}/189._rotate_array.md (100%) rename docs/{ => Leetcode Solutions}/191._number_of_1_bits.md (100%) rename docs/{ => Leetcode Solutions}/198._house_robber.md (100%) rename docs/{ => Leetcode Solutions}/199._binary_tree_right_side_view.md (100%) rename docs/{ => Leetcode Solutions}/200._number_of_islands.md (100%) rename docs/{ => Leetcode Solutions}/203._remove_linked_list_elements.md (100%) rename docs/{ => Leetcode Solutions}/204._count_primes.md (100%) rename docs/{ => Leetcode Solutions}/205._isomorphic_strings.md (100%) rename docs/{ => Leetcode Solutions}/206._reverse_linked_list.md (100%) rename docs/{ => Leetcode Solutions}/207._course_schedule.md (100%) rename docs/{ => Leetcode Solutions}/208._implement_trie_(prefix_tree).md (100%) rename docs/{ => Leetcode Solutions}/210._course_schedule_ii.md (100%) rename docs/{ => Leetcode Solutions}/211. Add and Search Word - Data structure design.md (100%) rename docs/{ => Leetcode Solutions}/213._house_robber_ii.md (100%) rename docs/{ => Leetcode Solutions}/216._combination_sum_iii.md (100%) rename docs/{ => Leetcode Solutions}/217._contains_duplicate.md (100%) rename docs/{ => Leetcode Solutions}/218._The _Skyline_Problem .md (100%) rename docs/{ => Leetcode Solutions}/219._contains_duplicate_ii.md (100%) rename docs/{ => Leetcode Solutions}/221._maximal_square.md (100%) rename docs/{ => Leetcode Solutions}/222._count_complete_tree_nodes.md (100%) rename docs/{ => Leetcode Solutions}/223._rectangle_area.md (100%) rename docs/{ => Leetcode Solutions}/224. Basic Calculator .md (100%) rename docs/{ => Leetcode Solutions}/225._implement_stack_using_queues.md (100%) rename docs/{ => Leetcode Solutions}/226._invert_binary_tree.md (100%) rename docs/{ => Leetcode Solutions}/227._basic_calculator_ii.md (100%) rename docs/{ => Leetcode Solutions}/228._summary_ranges.md (100%) rename docs/{ => Leetcode Solutions}/229._majority_element_ii.md (100%) rename docs/{ => Leetcode Solutions}/230._kth_smallest_element_in_a_bst.md (100%) rename docs/{ => Leetcode Solutions}/231. _Power_of_Two.md (100%) rename docs/{ => Leetcode Solutions}/232._implement_queue_using_stacks.md (100%) rename docs/{ => Leetcode Solutions}/234._palindrome_linked_list.md (100%) rename docs/{ => Leetcode Solutions}/235._lowest_common_ancestor_of_a_binary_search_tree.md (100%) rename docs/{ => Leetcode Solutions}/236._lowest_common_ancestor_of_a_binary_tree.md (100%) rename docs/{ => Leetcode Solutions}/237._delete_node_in_a_linked_list.md (100%) rename docs/{ => Leetcode Solutions}/238._product_of_array_except_self.md (100%) rename docs/{ => Leetcode Solutions}/240._search_a_2d_matrix_ii.md (100%) rename docs/{ => Leetcode Solutions}/242._valid_anagram.md (100%) rename docs/{ => Leetcode Solutions}/252. Meeting Rooms.md (100%) rename docs/{ => Leetcode Solutions}/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md (100%) rename docs/{ => Leetcode Solutions}/256. Paint House.md (100%) rename docs/{ => Leetcode Solutions}/257._binary_tree_paths.md (100%) rename docs/{ => Leetcode Solutions}/258_ Add_Digits.md (100%) rename docs/{ => Leetcode Solutions}/261. Graph Valid Tree.md (100%) rename docs/{ => Leetcode Solutions}/263._ugly_number.md (100%) rename docs/{ => Leetcode Solutions}/264._ugly_number_ii.md (100%) rename docs/{ => Leetcode Solutions}/265. Paint House II.md (100%) rename docs/{ => Leetcode Solutions}/266. Palindrome Permutation.md (100%) rename docs/{ => Leetcode Solutions}/267. Palindrome Permutation II.md (100%) rename docs/{ => Leetcode Solutions}/268._missing_number.md (100%) rename docs/{ => Leetcode Solutions}/270. Closest Binary Search Tree Value.md (100%) rename docs/{ => Leetcode Solutions}/276. Paint Fence.md (100%) rename docs/{ => Leetcode Solutions}/277. Find the Celebrity.md (100%) rename docs/{ => Leetcode Solutions}/278._First_Bad _Version.md (100%) rename docs/{ => Leetcode Solutions}/279._perfect_squares.md (100%) rename docs/{ => Leetcode Solutions}/280._Wiggle_Sort.md (100%) rename docs/{ => Leetcode Solutions}/283._move_zeroes.md (100%) rename docs/{ => Leetcode Solutions}/285._inorder_successor_in_bst.md (100%) rename docs/{ => Leetcode Solutions}/286. Walls and Gates.md (100%) rename docs/{ => Leetcode Solutions}/289._game_of_life.md (100%) rename docs/{ => Leetcode Solutions}/290._word_pattern.md (100%) rename docs/{ => Leetcode Solutions}/292._nim_game.md (100%) rename docs/{ => Leetcode Solutions}/296. Best Meeting Point.md (100%) rename docs/{ => Leetcode Solutions}/298. Binary Tree Longest Consecutive Sequence.md (100%) rename docs/{ => Leetcode Solutions}/299._bulls_and_cows.md (100%) rename docs/{ => Leetcode Solutions}/300._longest_increasing_subsequence.md (100%) rename docs/{ => Leetcode Solutions}/303._range_sum_query_-_immutable.md (100%) rename docs/{ => Leetcode Solutions}/316._Remove_Duplicate_Letters.md (100%) rename docs/{ => Leetcode Solutions}/319._Bulb_Switcher.md (100%) rename docs/{ => Leetcode Solutions}/322. Coin Change.md (100%) rename docs/{ => Leetcode Solutions}/323. Number of Connected Components in an Undirected Graph.md (100%) rename docs/{ => Leetcode Solutions}/324._Wiggle_Sort_II.md (100%) rename docs/{ => Leetcode Solutions}/326._power_of_three.md (100%) rename docs/{ => Leetcode Solutions}/328._odd_even_linked_list.md (100%) rename docs/{ => Leetcode Solutions}/334._increasing_triplet_subsequence.md (100%) rename docs/{ => Leetcode Solutions}/337._house_robber_iii.md (100%) rename docs/{ => Leetcode Solutions}/338. Counting Bits.md (100%) rename docs/{ => Leetcode Solutions}/339. Nested List Weight Sum.md (100%) rename docs/{ => Leetcode Solutions}/341._Flatten_Nested_List_Iterator.md (100%) rename docs/{ => Leetcode Solutions}/342._Power_of_Four.md (100%) rename docs/{ => Leetcode Solutions}/344._reverse_string.md (100%) rename docs/{ => Leetcode Solutions}/345._Reverse_Vowels_of_a_String.md (100%) rename docs/{ => Leetcode Solutions}/349._intersection_of_two_arrays.md (100%) rename docs/{ => Leetcode Solutions}/350._intersection_of_two_arrays_ii.md (100%) rename docs/{ => Leetcode Solutions}/353. Design Snake Game.md (100%) rename docs/{ => Leetcode Solutions}/364. Nested List Weight Sum II.md (100%) rename docs/{ => Leetcode Solutions}/366. Find Leaves of Binary Tree.md (100%) rename docs/{ => Leetcode Solutions}/367._valid_perfect_square.md (100%) rename docs/{ => Leetcode Solutions}/369.Plus One Linked List.md (100%) rename docs/{ => Leetcode Solutions}/371._sum_of_two_integers.md (100%) rename docs/{ => Leetcode Solutions}/374._Guess_Number_Higher_or_Lower.md (100%) rename docs/{ => Leetcode Solutions}/377._combination_sum_iv.md (100%) rename docs/{ => Leetcode Solutions}/378._kth_smallest_element_in_a_sorted_matrix.md (100%) rename docs/{ => Leetcode Solutions}/380. Insert Delete GetRandom O(1).md (100%) rename docs/{ => Leetcode Solutions}/381. Insert Delete GetRandom O(1) - Duplicates allowed.md (100%) rename docs/{ => Leetcode Solutions}/382._linked_list_random_node.md (100%) rename docs/{ => Leetcode Solutions}/383._ransom_note.md (100%) rename docs/{ => Leetcode Solutions}/384. Shuffle an Array.md (100%) rename docs/{ => Leetcode Solutions}/387._first_unique_character_in_a_string.md (100%) rename docs/{ => Leetcode Solutions}/388._Longest_Absolute_File_Path.md (100%) rename docs/{ => Leetcode Solutions}/389._find_the_difference.md (100%) rename docs/{ => Leetcode Solutions}/392._is_subsequence.md (100%) rename docs/{ => Leetcode Solutions}/394._decode_string.md (100%) rename docs/{ => Leetcode Solutions}/400. Nth Digit.md (100%) rename docs/{ => Leetcode Solutions}/401._binary_watch.md (100%) rename docs/{ => Leetcode Solutions}/404._sum_of_left_leaves.md (100%) rename docs/{ => Leetcode Solutions}/405. Convert a Number to Hexadecimal.md (100%) rename docs/{ => Leetcode Solutions}/406._Queue_Reconstruction_by_Height.md (100%) rename docs/{ => Leetcode Solutions}/412._fizz_buzz.md (100%) rename docs/{ => Leetcode Solutions}/413. Arithmetic Slices.md (100%) rename docs/{ => Leetcode Solutions}/414._third_maximum_number.md (100%) rename docs/{ => Leetcode Solutions}/415._add_strings.md (100%) rename docs/{ => Leetcode Solutions}/416. Partition Equal Subset Sum.md (100%) rename docs/{ => Leetcode Solutions}/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md (100%) rename docs/{ => Leetcode Solutions}/422. Valid Word Square.md (100%) rename docs/{ => Leetcode Solutions}/434._number_of_segments_in_a_string.md (100%) rename docs/{ => Leetcode Solutions}/437._path_sum_iii.md (100%) rename docs/{ => Leetcode Solutions}/438._Find_All_Anagrams_in_a_String.md (100%) rename docs/{ => Leetcode Solutions}/439. Ternary Expression Parser.md (100%) rename docs/{ => Leetcode Solutions}/441._arranging_coins.md (100%) rename docs/{ => Leetcode Solutions}/448._Find_All_Numbers_Disappeared_in_an_Array.md (100%) rename docs/{ => Leetcode Solutions}/450. Delete Node in a BST.md (100%) rename docs/{ => Leetcode Solutions}/453._Minimum_Moves_to_Equal_Array_Elements.md (100%) rename docs/{ => Leetcode Solutions}/459._Repeated_Substring_Pattern.md (100%) rename docs/{ => Leetcode Solutions}/461._Hamming Distance.md (100%) rename docs/{ => Leetcode Solutions}/463._Island_Perimeter.md (100%) rename docs/{ => Leetcode Solutions}/467._Unique_Substrings_in_Wraparound_String.md (100%) rename docs/{ => Leetcode Solutions}/469. Convex Polygon.md (100%) rename docs/{ => Leetcode Solutions}/476._Number_Complement.md (100%) rename docs/{ => Leetcode Solutions}/477._Total_Hamming_Distance.md (100%) rename docs/{ => Leetcode Solutions}/485._Max_Consecutive_Ones.md (100%) rename docs/{ => Leetcode Solutions}/587._Erect_the_Fence .md (100%) rename docs/{ => Leetcode Solutions}/599._Minimum_Index_Sum_of_Two_Lists.md (100%) rename docs/{ => Leetcode Solutions}/647._Palindromic_Substrings.md (100%) rename docs/{ => Leetcode Solutions}/657._Judge_Route_Circle.md (100%) rename docs/{ => Leetcode Solutions}/665._Non-decreasing_Array.md (100%) rename docs/{ => Leetcode Solutions}/672._Bulb_Switcher_II.md (100%) rename docs/{ => Leetcode Solutions}/681._Next_Closest_Time.md (100%) rename docs/{ => Leetcode Solutions}/682._Baseball_Game.md (100%) rename docs/{ => Leetcode Solutions}/687._Longest_Univalue_Path.md (100%) rename docs/{ => Leetcode Solutions}/740._delete_and_earn.md (100%) rename docs/{ => Leetcode Solutions}/760._Find_Anagram_Mappings.md (100%) rename "others/Binary Search \344\270\215\346\230\223\345\206\231.md" => "docs/Leetcode Solutions/Summarization/Binary Search \344\270\215\346\230\223\345\206\231.md" (100%) rename {others => docs/Leetcode Solutions/Summarization}/Data Structure and Algorthim Review.md (100%) rename {others => docs/Leetcode Solutions/Summarization}/Dynamic Programming.md (100%) rename "others/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" => "docs/Leetcode Solutions/Summarization/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" (100%) rename "others/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" => "docs/Leetcode Solutions/Summarization/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" (100%) rename "others/LinkedList\346\212\200\345\267\247.md" => "docs/Leetcode Solutions/Summarization/LinkedList\346\212\200\345\267\247.md" (100%) rename {others => docs/Leetcode Solutions/Summarization}/Maximal Square.pdf (100%) rename "docs/SortingAlgorithm/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" => "docs/Leetcode Solutions/Summarization/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" (100%) rename {others => docs/Leetcode Solutions/Summarization}/Range Sum Query 2D - Immutable.pdf (100%) rename {others => docs/Leetcode Solutions/Summarization}/Recusrion & BackTracking.md (100%) rename "others/backtracking\346\200\235\350\267\257.md" => "docs/Leetcode Solutions/Summarization/backtracking\346\200\235\350\267\257.md" (100%) rename "others/delete_node_in_a_linked_list\351\227\256\351\242\230.md" => "docs/Leetcode Solutions/Summarization/delete_node_in_a_linked_list\351\227\256\351\242\230.md" (100%) rename "others/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" => "docs/Leetcode Solutions/Summarization/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" (100%) rename "docs/SortingAlgorithm/python\347\232\204\345\220\204\347\247\215pass.md" => "docs/Leetcode Solutions/Summarization/python\347\232\204\345\220\204\347\247\215pass.md" (100%) rename {others => docs/Leetcode Solutions/Summarization}/slide_windows_template.md (100%) rename "docs/SortingAlgorithm/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" => "docs/Leetcode Solutions/Summarization/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" (100%) rename "others/\344\275\215\350\277\220\347\256\227.md" => "docs/Leetcode Solutions/Summarization/\344\275\215\350\277\220\347\256\227.md" (100%) rename "others/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" => "docs/Leetcode Solutions/Summarization/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" (100%) rename docs/SortingAlgorithm/README.md => "docs/Leetcode Solutions/Summarization/\345\205\253\346\216\222\345\272\217.md" (100%) rename "others/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" => "docs/Leetcode Solutions/Summarization/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" (100%) rename "others/\346\200\273\347\273\223.md" => "docs/Leetcode Solutions/Summarization/\346\200\273\347\273\223.md" (100%) rename "others/\347\273\204\345\220\210\351\227\256\351\242\230.md" => "docs/Leetcode Solutions/Summarization/\347\273\204\345\220\210\351\227\256\351\242\230.md" (100%) rename "others/\351\200\222\345\275\222_recursion.md" => "docs/Leetcode Solutions/Summarization/\351\200\222\345\275\222_recursion.md" (100%) create mode 100644 src/py3.x/TreeRecursionIterator.py create mode 100644 src/py3.x/list2iteration.py diff --git a/src/py2.x/SortingAlgorithm/BubbleSort.py b/docs/Algorithm Templates/Sort/BubbleSort.py similarity index 100% rename from src/py2.x/SortingAlgorithm/BubbleSort.py rename to docs/Algorithm Templates/Sort/BubbleSort.py diff --git a/src/py2.x/SortingAlgorithm/InsertSort.py b/docs/Algorithm Templates/Sort/InsertSort.py similarity index 100% rename from src/py2.x/SortingAlgorithm/InsertSort.py rename to docs/Algorithm Templates/Sort/InsertSort.py diff --git a/src/py2.x/SortingAlgorithm/MergeSort.py b/docs/Algorithm Templates/Sort/MergeSort.py similarity index 100% rename from src/py2.x/SortingAlgorithm/MergeSort.py rename to docs/Algorithm Templates/Sort/MergeSort.py diff --git a/src/py2.x/SortingAlgorithm/QuickSort.py b/docs/Algorithm Templates/Sort/QuickSort.py similarity index 100% rename from src/py2.x/SortingAlgorithm/QuickSort.py rename to docs/Algorithm Templates/Sort/QuickSort.py diff --git a/src/py2.x/SortingAlgorithm/SelectionSort.py b/docs/Algorithm Templates/Sort/SelectionSort.py similarity index 100% rename from src/py2.x/SortingAlgorithm/SelectionSort.py rename to docs/Algorithm Templates/Sort/SelectionSort.py diff --git a/src/py2.x/SortingAlgorithm/ShellSort.py b/docs/Algorithm Templates/Sort/ShellSort.py similarity index 100% rename from src/py2.x/SortingAlgorithm/ShellSort.py rename to docs/Algorithm Templates/Sort/ShellSort.py diff --git a/docs/001._two_sum.md b/docs/Leetcode Solutions/001._two_sum.md similarity index 100% rename from docs/001._two_sum.md rename to docs/Leetcode Solutions/001._two_sum.md diff --git a/docs/002._add_two_numbers.md b/docs/Leetcode Solutions/002._add_two_numbers.md similarity index 100% rename from docs/002._add_two_numbers.md rename to docs/Leetcode Solutions/002._add_two_numbers.md diff --git a/docs/003._longest_substring_without_repeating_characters.md b/docs/Leetcode Solutions/003._longest_substring_without_repeating_characters.md similarity index 100% rename from docs/003._longest_substring_without_repeating_characters.md rename to docs/Leetcode Solutions/003._longest_substring_without_repeating_characters.md diff --git a/docs/004._median_of_two_sorted_arrays.md b/docs/Leetcode Solutions/004._median_of_two_sorted_arrays.md similarity index 100% rename from docs/004._median_of_two_sorted_arrays.md rename to docs/Leetcode Solutions/004._median_of_two_sorted_arrays.md diff --git a/docs/005._longest_palindromic_substring.md b/docs/Leetcode Solutions/005._longest_palindromic_substring.md similarity index 100% rename from docs/005._longest_palindromic_substring.md rename to docs/Leetcode Solutions/005._longest_palindromic_substring.md diff --git a/docs/006._ZigZag_Conversion.md b/docs/Leetcode Solutions/006._ZigZag_Conversion.md similarity index 100% rename from docs/006._ZigZag_Conversion.md rename to docs/Leetcode Solutions/006._ZigZag_Conversion.md diff --git a/docs/007._Reverse_Integer.md b/docs/Leetcode Solutions/007._Reverse_Integer.md similarity index 100% rename from docs/007._Reverse_Integer.md rename to docs/Leetcode Solutions/007._Reverse_Integer.md diff --git a/docs/008._string_to_integer_(atoi).md b/docs/Leetcode Solutions/008._string_to_integer_(atoi).md similarity index 100% rename from docs/008._string_to_integer_(atoi).md rename to docs/Leetcode Solutions/008._string_to_integer_(atoi).md diff --git a/docs/009._Palindrome_Number.md b/docs/Leetcode Solutions/009._Palindrome_Number.md similarity index 100% rename from docs/009._Palindrome_Number.md rename to docs/Leetcode Solutions/009._Palindrome_Number.md diff --git a/docs/010._regular_expression_matching.md b/docs/Leetcode Solutions/010._regular_expression_matching.md similarity index 100% rename from docs/010._regular_expression_matching.md rename to docs/Leetcode Solutions/010._regular_expression_matching.md diff --git a/docs/011._container_with_most_water.md b/docs/Leetcode Solutions/011._container_with_most_water.md similarity index 100% rename from docs/011._container_with_most_water.md rename to docs/Leetcode Solutions/011._container_with_most_water.md diff --git a/docs/012._Integer_to_Roman.md b/docs/Leetcode Solutions/012._Integer_to_Roman.md similarity index 100% rename from docs/012._Integer_to_Roman.md rename to docs/Leetcode Solutions/012._Integer_to_Roman.md diff --git a/docs/013._Roman_to_Integer.md b/docs/Leetcode Solutions/013._Roman_to_Integer.md similarity index 100% rename from docs/013._Roman_to_Integer.md rename to docs/Leetcode Solutions/013._Roman_to_Integer.md diff --git a/docs/014._longest_common_prefix.md b/docs/Leetcode Solutions/014._longest_common_prefix.md similarity index 100% rename from docs/014._longest_common_prefix.md rename to docs/Leetcode Solutions/014._longest_common_prefix.md diff --git a/docs/015._3sum.md b/docs/Leetcode Solutions/015._3sum.md similarity index 100% rename from docs/015._3sum.md rename to docs/Leetcode Solutions/015._3sum.md diff --git a/docs/016._3sum_closest.md b/docs/Leetcode Solutions/016._3sum_closest.md similarity index 100% rename from docs/016._3sum_closest.md rename to docs/Leetcode Solutions/016._3sum_closest.md diff --git a/docs/017._letter_combinations_of_a_phone_number.md b/docs/Leetcode Solutions/017._letter_combinations_of_a_phone_number.md similarity index 100% rename from docs/017._letter_combinations_of_a_phone_number.md rename to docs/Leetcode Solutions/017._letter_combinations_of_a_phone_number.md diff --git a/docs/018._4sum.md b/docs/Leetcode Solutions/018._4sum.md similarity index 100% rename from docs/018._4sum.md rename to docs/Leetcode Solutions/018._4sum.md diff --git a/docs/019._remove_nth_node_from_end_of_list.md b/docs/Leetcode Solutions/019._remove_nth_node_from_end_of_list.md similarity index 100% rename from docs/019._remove_nth_node_from_end_of_list.md rename to docs/Leetcode Solutions/019._remove_nth_node_from_end_of_list.md diff --git a/docs/020._valid_parentheses.md b/docs/Leetcode Solutions/020._valid_parentheses.md similarity index 100% rename from docs/020._valid_parentheses.md rename to docs/Leetcode Solutions/020._valid_parentheses.md diff --git a/docs/021._merge_two_sorted_lists.md b/docs/Leetcode Solutions/021._merge_two_sorted_lists.md similarity index 100% rename from docs/021._merge_two_sorted_lists.md rename to docs/Leetcode Solutions/021._merge_two_sorted_lists.md diff --git a/docs/022._generate_parentheses.md b/docs/Leetcode Solutions/022._generate_parentheses.md similarity index 100% rename from docs/022._generate_parentheses.md rename to docs/Leetcode Solutions/022._generate_parentheses.md diff --git a/docs/023._merge_k_sorted_lists.md b/docs/Leetcode Solutions/023._merge_k_sorted_lists.md similarity index 100% rename from docs/023._merge_k_sorted_lists.md rename to docs/Leetcode Solutions/023._merge_k_sorted_lists.md diff --git a/docs/024._swap_nodes_in_pairs.md b/docs/Leetcode Solutions/024._swap_nodes_in_pairs.md similarity index 100% rename from docs/024._swap_nodes_in_pairs.md rename to docs/Leetcode Solutions/024._swap_nodes_in_pairs.md diff --git a/docs/026._Remove_Duplicates_from_Sorted_Array.md b/docs/Leetcode Solutions/026._Remove_Duplicates_from_Sorted_Array.md similarity index 100% rename from docs/026._Remove_Duplicates_from_Sorted_Array.md rename to docs/Leetcode Solutions/026._Remove_Duplicates_from_Sorted_Array.md diff --git a/docs/027._Remove_Element.md b/docs/Leetcode Solutions/027._Remove_Element.md similarity index 100% rename from docs/027._Remove_Element.md rename to docs/Leetcode Solutions/027._Remove_Element.md diff --git a/docs/028._implement_strstr().md b/docs/Leetcode Solutions/028._implement_strstr().md similarity index 100% rename from docs/028._implement_strstr().md rename to docs/Leetcode Solutions/028._implement_strstr().md diff --git a/docs/030._Substring_with_Concatenation_of_All_Words.md b/docs/Leetcode Solutions/030._Substring_with_Concatenation_of_All_Words.md similarity index 100% rename from docs/030._Substring_with_Concatenation_of_All_Words.md rename to docs/Leetcode Solutions/030._Substring_with_Concatenation_of_All_Words.md diff --git a/docs/031._next_permutation.md b/docs/Leetcode Solutions/031._next_permutation.md similarity index 100% rename from docs/031._next_permutation.md rename to docs/Leetcode Solutions/031._next_permutation.md diff --git a/docs/033._search_in_rotated_sorted_array.md b/docs/Leetcode Solutions/033._search_in_rotated_sorted_array.md similarity index 100% rename from docs/033._search_in_rotated_sorted_array.md rename to docs/Leetcode Solutions/033._search_in_rotated_sorted_array.md diff --git a/docs/034._Search for a Range.md b/docs/Leetcode Solutions/034._Search for a Range.md similarity index 100% rename from docs/034._Search for a Range.md rename to docs/Leetcode Solutions/034._Search for a Range.md diff --git a/docs/035._search_insert_position.md b/docs/Leetcode Solutions/035._search_insert_position.md similarity index 100% rename from docs/035._search_insert_position.md rename to docs/Leetcode Solutions/035._search_insert_position.md diff --git a/docs/038._Count_and_Say.md b/docs/Leetcode Solutions/038._Count_and_Say.md similarity index 100% rename from docs/038._Count_and_Say.md rename to docs/Leetcode Solutions/038._Count_and_Say.md diff --git a/docs/039._combination_sum.md b/docs/Leetcode Solutions/039._combination_sum.md similarity index 100% rename from docs/039._combination_sum.md rename to docs/Leetcode Solutions/039._combination_sum.md diff --git a/docs/040._combination_sum_ii.md b/docs/Leetcode Solutions/040._combination_sum_ii.md similarity index 100% rename from docs/040._combination_sum_ii.md rename to docs/Leetcode Solutions/040._combination_sum_ii.md diff --git a/docs/042._trapping_rain_water.md b/docs/Leetcode Solutions/042._trapping_rain_water.md similarity index 100% rename from docs/042._trapping_rain_water.md rename to docs/Leetcode Solutions/042._trapping_rain_water.md diff --git a/docs/043._multiply_strings.md b/docs/Leetcode Solutions/043._multiply_strings.md similarity index 100% rename from docs/043._multiply_strings.md rename to docs/Leetcode Solutions/043._multiply_strings.md diff --git a/docs/044._wildcard_matching.md b/docs/Leetcode Solutions/044._wildcard_matching.md similarity index 100% rename from docs/044._wildcard_matching.md rename to docs/Leetcode Solutions/044._wildcard_matching.md diff --git a/docs/045._Jump_Game_II.md b/docs/Leetcode Solutions/045._Jump_Game_II.md similarity index 100% rename from docs/045._Jump_Game_II.md rename to docs/Leetcode Solutions/045._Jump_Game_II.md diff --git a/docs/046._permutations.md b/docs/Leetcode Solutions/046._permutations.md similarity index 100% rename from docs/046._permutations.md rename to docs/Leetcode Solutions/046._permutations.md diff --git a/docs/047._permutations_ii.md b/docs/Leetcode Solutions/047._permutations_ii.md similarity index 100% rename from docs/047._permutations_ii.md rename to docs/Leetcode Solutions/047._permutations_ii.md diff --git a/docs/048._rotate_image.md b/docs/Leetcode Solutions/048._rotate_image.md similarity index 100% rename from docs/048._rotate_image.md rename to docs/Leetcode Solutions/048._rotate_image.md diff --git a/docs/049._group_anagrams_python.md b/docs/Leetcode Solutions/049._group_anagrams_python.md similarity index 100% rename from docs/049._group_anagrams_python.md rename to docs/Leetcode Solutions/049._group_anagrams_python.md diff --git a/docs/050._pow(x,_n).md b/docs/Leetcode Solutions/050._pow(x,_n).md similarity index 100% rename from docs/050._pow(x,_n).md rename to docs/Leetcode Solutions/050._pow(x,_n).md diff --git a/docs/051._n-queens.md b/docs/Leetcode Solutions/051._n-queens.md similarity index 100% rename from docs/051._n-queens.md rename to docs/Leetcode Solutions/051._n-queens.md diff --git a/docs/052._n-queens_ii.md b/docs/Leetcode Solutions/052._n-queens_ii.md similarity index 100% rename from docs/052._n-queens_ii.md rename to docs/Leetcode Solutions/052._n-queens_ii.md diff --git a/docs/053._maximum_subarray.md b/docs/Leetcode Solutions/053._maximum_subarray.md similarity index 100% rename from docs/053._maximum_subarray.md rename to docs/Leetcode Solutions/053._maximum_subarray.md diff --git a/docs/054._spiral_matrix.md b/docs/Leetcode Solutions/054._spiral_matrix.md similarity index 100% rename from docs/054._spiral_matrix.md rename to docs/Leetcode Solutions/054._spiral_matrix.md diff --git a/docs/055._jump_game.md b/docs/Leetcode Solutions/055._jump_game.md similarity index 100% rename from docs/055._jump_game.md rename to docs/Leetcode Solutions/055._jump_game.md diff --git a/docs/056._Merge_Intervals.md b/docs/Leetcode Solutions/056._Merge_Intervals.md similarity index 100% rename from docs/056._Merge_Intervals.md rename to docs/Leetcode Solutions/056._Merge_Intervals.md diff --git a/docs/058._length_of_last_word.md b/docs/Leetcode Solutions/058._length_of_last_word.md similarity index 100% rename from docs/058._length_of_last_word.md rename to docs/Leetcode Solutions/058._length_of_last_word.md diff --git a/docs/059._spiral_matrix_ii.md b/docs/Leetcode Solutions/059._spiral_matrix_ii.md similarity index 100% rename from docs/059._spiral_matrix_ii.md rename to docs/Leetcode Solutions/059._spiral_matrix_ii.md diff --git a/docs/060._permutation_sequence.md b/docs/Leetcode Solutions/060._permutation_sequence.md similarity index 100% rename from docs/060._permutation_sequence.md rename to docs/Leetcode Solutions/060._permutation_sequence.md diff --git a/docs/061._rotate_list.md b/docs/Leetcode Solutions/061._rotate_list.md similarity index 100% rename from docs/061._rotate_list.md rename to docs/Leetcode Solutions/061._rotate_list.md diff --git a/docs/064._minimum_path_sum.md b/docs/Leetcode Solutions/064._minimum_path_sum.md similarity index 100% rename from docs/064._minimum_path_sum.md rename to docs/Leetcode Solutions/064._minimum_path_sum.md diff --git a/docs/065.unique_paths_ii.md b/docs/Leetcode Solutions/065.unique_paths_ii.md similarity index 100% rename from docs/065.unique_paths_ii.md rename to docs/Leetcode Solutions/065.unique_paths_ii.md diff --git a/docs/066._plus_one.md b/docs/Leetcode Solutions/066._plus_one.md similarity index 100% rename from docs/066._plus_one.md rename to docs/Leetcode Solutions/066._plus_one.md diff --git a/docs/067._add_binary.md b/docs/Leetcode Solutions/067._add_binary.md similarity index 100% rename from docs/067._add_binary.md rename to docs/Leetcode Solutions/067._add_binary.md diff --git a/docs/069._sqrt(x).md b/docs/Leetcode Solutions/069._sqrt(x).md similarity index 100% rename from docs/069._sqrt(x).md rename to docs/Leetcode Solutions/069._sqrt(x).md diff --git a/docs/070. Climbing Stairs.md b/docs/Leetcode Solutions/070. Climbing Stairs.md similarity index 100% rename from docs/070. Climbing Stairs.md rename to docs/Leetcode Solutions/070. Climbing Stairs.md diff --git a/docs/072._edit_distance.md b/docs/Leetcode Solutions/072._edit_distance.md similarity index 100% rename from docs/072._edit_distance.md rename to docs/Leetcode Solutions/072._edit_distance.md diff --git a/docs/073. Set Matrix Zeroes.md b/docs/Leetcode Solutions/073. Set Matrix Zeroes.md similarity index 100% rename from docs/073. Set Matrix Zeroes.md rename to docs/Leetcode Solutions/073. Set Matrix Zeroes.md diff --git a/docs/074._search_a_2d_matrix.md b/docs/Leetcode Solutions/074._search_a_2d_matrix.md similarity index 100% rename from docs/074._search_a_2d_matrix.md rename to docs/Leetcode Solutions/074._search_a_2d_matrix.md diff --git a/docs/075._sort_colors.md b/docs/Leetcode Solutions/075._sort_colors.md similarity index 100% rename from docs/075._sort_colors.md rename to docs/Leetcode Solutions/075._sort_colors.md diff --git a/docs/076._Minimum_Window_Substring.md b/docs/Leetcode Solutions/076._Minimum_Window_Substring.md similarity index 100% rename from docs/076._Minimum_Window_Substring.md rename to docs/Leetcode Solutions/076._Minimum_Window_Substring.md diff --git a/docs/077._combinations.md b/docs/Leetcode Solutions/077._combinations.md similarity index 100% rename from docs/077._combinations.md rename to docs/Leetcode Solutions/077._combinations.md diff --git a/docs/078.Subsets .md b/docs/Leetcode Solutions/078.Subsets .md similarity index 100% rename from docs/078.Subsets .md rename to docs/Leetcode Solutions/078.Subsets .md diff --git a/docs/079._word_search.md b/docs/Leetcode Solutions/079._word_search.md similarity index 100% rename from docs/079._word_search.md rename to docs/Leetcode Solutions/079._word_search.md diff --git a/docs/082._remove_duplicates_from_sorted_list_ii.md b/docs/Leetcode Solutions/082._remove_duplicates_from_sorted_list_ii.md similarity index 100% rename from docs/082._remove_duplicates_from_sorted_list_ii.md rename to docs/Leetcode Solutions/082._remove_duplicates_from_sorted_list_ii.md diff --git a/docs/083._remove_duplicates_from_sorted_list.md b/docs/Leetcode Solutions/083._remove_duplicates_from_sorted_list.md similarity index 100% rename from docs/083._remove_duplicates_from_sorted_list.md rename to docs/Leetcode Solutions/083._remove_duplicates_from_sorted_list.md diff --git a/docs/086._partition_list.md b/docs/Leetcode Solutions/086._partition_list.md similarity index 100% rename from docs/086._partition_list.md rename to docs/Leetcode Solutions/086._partition_list.md diff --git a/docs/088._merge_sorted_array.md b/docs/Leetcode Solutions/088._merge_sorted_array.md similarity index 100% rename from docs/088._merge_sorted_array.md rename to docs/Leetcode Solutions/088._merge_sorted_array.md diff --git a/docs/089._gray_code.md b/docs/Leetcode Solutions/089._gray_code.md similarity index 100% rename from docs/089._gray_code.md rename to docs/Leetcode Solutions/089._gray_code.md diff --git a/docs/090._subsets_ii.md b/docs/Leetcode Solutions/090._subsets_ii.md similarity index 100% rename from docs/090._subsets_ii.md rename to docs/Leetcode Solutions/090._subsets_ii.md diff --git a/docs/091._decode_ways.md b/docs/Leetcode Solutions/091._decode_ways.md similarity index 100% rename from docs/091._decode_ways.md rename to docs/Leetcode Solutions/091._decode_ways.md diff --git a/docs/092._reverse_linked_list_ii.md b/docs/Leetcode Solutions/092._reverse_linked_list_ii.md similarity index 100% rename from docs/092._reverse_linked_list_ii.md rename to docs/Leetcode Solutions/092._reverse_linked_list_ii.md diff --git a/docs/093._restore_ip_addresses.md b/docs/Leetcode Solutions/093._restore_ip_addresses.md similarity index 100% rename from docs/093._restore_ip_addresses.md rename to docs/Leetcode Solutions/093._restore_ip_addresses.md diff --git a/docs/094._binary_tree_inorder_traversal.md b/docs/Leetcode Solutions/094._binary_tree_inorder_traversal.md similarity index 100% rename from docs/094._binary_tree_inorder_traversal.md rename to docs/Leetcode Solutions/094._binary_tree_inorder_traversal.md diff --git a/docs/096._unique_binary_search_trees.md b/docs/Leetcode Solutions/096._unique_binary_search_trees.md similarity index 100% rename from docs/096._unique_binary_search_trees.md rename to docs/Leetcode Solutions/096._unique_binary_search_trees.md diff --git a/docs/098._validate_binary_search_tree.md b/docs/Leetcode Solutions/098._validate_binary_search_tree.md similarity index 100% rename from docs/098._validate_binary_search_tree.md rename to docs/Leetcode Solutions/098._validate_binary_search_tree.md diff --git a/docs/100._same_tree.md b/docs/Leetcode Solutions/100._same_tree.md similarity index 100% rename from docs/100._same_tree.md rename to docs/Leetcode Solutions/100._same_tree.md diff --git a/docs/101._symmetric_tree.md b/docs/Leetcode Solutions/101._symmetric_tree.md similarity index 100% rename from docs/101._symmetric_tree.md rename to docs/Leetcode Solutions/101._symmetric_tree.md diff --git a/docs/102._binary_tree_level_order_traversal.md b/docs/Leetcode Solutions/102._binary_tree_level_order_traversal.md similarity index 100% rename from docs/102._binary_tree_level_order_traversal.md rename to docs/Leetcode Solutions/102._binary_tree_level_order_traversal.md diff --git a/docs/103._binary_tree_zigzag_level_order_traversal.md b/docs/Leetcode Solutions/103._binary_tree_zigzag_level_order_traversal.md similarity index 100% rename from docs/103._binary_tree_zigzag_level_order_traversal.md rename to docs/Leetcode Solutions/103._binary_tree_zigzag_level_order_traversal.md diff --git a/docs/104._maximum_depth_of_binary_tree.md b/docs/Leetcode Solutions/104._maximum_depth_of_binary_tree.md similarity index 100% rename from docs/104._maximum_depth_of_binary_tree.md rename to docs/Leetcode Solutions/104._maximum_depth_of_binary_tree.md diff --git a/docs/105._construct_binary_tree_from_preorder_and_inorder_traversal.md b/docs/Leetcode Solutions/105._construct_binary_tree_from_preorder_and_inorder_traversal.md similarity index 100% rename from docs/105._construct_binary_tree_from_preorder_and_inorder_traversal.md rename to docs/Leetcode Solutions/105._construct_binary_tree_from_preorder_and_inorder_traversal.md diff --git a/docs/106._construct_binary_tree_from_inorder_and_postorder_traversal.md b/docs/Leetcode Solutions/106._construct_binary_tree_from_inorder_and_postorder_traversal.md similarity index 100% rename from docs/106._construct_binary_tree_from_inorder_and_postorder_traversal.md rename to docs/Leetcode Solutions/106._construct_binary_tree_from_inorder_and_postorder_traversal.md diff --git a/docs/107._binary_tree_level_order_traversal_ii.md b/docs/Leetcode Solutions/107._binary_tree_level_order_traversal_ii.md similarity index 100% rename from docs/107._binary_tree_level_order_traversal_ii.md rename to docs/Leetcode Solutions/107._binary_tree_level_order_traversal_ii.md diff --git a/docs/108._convert_sorted_array_to_binary_search_tree.md b/docs/Leetcode Solutions/108._convert_sorted_array_to_binary_search_tree.md similarity index 100% rename from docs/108._convert_sorted_array_to_binary_search_tree.md rename to docs/Leetcode Solutions/108._convert_sorted_array_to_binary_search_tree.md diff --git a/docs/109._convert_sorted_list_to_binary_search_tree.md b/docs/Leetcode Solutions/109._convert_sorted_list_to_binary_search_tree.md similarity index 100% rename from docs/109._convert_sorted_list_to_binary_search_tree.md rename to docs/Leetcode Solutions/109._convert_sorted_list_to_binary_search_tree.md diff --git a/docs/110._balanced_binary_tree.md b/docs/Leetcode Solutions/110._balanced_binary_tree.md similarity index 100% rename from docs/110._balanced_binary_tree.md rename to docs/Leetcode Solutions/110._balanced_binary_tree.md diff --git a/docs/111._minimum_depth_of_binary_tree.md b/docs/Leetcode Solutions/111._minimum_depth_of_binary_tree.md similarity index 100% rename from docs/111._minimum_depth_of_binary_tree.md rename to docs/Leetcode Solutions/111._minimum_depth_of_binary_tree.md diff --git a/docs/112._path_sum.md b/docs/Leetcode Solutions/112._path_sum.md similarity index 100% rename from docs/112._path_sum.md rename to docs/Leetcode Solutions/112._path_sum.md diff --git a/docs/113._path_sum_ii.md b/docs/Leetcode Solutions/113._path_sum_ii.md similarity index 100% rename from docs/113._path_sum_ii.md rename to docs/Leetcode Solutions/113._path_sum_ii.md diff --git a/docs/114._flatten_binary_tree_to_linked_list.md b/docs/Leetcode Solutions/114._flatten_binary_tree_to_linked_list.md similarity index 100% rename from docs/114._flatten_binary_tree_to_linked_list.md rename to docs/Leetcode Solutions/114._flatten_binary_tree_to_linked_list.md diff --git a/docs/116._populating_next_right_pointers_in_each_node.md b/docs/Leetcode Solutions/116._populating_next_right_pointers_in_each_node.md similarity index 100% rename from docs/116._populating_next_right_pointers_in_each_node.md rename to docs/Leetcode Solutions/116._populating_next_right_pointers_in_each_node.md diff --git a/docs/118._pascal's_triangle.md b/docs/Leetcode Solutions/118._pascal's_triangle.md similarity index 100% rename from docs/118._pascal's_triangle.md rename to docs/Leetcode Solutions/118._pascal's_triangle.md diff --git a/docs/119. Pascal's Triangle II.md b/docs/Leetcode Solutions/119. Pascal's Triangle II.md similarity index 100% rename from docs/119. Pascal's Triangle II.md rename to docs/Leetcode Solutions/119. Pascal's Triangle II.md diff --git a/docs/120. Triangle.md b/docs/Leetcode Solutions/120. Triangle.md similarity index 100% rename from docs/120. Triangle.md rename to docs/Leetcode Solutions/120. Triangle.md diff --git a/docs/121._Best_Time_to_Buy_and_Sell_Stock.md b/docs/Leetcode Solutions/121._Best_Time_to_Buy_and_Sell_Stock.md similarity index 100% rename from docs/121._Best_Time_to_Buy_and_Sell_Stock.md rename to docs/Leetcode Solutions/121._Best_Time_to_Buy_and_Sell_Stock.md diff --git a/docs/125._valid_palindrome.md b/docs/Leetcode Solutions/125._valid_palindrome.md similarity index 100% rename from docs/125._valid_palindrome.md rename to docs/Leetcode Solutions/125._valid_palindrome.md diff --git a/docs/126. Word Ladder II.md b/docs/Leetcode Solutions/126. Word Ladder II.md similarity index 100% rename from docs/126. Word Ladder II.md rename to docs/Leetcode Solutions/126. Word Ladder II.md diff --git a/docs/127._word_ladder.md b/docs/Leetcode Solutions/127._word_ladder.md similarity index 100% rename from docs/127._word_ladder.md rename to docs/Leetcode Solutions/127._word_ladder.md diff --git a/docs/128._Longest_Consecutive_Sequence.md b/docs/Leetcode Solutions/128._Longest_Consecutive_Sequence.md similarity index 100% rename from docs/128._Longest_Consecutive_Sequence.md rename to docs/Leetcode Solutions/128._Longest_Consecutive_Sequence.md diff --git a/docs/129._sum_root_to_leaf_numbers.md b/docs/Leetcode Solutions/129._sum_root_to_leaf_numbers.md similarity index 100% rename from docs/129._sum_root_to_leaf_numbers.md rename to docs/Leetcode Solutions/129._sum_root_to_leaf_numbers.md diff --git a/docs/130._surrounded_regions.md b/docs/Leetcode Solutions/130._surrounded_regions.md similarity index 100% rename from docs/130._surrounded_regions.md rename to docs/Leetcode Solutions/130._surrounded_regions.md diff --git a/docs/131._palindrome_partitioning.md b/docs/Leetcode Solutions/131._palindrome_partitioning.md similarity index 100% rename from docs/131._palindrome_partitioning.md rename to docs/Leetcode Solutions/131._palindrome_partitioning.md diff --git a/docs/133._clone_graph.md b/docs/Leetcode Solutions/133._clone_graph.md similarity index 100% rename from docs/133._clone_graph.md rename to docs/Leetcode Solutions/133._clone_graph.md diff --git a/docs/136._single_number.md b/docs/Leetcode Solutions/136._single_number.md similarity index 100% rename from docs/136._single_number.md rename to docs/Leetcode Solutions/136._single_number.md diff --git a/docs/139._word_break.md b/docs/Leetcode Solutions/139._word_break.md similarity index 100% rename from docs/139._word_break.md rename to docs/Leetcode Solutions/139._word_break.md diff --git a/docs/140._word_break_ii.md b/docs/Leetcode Solutions/140._word_break_ii.md similarity index 100% rename from docs/140._word_break_ii.md rename to docs/Leetcode Solutions/140._word_break_ii.md diff --git a/docs/141._linked_list_cycle.md b/docs/Leetcode Solutions/141._linked_list_cycle.md similarity index 100% rename from docs/141._linked_list_cycle.md rename to docs/Leetcode Solutions/141._linked_list_cycle.md diff --git a/docs/142_Linked_List_Cycle_II.md b/docs/Leetcode Solutions/142_Linked_List_Cycle_II.md similarity index 100% rename from docs/142_Linked_List_Cycle_II.md rename to docs/Leetcode Solutions/142_Linked_List_Cycle_II.md diff --git a/docs/143._reorder_list.md b/docs/Leetcode Solutions/143._reorder_list.md similarity index 100% rename from docs/143._reorder_list.md rename to docs/Leetcode Solutions/143._reorder_list.md diff --git a/docs/144._binary_tree_preorder_traversal.md b/docs/Leetcode Solutions/144._binary_tree_preorder_traversal.md similarity index 100% rename from docs/144._binary_tree_preorder_traversal.md rename to docs/Leetcode Solutions/144._binary_tree_preorder_traversal.md diff --git a/docs/145._binary_tree_postorder_traversal.md b/docs/Leetcode Solutions/145._binary_tree_postorder_traversal.md similarity index 100% rename from docs/145._binary_tree_postorder_traversal.md rename to docs/Leetcode Solutions/145._binary_tree_postorder_traversal.md diff --git a/docs/147._insertion_sort_list.md b/docs/Leetcode Solutions/147._insertion_sort_list.md similarity index 100% rename from docs/147._insertion_sort_list.md rename to docs/Leetcode Solutions/147._insertion_sort_list.md diff --git a/docs/148._sort_list.md b/docs/Leetcode Solutions/148._sort_list.md similarity index 100% rename from docs/148._sort_list.md rename to docs/Leetcode Solutions/148._sort_list.md diff --git a/docs/150._evaluate_reverse_polish_notation.md b/docs/Leetcode Solutions/150._evaluate_reverse_polish_notation.md similarity index 100% rename from docs/150._evaluate_reverse_polish_notation.md rename to docs/Leetcode Solutions/150._evaluate_reverse_polish_notation.md diff --git a/docs/151._reverse_words_in_a_string.md b/docs/Leetcode Solutions/151._reverse_words_in_a_string.md similarity index 100% rename from docs/151._reverse_words_in_a_string.md rename to docs/Leetcode Solutions/151._reverse_words_in_a_string.md diff --git a/docs/152._maximum_product_subarray.md b/docs/Leetcode Solutions/152._maximum_product_subarray.md similarity index 100% rename from docs/152._maximum_product_subarray.md rename to docs/Leetcode Solutions/152._maximum_product_subarray.md diff --git a/docs/153._find_minimum_in_rotated_sorted_array.md b/docs/Leetcode Solutions/153._find_minimum_in_rotated_sorted_array.md similarity index 100% rename from docs/153._find_minimum_in_rotated_sorted_array.md rename to docs/Leetcode Solutions/153._find_minimum_in_rotated_sorted_array.md diff --git a/docs/155._min_stack.md b/docs/Leetcode Solutions/155._min_stack.md similarity index 100% rename from docs/155._min_stack.md rename to docs/Leetcode Solutions/155._min_stack.md diff --git a/docs/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md b/docs/Leetcode Solutions/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md similarity index 100% rename from docs/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md rename to docs/Leetcode Solutions/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md diff --git a/docs/160._intersection_of_two_linked_lists.md b/docs/Leetcode Solutions/160._intersection_of_two_linked_lists.md similarity index 100% rename from docs/160._intersection_of_two_linked_lists.md rename to docs/Leetcode Solutions/160._intersection_of_two_linked_lists.md diff --git a/docs/162._find_peak_element.md b/docs/Leetcode Solutions/162._find_peak_element.md similarity index 100% rename from docs/162._find_peak_element.md rename to docs/Leetcode Solutions/162._find_peak_element.md diff --git a/docs/165._compare_version_numbers.md b/docs/Leetcode Solutions/165._compare_version_numbers.md similarity index 100% rename from docs/165._compare_version_numbers.md rename to docs/Leetcode Solutions/165._compare_version_numbers.md diff --git a/docs/166._Fraction_to_Recurring_Decimal.md b/docs/Leetcode Solutions/166._Fraction_to_Recurring_Decimal.md similarity index 100% rename from docs/166._Fraction_to_Recurring_Decimal.md rename to docs/Leetcode Solutions/166._Fraction_to_Recurring_Decimal.md diff --git a/docs/167._two_sum_ii_-_input_array_is_sorted.md b/docs/Leetcode Solutions/167._two_sum_ii_-_input_array_is_sorted.md similarity index 100% rename from docs/167._two_sum_ii_-_input_array_is_sorted.md rename to docs/Leetcode Solutions/167._two_sum_ii_-_input_array_is_sorted.md diff --git a/docs/168._excel_sheet_column_title.md b/docs/Leetcode Solutions/168._excel_sheet_column_title.md similarity index 100% rename from docs/168._excel_sheet_column_title.md rename to docs/Leetcode Solutions/168._excel_sheet_column_title.md diff --git a/docs/169._majority_element.md b/docs/Leetcode Solutions/169._majority_element.md similarity index 100% rename from docs/169._majority_element.md rename to docs/Leetcode Solutions/169._majority_element.md diff --git a/docs/171._excel_sheet_column_number.md b/docs/Leetcode Solutions/171._excel_sheet_column_number.md similarity index 100% rename from docs/171._excel_sheet_column_number.md rename to docs/Leetcode Solutions/171._excel_sheet_column_number.md diff --git a/docs/173._binary_search_tree_iterator.md b/docs/Leetcode Solutions/173._binary_search_tree_iterator.md similarity index 100% rename from docs/173._binary_search_tree_iterator.md rename to docs/Leetcode Solutions/173._binary_search_tree_iterator.md diff --git a/docs/189._rotate_array.md b/docs/Leetcode Solutions/189._rotate_array.md similarity index 100% rename from docs/189._rotate_array.md rename to docs/Leetcode Solutions/189._rotate_array.md diff --git a/docs/191._number_of_1_bits.md b/docs/Leetcode Solutions/191._number_of_1_bits.md similarity index 100% rename from docs/191._number_of_1_bits.md rename to docs/Leetcode Solutions/191._number_of_1_bits.md diff --git a/docs/198._house_robber.md b/docs/Leetcode Solutions/198._house_robber.md similarity index 100% rename from docs/198._house_robber.md rename to docs/Leetcode Solutions/198._house_robber.md diff --git a/docs/199._binary_tree_right_side_view.md b/docs/Leetcode Solutions/199._binary_tree_right_side_view.md similarity index 100% rename from docs/199._binary_tree_right_side_view.md rename to docs/Leetcode Solutions/199._binary_tree_right_side_view.md diff --git a/docs/200._number_of_islands.md b/docs/Leetcode Solutions/200._number_of_islands.md similarity index 100% rename from docs/200._number_of_islands.md rename to docs/Leetcode Solutions/200._number_of_islands.md diff --git a/docs/203._remove_linked_list_elements.md b/docs/Leetcode Solutions/203._remove_linked_list_elements.md similarity index 100% rename from docs/203._remove_linked_list_elements.md rename to docs/Leetcode Solutions/203._remove_linked_list_elements.md diff --git a/docs/204._count_primes.md b/docs/Leetcode Solutions/204._count_primes.md similarity index 100% rename from docs/204._count_primes.md rename to docs/Leetcode Solutions/204._count_primes.md diff --git a/docs/205._isomorphic_strings.md b/docs/Leetcode Solutions/205._isomorphic_strings.md similarity index 100% rename from docs/205._isomorphic_strings.md rename to docs/Leetcode Solutions/205._isomorphic_strings.md diff --git a/docs/206._reverse_linked_list.md b/docs/Leetcode Solutions/206._reverse_linked_list.md similarity index 100% rename from docs/206._reverse_linked_list.md rename to docs/Leetcode Solutions/206._reverse_linked_list.md diff --git a/docs/207._course_schedule.md b/docs/Leetcode Solutions/207._course_schedule.md similarity index 100% rename from docs/207._course_schedule.md rename to docs/Leetcode Solutions/207._course_schedule.md diff --git a/docs/208._implement_trie_(prefix_tree).md b/docs/Leetcode Solutions/208._implement_trie_(prefix_tree).md similarity index 100% rename from docs/208._implement_trie_(prefix_tree).md rename to docs/Leetcode Solutions/208._implement_trie_(prefix_tree).md diff --git a/docs/210._course_schedule_ii.md b/docs/Leetcode Solutions/210._course_schedule_ii.md similarity index 100% rename from docs/210._course_schedule_ii.md rename to docs/Leetcode Solutions/210._course_schedule_ii.md diff --git a/docs/211. Add and Search Word - Data structure design.md b/docs/Leetcode Solutions/211. Add and Search Word - Data structure design.md similarity index 100% rename from docs/211. Add and Search Word - Data structure design.md rename to docs/Leetcode Solutions/211. Add and Search Word - Data structure design.md diff --git a/docs/213._house_robber_ii.md b/docs/Leetcode Solutions/213._house_robber_ii.md similarity index 100% rename from docs/213._house_robber_ii.md rename to docs/Leetcode Solutions/213._house_robber_ii.md diff --git a/docs/216._combination_sum_iii.md b/docs/Leetcode Solutions/216._combination_sum_iii.md similarity index 100% rename from docs/216._combination_sum_iii.md rename to docs/Leetcode Solutions/216._combination_sum_iii.md diff --git a/docs/217._contains_duplicate.md b/docs/Leetcode Solutions/217._contains_duplicate.md similarity index 100% rename from docs/217._contains_duplicate.md rename to docs/Leetcode Solutions/217._contains_duplicate.md diff --git a/docs/218._The _Skyline_Problem .md b/docs/Leetcode Solutions/218._The _Skyline_Problem .md similarity index 100% rename from docs/218._The _Skyline_Problem .md rename to docs/Leetcode Solutions/218._The _Skyline_Problem .md diff --git a/docs/219._contains_duplicate_ii.md b/docs/Leetcode Solutions/219._contains_duplicate_ii.md similarity index 100% rename from docs/219._contains_duplicate_ii.md rename to docs/Leetcode Solutions/219._contains_duplicate_ii.md diff --git a/docs/221._maximal_square.md b/docs/Leetcode Solutions/221._maximal_square.md similarity index 100% rename from docs/221._maximal_square.md rename to docs/Leetcode Solutions/221._maximal_square.md diff --git a/docs/222._count_complete_tree_nodes.md b/docs/Leetcode Solutions/222._count_complete_tree_nodes.md similarity index 100% rename from docs/222._count_complete_tree_nodes.md rename to docs/Leetcode Solutions/222._count_complete_tree_nodes.md diff --git a/docs/223._rectangle_area.md b/docs/Leetcode Solutions/223._rectangle_area.md similarity index 100% rename from docs/223._rectangle_area.md rename to docs/Leetcode Solutions/223._rectangle_area.md diff --git a/docs/224. Basic Calculator .md b/docs/Leetcode Solutions/224. Basic Calculator .md similarity index 100% rename from docs/224. Basic Calculator .md rename to docs/Leetcode Solutions/224. Basic Calculator .md diff --git a/docs/225._implement_stack_using_queues.md b/docs/Leetcode Solutions/225._implement_stack_using_queues.md similarity index 100% rename from docs/225._implement_stack_using_queues.md rename to docs/Leetcode Solutions/225._implement_stack_using_queues.md diff --git a/docs/226._invert_binary_tree.md b/docs/Leetcode Solutions/226._invert_binary_tree.md similarity index 100% rename from docs/226._invert_binary_tree.md rename to docs/Leetcode Solutions/226._invert_binary_tree.md diff --git a/docs/227._basic_calculator_ii.md b/docs/Leetcode Solutions/227._basic_calculator_ii.md similarity index 100% rename from docs/227._basic_calculator_ii.md rename to docs/Leetcode Solutions/227._basic_calculator_ii.md diff --git a/docs/228._summary_ranges.md b/docs/Leetcode Solutions/228._summary_ranges.md similarity index 100% rename from docs/228._summary_ranges.md rename to docs/Leetcode Solutions/228._summary_ranges.md diff --git a/docs/229._majority_element_ii.md b/docs/Leetcode Solutions/229._majority_element_ii.md similarity index 100% rename from docs/229._majority_element_ii.md rename to docs/Leetcode Solutions/229._majority_element_ii.md diff --git a/docs/230._kth_smallest_element_in_a_bst.md b/docs/Leetcode Solutions/230._kth_smallest_element_in_a_bst.md similarity index 100% rename from docs/230._kth_smallest_element_in_a_bst.md rename to docs/Leetcode Solutions/230._kth_smallest_element_in_a_bst.md diff --git a/docs/231. _Power_of_Two.md b/docs/Leetcode Solutions/231. _Power_of_Two.md similarity index 100% rename from docs/231. _Power_of_Two.md rename to docs/Leetcode Solutions/231. _Power_of_Two.md diff --git a/docs/232._implement_queue_using_stacks.md b/docs/Leetcode Solutions/232._implement_queue_using_stacks.md similarity index 100% rename from docs/232._implement_queue_using_stacks.md rename to docs/Leetcode Solutions/232._implement_queue_using_stacks.md diff --git a/docs/234._palindrome_linked_list.md b/docs/Leetcode Solutions/234._palindrome_linked_list.md similarity index 100% rename from docs/234._palindrome_linked_list.md rename to docs/Leetcode Solutions/234._palindrome_linked_list.md diff --git a/docs/235._lowest_common_ancestor_of_a_binary_search_tree.md b/docs/Leetcode Solutions/235._lowest_common_ancestor_of_a_binary_search_tree.md similarity index 100% rename from docs/235._lowest_common_ancestor_of_a_binary_search_tree.md rename to docs/Leetcode Solutions/235._lowest_common_ancestor_of_a_binary_search_tree.md diff --git a/docs/236._lowest_common_ancestor_of_a_binary_tree.md b/docs/Leetcode Solutions/236._lowest_common_ancestor_of_a_binary_tree.md similarity index 100% rename from docs/236._lowest_common_ancestor_of_a_binary_tree.md rename to docs/Leetcode Solutions/236._lowest_common_ancestor_of_a_binary_tree.md diff --git a/docs/237._delete_node_in_a_linked_list.md b/docs/Leetcode Solutions/237._delete_node_in_a_linked_list.md similarity index 100% rename from docs/237._delete_node_in_a_linked_list.md rename to docs/Leetcode Solutions/237._delete_node_in_a_linked_list.md diff --git a/docs/238._product_of_array_except_self.md b/docs/Leetcode Solutions/238._product_of_array_except_self.md similarity index 100% rename from docs/238._product_of_array_except_self.md rename to docs/Leetcode Solutions/238._product_of_array_except_self.md diff --git a/docs/240._search_a_2d_matrix_ii.md b/docs/Leetcode Solutions/240._search_a_2d_matrix_ii.md similarity index 100% rename from docs/240._search_a_2d_matrix_ii.md rename to docs/Leetcode Solutions/240._search_a_2d_matrix_ii.md diff --git a/docs/242._valid_anagram.md b/docs/Leetcode Solutions/242._valid_anagram.md similarity index 100% rename from docs/242._valid_anagram.md rename to docs/Leetcode Solutions/242._valid_anagram.md diff --git a/docs/252. Meeting Rooms.md b/docs/Leetcode Solutions/252. Meeting Rooms.md similarity index 100% rename from docs/252. Meeting Rooms.md rename to docs/Leetcode Solutions/252. Meeting Rooms.md diff --git a/docs/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md b/docs/Leetcode Solutions/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md similarity index 100% rename from docs/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md rename to docs/Leetcode Solutions/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md diff --git a/docs/256. Paint House.md b/docs/Leetcode Solutions/256. Paint House.md similarity index 100% rename from docs/256. Paint House.md rename to docs/Leetcode Solutions/256. Paint House.md diff --git a/docs/257._binary_tree_paths.md b/docs/Leetcode Solutions/257._binary_tree_paths.md similarity index 100% rename from docs/257._binary_tree_paths.md rename to docs/Leetcode Solutions/257._binary_tree_paths.md diff --git a/docs/258_ Add_Digits.md b/docs/Leetcode Solutions/258_ Add_Digits.md similarity index 100% rename from docs/258_ Add_Digits.md rename to docs/Leetcode Solutions/258_ Add_Digits.md diff --git a/docs/261. Graph Valid Tree.md b/docs/Leetcode Solutions/261. Graph Valid Tree.md similarity index 100% rename from docs/261. Graph Valid Tree.md rename to docs/Leetcode Solutions/261. Graph Valid Tree.md diff --git a/docs/263._ugly_number.md b/docs/Leetcode Solutions/263._ugly_number.md similarity index 100% rename from docs/263._ugly_number.md rename to docs/Leetcode Solutions/263._ugly_number.md diff --git a/docs/264._ugly_number_ii.md b/docs/Leetcode Solutions/264._ugly_number_ii.md similarity index 100% rename from docs/264._ugly_number_ii.md rename to docs/Leetcode Solutions/264._ugly_number_ii.md diff --git a/docs/265. Paint House II.md b/docs/Leetcode Solutions/265. Paint House II.md similarity index 100% rename from docs/265. Paint House II.md rename to docs/Leetcode Solutions/265. Paint House II.md diff --git a/docs/266. Palindrome Permutation.md b/docs/Leetcode Solutions/266. Palindrome Permutation.md similarity index 100% rename from docs/266. Palindrome Permutation.md rename to docs/Leetcode Solutions/266. Palindrome Permutation.md diff --git a/docs/267. Palindrome Permutation II.md b/docs/Leetcode Solutions/267. Palindrome Permutation II.md similarity index 100% rename from docs/267. Palindrome Permutation II.md rename to docs/Leetcode Solutions/267. Palindrome Permutation II.md diff --git a/docs/268._missing_number.md b/docs/Leetcode Solutions/268._missing_number.md similarity index 100% rename from docs/268._missing_number.md rename to docs/Leetcode Solutions/268._missing_number.md diff --git a/docs/270. Closest Binary Search Tree Value.md b/docs/Leetcode Solutions/270. Closest Binary Search Tree Value.md similarity index 100% rename from docs/270. Closest Binary Search Tree Value.md rename to docs/Leetcode Solutions/270. Closest Binary Search Tree Value.md diff --git a/docs/276. Paint Fence.md b/docs/Leetcode Solutions/276. Paint Fence.md similarity index 100% rename from docs/276. Paint Fence.md rename to docs/Leetcode Solutions/276. Paint Fence.md diff --git a/docs/277. Find the Celebrity.md b/docs/Leetcode Solutions/277. Find the Celebrity.md similarity index 100% rename from docs/277. Find the Celebrity.md rename to docs/Leetcode Solutions/277. Find the Celebrity.md diff --git a/docs/278._First_Bad _Version.md b/docs/Leetcode Solutions/278._First_Bad _Version.md similarity index 100% rename from docs/278._First_Bad _Version.md rename to docs/Leetcode Solutions/278._First_Bad _Version.md diff --git a/docs/279._perfect_squares.md b/docs/Leetcode Solutions/279._perfect_squares.md similarity index 100% rename from docs/279._perfect_squares.md rename to docs/Leetcode Solutions/279._perfect_squares.md diff --git a/docs/280._Wiggle_Sort.md b/docs/Leetcode Solutions/280._Wiggle_Sort.md similarity index 100% rename from docs/280._Wiggle_Sort.md rename to docs/Leetcode Solutions/280._Wiggle_Sort.md diff --git a/docs/283._move_zeroes.md b/docs/Leetcode Solutions/283._move_zeroes.md similarity index 100% rename from docs/283._move_zeroes.md rename to docs/Leetcode Solutions/283._move_zeroes.md diff --git a/docs/285._inorder_successor_in_bst.md b/docs/Leetcode Solutions/285._inorder_successor_in_bst.md similarity index 100% rename from docs/285._inorder_successor_in_bst.md rename to docs/Leetcode Solutions/285._inorder_successor_in_bst.md diff --git a/docs/286. Walls and Gates.md b/docs/Leetcode Solutions/286. Walls and Gates.md similarity index 100% rename from docs/286. Walls and Gates.md rename to docs/Leetcode Solutions/286. Walls and Gates.md diff --git a/docs/289._game_of_life.md b/docs/Leetcode Solutions/289._game_of_life.md similarity index 100% rename from docs/289._game_of_life.md rename to docs/Leetcode Solutions/289._game_of_life.md diff --git a/docs/290._word_pattern.md b/docs/Leetcode Solutions/290._word_pattern.md similarity index 100% rename from docs/290._word_pattern.md rename to docs/Leetcode Solutions/290._word_pattern.md diff --git a/docs/292._nim_game.md b/docs/Leetcode Solutions/292._nim_game.md similarity index 100% rename from docs/292._nim_game.md rename to docs/Leetcode Solutions/292._nim_game.md diff --git a/docs/296. Best Meeting Point.md b/docs/Leetcode Solutions/296. Best Meeting Point.md similarity index 100% rename from docs/296. Best Meeting Point.md rename to docs/Leetcode Solutions/296. Best Meeting Point.md diff --git a/docs/298. Binary Tree Longest Consecutive Sequence.md b/docs/Leetcode Solutions/298. Binary Tree Longest Consecutive Sequence.md similarity index 100% rename from docs/298. Binary Tree Longest Consecutive Sequence.md rename to docs/Leetcode Solutions/298. Binary Tree Longest Consecutive Sequence.md diff --git a/docs/299._bulls_and_cows.md b/docs/Leetcode Solutions/299._bulls_and_cows.md similarity index 100% rename from docs/299._bulls_and_cows.md rename to docs/Leetcode Solutions/299._bulls_and_cows.md diff --git a/docs/300._longest_increasing_subsequence.md b/docs/Leetcode Solutions/300._longest_increasing_subsequence.md similarity index 100% rename from docs/300._longest_increasing_subsequence.md rename to docs/Leetcode Solutions/300._longest_increasing_subsequence.md diff --git a/docs/303._range_sum_query_-_immutable.md b/docs/Leetcode Solutions/303._range_sum_query_-_immutable.md similarity index 100% rename from docs/303._range_sum_query_-_immutable.md rename to docs/Leetcode Solutions/303._range_sum_query_-_immutable.md diff --git a/docs/316._Remove_Duplicate_Letters.md b/docs/Leetcode Solutions/316._Remove_Duplicate_Letters.md similarity index 100% rename from docs/316._Remove_Duplicate_Letters.md rename to docs/Leetcode Solutions/316._Remove_Duplicate_Letters.md diff --git a/docs/319._Bulb_Switcher.md b/docs/Leetcode Solutions/319._Bulb_Switcher.md similarity index 100% rename from docs/319._Bulb_Switcher.md rename to docs/Leetcode Solutions/319._Bulb_Switcher.md diff --git a/docs/322. Coin Change.md b/docs/Leetcode Solutions/322. Coin Change.md similarity index 100% rename from docs/322. Coin Change.md rename to docs/Leetcode Solutions/322. Coin Change.md diff --git a/docs/323. Number of Connected Components in an Undirected Graph.md b/docs/Leetcode Solutions/323. Number of Connected Components in an Undirected Graph.md similarity index 100% rename from docs/323. Number of Connected Components in an Undirected Graph.md rename to docs/Leetcode Solutions/323. Number of Connected Components in an Undirected Graph.md diff --git a/docs/324._Wiggle_Sort_II.md b/docs/Leetcode Solutions/324._Wiggle_Sort_II.md similarity index 100% rename from docs/324._Wiggle_Sort_II.md rename to docs/Leetcode Solutions/324._Wiggle_Sort_II.md diff --git a/docs/326._power_of_three.md b/docs/Leetcode Solutions/326._power_of_three.md similarity index 100% rename from docs/326._power_of_three.md rename to docs/Leetcode Solutions/326._power_of_three.md diff --git a/docs/328._odd_even_linked_list.md b/docs/Leetcode Solutions/328._odd_even_linked_list.md similarity index 100% rename from docs/328._odd_even_linked_list.md rename to docs/Leetcode Solutions/328._odd_even_linked_list.md diff --git a/docs/334._increasing_triplet_subsequence.md b/docs/Leetcode Solutions/334._increasing_triplet_subsequence.md similarity index 100% rename from docs/334._increasing_triplet_subsequence.md rename to docs/Leetcode Solutions/334._increasing_triplet_subsequence.md diff --git a/docs/337._house_robber_iii.md b/docs/Leetcode Solutions/337._house_robber_iii.md similarity index 100% rename from docs/337._house_robber_iii.md rename to docs/Leetcode Solutions/337._house_robber_iii.md diff --git a/docs/338. Counting Bits.md b/docs/Leetcode Solutions/338. Counting Bits.md similarity index 100% rename from docs/338. Counting Bits.md rename to docs/Leetcode Solutions/338. Counting Bits.md diff --git a/docs/339. Nested List Weight Sum.md b/docs/Leetcode Solutions/339. Nested List Weight Sum.md similarity index 100% rename from docs/339. Nested List Weight Sum.md rename to docs/Leetcode Solutions/339. Nested List Weight Sum.md diff --git a/docs/341._Flatten_Nested_List_Iterator.md b/docs/Leetcode Solutions/341._Flatten_Nested_List_Iterator.md similarity index 100% rename from docs/341._Flatten_Nested_List_Iterator.md rename to docs/Leetcode Solutions/341._Flatten_Nested_List_Iterator.md diff --git a/docs/342._Power_of_Four.md b/docs/Leetcode Solutions/342._Power_of_Four.md similarity index 100% rename from docs/342._Power_of_Four.md rename to docs/Leetcode Solutions/342._Power_of_Four.md diff --git a/docs/344._reverse_string.md b/docs/Leetcode Solutions/344._reverse_string.md similarity index 100% rename from docs/344._reverse_string.md rename to docs/Leetcode Solutions/344._reverse_string.md diff --git a/docs/345._Reverse_Vowels_of_a_String.md b/docs/Leetcode Solutions/345._Reverse_Vowels_of_a_String.md similarity index 100% rename from docs/345._Reverse_Vowels_of_a_String.md rename to docs/Leetcode Solutions/345._Reverse_Vowels_of_a_String.md diff --git a/docs/349._intersection_of_two_arrays.md b/docs/Leetcode Solutions/349._intersection_of_two_arrays.md similarity index 100% rename from docs/349._intersection_of_two_arrays.md rename to docs/Leetcode Solutions/349._intersection_of_two_arrays.md diff --git a/docs/350._intersection_of_two_arrays_ii.md b/docs/Leetcode Solutions/350._intersection_of_two_arrays_ii.md similarity index 100% rename from docs/350._intersection_of_two_arrays_ii.md rename to docs/Leetcode Solutions/350._intersection_of_two_arrays_ii.md diff --git a/docs/353. Design Snake Game.md b/docs/Leetcode Solutions/353. Design Snake Game.md similarity index 100% rename from docs/353. Design Snake Game.md rename to docs/Leetcode Solutions/353. Design Snake Game.md diff --git a/docs/364. Nested List Weight Sum II.md b/docs/Leetcode Solutions/364. Nested List Weight Sum II.md similarity index 100% rename from docs/364. Nested List Weight Sum II.md rename to docs/Leetcode Solutions/364. Nested List Weight Sum II.md diff --git a/docs/366. Find Leaves of Binary Tree.md b/docs/Leetcode Solutions/366. Find Leaves of Binary Tree.md similarity index 100% rename from docs/366. Find Leaves of Binary Tree.md rename to docs/Leetcode Solutions/366. Find Leaves of Binary Tree.md diff --git a/docs/367._valid_perfect_square.md b/docs/Leetcode Solutions/367._valid_perfect_square.md similarity index 100% rename from docs/367._valid_perfect_square.md rename to docs/Leetcode Solutions/367._valid_perfect_square.md diff --git a/docs/369.Plus One Linked List.md b/docs/Leetcode Solutions/369.Plus One Linked List.md similarity index 100% rename from docs/369.Plus One Linked List.md rename to docs/Leetcode Solutions/369.Plus One Linked List.md diff --git a/docs/371._sum_of_two_integers.md b/docs/Leetcode Solutions/371._sum_of_two_integers.md similarity index 100% rename from docs/371._sum_of_two_integers.md rename to docs/Leetcode Solutions/371._sum_of_two_integers.md diff --git a/docs/374._Guess_Number_Higher_or_Lower.md b/docs/Leetcode Solutions/374._Guess_Number_Higher_or_Lower.md similarity index 100% rename from docs/374._Guess_Number_Higher_or_Lower.md rename to docs/Leetcode Solutions/374._Guess_Number_Higher_or_Lower.md diff --git a/docs/377._combination_sum_iv.md b/docs/Leetcode Solutions/377._combination_sum_iv.md similarity index 100% rename from docs/377._combination_sum_iv.md rename to docs/Leetcode Solutions/377._combination_sum_iv.md diff --git a/docs/378._kth_smallest_element_in_a_sorted_matrix.md b/docs/Leetcode Solutions/378._kth_smallest_element_in_a_sorted_matrix.md similarity index 100% rename from docs/378._kth_smallest_element_in_a_sorted_matrix.md rename to docs/Leetcode Solutions/378._kth_smallest_element_in_a_sorted_matrix.md diff --git a/docs/380. Insert Delete GetRandom O(1).md b/docs/Leetcode Solutions/380. Insert Delete GetRandom O(1).md similarity index 100% rename from docs/380. Insert Delete GetRandom O(1).md rename to docs/Leetcode Solutions/380. Insert Delete GetRandom O(1).md diff --git a/docs/381. Insert Delete GetRandom O(1) - Duplicates allowed.md b/docs/Leetcode Solutions/381. Insert Delete GetRandom O(1) - Duplicates allowed.md similarity index 100% rename from docs/381. Insert Delete GetRandom O(1) - Duplicates allowed.md rename to docs/Leetcode Solutions/381. Insert Delete GetRandom O(1) - Duplicates allowed.md diff --git a/docs/382._linked_list_random_node.md b/docs/Leetcode Solutions/382._linked_list_random_node.md similarity index 100% rename from docs/382._linked_list_random_node.md rename to docs/Leetcode Solutions/382._linked_list_random_node.md diff --git a/docs/383._ransom_note.md b/docs/Leetcode Solutions/383._ransom_note.md similarity index 100% rename from docs/383._ransom_note.md rename to docs/Leetcode Solutions/383._ransom_note.md diff --git a/docs/384. Shuffle an Array.md b/docs/Leetcode Solutions/384. Shuffle an Array.md similarity index 100% rename from docs/384. Shuffle an Array.md rename to docs/Leetcode Solutions/384. Shuffle an Array.md diff --git a/docs/387._first_unique_character_in_a_string.md b/docs/Leetcode Solutions/387._first_unique_character_in_a_string.md similarity index 100% rename from docs/387._first_unique_character_in_a_string.md rename to docs/Leetcode Solutions/387._first_unique_character_in_a_string.md diff --git a/docs/388._Longest_Absolute_File_Path.md b/docs/Leetcode Solutions/388._Longest_Absolute_File_Path.md similarity index 100% rename from docs/388._Longest_Absolute_File_Path.md rename to docs/Leetcode Solutions/388._Longest_Absolute_File_Path.md diff --git a/docs/389._find_the_difference.md b/docs/Leetcode Solutions/389._find_the_difference.md similarity index 100% rename from docs/389._find_the_difference.md rename to docs/Leetcode Solutions/389._find_the_difference.md diff --git a/docs/392._is_subsequence.md b/docs/Leetcode Solutions/392._is_subsequence.md similarity index 100% rename from docs/392._is_subsequence.md rename to docs/Leetcode Solutions/392._is_subsequence.md diff --git a/docs/394._decode_string.md b/docs/Leetcode Solutions/394._decode_string.md similarity index 100% rename from docs/394._decode_string.md rename to docs/Leetcode Solutions/394._decode_string.md diff --git a/docs/400. Nth Digit.md b/docs/Leetcode Solutions/400. Nth Digit.md similarity index 100% rename from docs/400. Nth Digit.md rename to docs/Leetcode Solutions/400. Nth Digit.md diff --git a/docs/401._binary_watch.md b/docs/Leetcode Solutions/401._binary_watch.md similarity index 100% rename from docs/401._binary_watch.md rename to docs/Leetcode Solutions/401._binary_watch.md diff --git a/docs/404._sum_of_left_leaves.md b/docs/Leetcode Solutions/404._sum_of_left_leaves.md similarity index 100% rename from docs/404._sum_of_left_leaves.md rename to docs/Leetcode Solutions/404._sum_of_left_leaves.md diff --git a/docs/405. Convert a Number to Hexadecimal.md b/docs/Leetcode Solutions/405. Convert a Number to Hexadecimal.md similarity index 100% rename from docs/405. Convert a Number to Hexadecimal.md rename to docs/Leetcode Solutions/405. Convert a Number to Hexadecimal.md diff --git a/docs/406._Queue_Reconstruction_by_Height.md b/docs/Leetcode Solutions/406._Queue_Reconstruction_by_Height.md similarity index 100% rename from docs/406._Queue_Reconstruction_by_Height.md rename to docs/Leetcode Solutions/406._Queue_Reconstruction_by_Height.md diff --git a/docs/412._fizz_buzz.md b/docs/Leetcode Solutions/412._fizz_buzz.md similarity index 100% rename from docs/412._fizz_buzz.md rename to docs/Leetcode Solutions/412._fizz_buzz.md diff --git a/docs/413. Arithmetic Slices.md b/docs/Leetcode Solutions/413. Arithmetic Slices.md similarity index 100% rename from docs/413. Arithmetic Slices.md rename to docs/Leetcode Solutions/413. Arithmetic Slices.md diff --git a/docs/414._third_maximum_number.md b/docs/Leetcode Solutions/414._third_maximum_number.md similarity index 100% rename from docs/414._third_maximum_number.md rename to docs/Leetcode Solutions/414._third_maximum_number.md diff --git a/docs/415._add_strings.md b/docs/Leetcode Solutions/415._add_strings.md similarity index 100% rename from docs/415._add_strings.md rename to docs/Leetcode Solutions/415._add_strings.md diff --git a/docs/416. Partition Equal Subset Sum.md b/docs/Leetcode Solutions/416. Partition Equal Subset Sum.md similarity index 100% rename from docs/416. Partition Equal Subset Sum.md rename to docs/Leetcode Solutions/416. Partition Equal Subset Sum.md diff --git a/docs/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md b/docs/Leetcode Solutions/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md similarity index 100% rename from docs/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md rename to docs/Leetcode Solutions/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md diff --git a/docs/422. Valid Word Square.md b/docs/Leetcode Solutions/422. Valid Word Square.md similarity index 100% rename from docs/422. Valid Word Square.md rename to docs/Leetcode Solutions/422. Valid Word Square.md diff --git a/docs/434._number_of_segments_in_a_string.md b/docs/Leetcode Solutions/434._number_of_segments_in_a_string.md similarity index 100% rename from docs/434._number_of_segments_in_a_string.md rename to docs/Leetcode Solutions/434._number_of_segments_in_a_string.md diff --git a/docs/437._path_sum_iii.md b/docs/Leetcode Solutions/437._path_sum_iii.md similarity index 100% rename from docs/437._path_sum_iii.md rename to docs/Leetcode Solutions/437._path_sum_iii.md diff --git a/docs/438._Find_All_Anagrams_in_a_String.md b/docs/Leetcode Solutions/438._Find_All_Anagrams_in_a_String.md similarity index 100% rename from docs/438._Find_All_Anagrams_in_a_String.md rename to docs/Leetcode Solutions/438._Find_All_Anagrams_in_a_String.md diff --git a/docs/439. Ternary Expression Parser.md b/docs/Leetcode Solutions/439. Ternary Expression Parser.md similarity index 100% rename from docs/439. Ternary Expression Parser.md rename to docs/Leetcode Solutions/439. Ternary Expression Parser.md diff --git a/docs/441._arranging_coins.md b/docs/Leetcode Solutions/441._arranging_coins.md similarity index 100% rename from docs/441._arranging_coins.md rename to docs/Leetcode Solutions/441._arranging_coins.md diff --git a/docs/448._Find_All_Numbers_Disappeared_in_an_Array.md b/docs/Leetcode Solutions/448._Find_All_Numbers_Disappeared_in_an_Array.md similarity index 100% rename from docs/448._Find_All_Numbers_Disappeared_in_an_Array.md rename to docs/Leetcode Solutions/448._Find_All_Numbers_Disappeared_in_an_Array.md diff --git a/docs/450. Delete Node in a BST.md b/docs/Leetcode Solutions/450. Delete Node in a BST.md similarity index 100% rename from docs/450. Delete Node in a BST.md rename to docs/Leetcode Solutions/450. Delete Node in a BST.md diff --git a/docs/453._Minimum_Moves_to_Equal_Array_Elements.md b/docs/Leetcode Solutions/453._Minimum_Moves_to_Equal_Array_Elements.md similarity index 100% rename from docs/453._Minimum_Moves_to_Equal_Array_Elements.md rename to docs/Leetcode Solutions/453._Minimum_Moves_to_Equal_Array_Elements.md diff --git a/docs/459._Repeated_Substring_Pattern.md b/docs/Leetcode Solutions/459._Repeated_Substring_Pattern.md similarity index 100% rename from docs/459._Repeated_Substring_Pattern.md rename to docs/Leetcode Solutions/459._Repeated_Substring_Pattern.md diff --git a/docs/461._Hamming Distance.md b/docs/Leetcode Solutions/461._Hamming Distance.md similarity index 100% rename from docs/461._Hamming Distance.md rename to docs/Leetcode Solutions/461._Hamming Distance.md diff --git a/docs/463._Island_Perimeter.md b/docs/Leetcode Solutions/463._Island_Perimeter.md similarity index 100% rename from docs/463._Island_Perimeter.md rename to docs/Leetcode Solutions/463._Island_Perimeter.md diff --git a/docs/467._Unique_Substrings_in_Wraparound_String.md b/docs/Leetcode Solutions/467._Unique_Substrings_in_Wraparound_String.md similarity index 100% rename from docs/467._Unique_Substrings_in_Wraparound_String.md rename to docs/Leetcode Solutions/467._Unique_Substrings_in_Wraparound_String.md diff --git a/docs/469. Convex Polygon.md b/docs/Leetcode Solutions/469. Convex Polygon.md similarity index 100% rename from docs/469. Convex Polygon.md rename to docs/Leetcode Solutions/469. Convex Polygon.md diff --git a/docs/476._Number_Complement.md b/docs/Leetcode Solutions/476._Number_Complement.md similarity index 100% rename from docs/476._Number_Complement.md rename to docs/Leetcode Solutions/476._Number_Complement.md diff --git a/docs/477._Total_Hamming_Distance.md b/docs/Leetcode Solutions/477._Total_Hamming_Distance.md similarity index 100% rename from docs/477._Total_Hamming_Distance.md rename to docs/Leetcode Solutions/477._Total_Hamming_Distance.md diff --git a/docs/485._Max_Consecutive_Ones.md b/docs/Leetcode Solutions/485._Max_Consecutive_Ones.md similarity index 100% rename from docs/485._Max_Consecutive_Ones.md rename to docs/Leetcode Solutions/485._Max_Consecutive_Ones.md diff --git a/docs/587._Erect_the_Fence .md b/docs/Leetcode Solutions/587._Erect_the_Fence .md similarity index 100% rename from docs/587._Erect_the_Fence .md rename to docs/Leetcode Solutions/587._Erect_the_Fence .md diff --git a/docs/599._Minimum_Index_Sum_of_Two_Lists.md b/docs/Leetcode Solutions/599._Minimum_Index_Sum_of_Two_Lists.md similarity index 100% rename from docs/599._Minimum_Index_Sum_of_Two_Lists.md rename to docs/Leetcode Solutions/599._Minimum_Index_Sum_of_Two_Lists.md diff --git a/docs/647._Palindromic_Substrings.md b/docs/Leetcode Solutions/647._Palindromic_Substrings.md similarity index 100% rename from docs/647._Palindromic_Substrings.md rename to docs/Leetcode Solutions/647._Palindromic_Substrings.md diff --git a/docs/657._Judge_Route_Circle.md b/docs/Leetcode Solutions/657._Judge_Route_Circle.md similarity index 100% rename from docs/657._Judge_Route_Circle.md rename to docs/Leetcode Solutions/657._Judge_Route_Circle.md diff --git a/docs/665._Non-decreasing_Array.md b/docs/Leetcode Solutions/665._Non-decreasing_Array.md similarity index 100% rename from docs/665._Non-decreasing_Array.md rename to docs/Leetcode Solutions/665._Non-decreasing_Array.md diff --git a/docs/672._Bulb_Switcher_II.md b/docs/Leetcode Solutions/672._Bulb_Switcher_II.md similarity index 100% rename from docs/672._Bulb_Switcher_II.md rename to docs/Leetcode Solutions/672._Bulb_Switcher_II.md diff --git a/docs/681._Next_Closest_Time.md b/docs/Leetcode Solutions/681._Next_Closest_Time.md similarity index 100% rename from docs/681._Next_Closest_Time.md rename to docs/Leetcode Solutions/681._Next_Closest_Time.md diff --git a/docs/682._Baseball_Game.md b/docs/Leetcode Solutions/682._Baseball_Game.md similarity index 100% rename from docs/682._Baseball_Game.md rename to docs/Leetcode Solutions/682._Baseball_Game.md diff --git a/docs/687._Longest_Univalue_Path.md b/docs/Leetcode Solutions/687._Longest_Univalue_Path.md similarity index 100% rename from docs/687._Longest_Univalue_Path.md rename to docs/Leetcode Solutions/687._Longest_Univalue_Path.md diff --git a/docs/740._delete_and_earn.md b/docs/Leetcode Solutions/740._delete_and_earn.md similarity index 100% rename from docs/740._delete_and_earn.md rename to docs/Leetcode Solutions/740._delete_and_earn.md diff --git a/docs/760._Find_Anagram_Mappings.md b/docs/Leetcode Solutions/760._Find_Anagram_Mappings.md similarity index 100% rename from docs/760._Find_Anagram_Mappings.md rename to docs/Leetcode Solutions/760._Find_Anagram_Mappings.md diff --git "a/others/Binary Search \344\270\215\346\230\223\345\206\231.md" "b/docs/Leetcode Solutions/Summarization/Binary Search \344\270\215\346\230\223\345\206\231.md" similarity index 100% rename from "others/Binary Search \344\270\215\346\230\223\345\206\231.md" rename to "docs/Leetcode Solutions/Summarization/Binary Search \344\270\215\346\230\223\345\206\231.md" diff --git a/others/Data Structure and Algorthim Review.md b/docs/Leetcode Solutions/Summarization/Data Structure and Algorthim Review.md similarity index 100% rename from others/Data Structure and Algorthim Review.md rename to docs/Leetcode Solutions/Summarization/Data Structure and Algorthim Review.md diff --git a/others/Dynamic Programming.md b/docs/Leetcode Solutions/Summarization/Dynamic Programming.md similarity index 100% rename from others/Dynamic Programming.md rename to docs/Leetcode Solutions/Summarization/Dynamic Programming.md diff --git "a/others/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" "b/docs/Leetcode Solutions/Summarization/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" similarity index 100% rename from "others/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" rename to "docs/Leetcode Solutions/Summarization/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" diff --git "a/others/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" "b/docs/Leetcode Solutions/Summarization/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" similarity index 100% rename from "others/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" rename to "docs/Leetcode Solutions/Summarization/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" diff --git "a/others/LinkedList\346\212\200\345\267\247.md" "b/docs/Leetcode Solutions/Summarization/LinkedList\346\212\200\345\267\247.md" similarity index 100% rename from "others/LinkedList\346\212\200\345\267\247.md" rename to "docs/Leetcode Solutions/Summarization/LinkedList\346\212\200\345\267\247.md" diff --git a/others/Maximal Square.pdf b/docs/Leetcode Solutions/Summarization/Maximal Square.pdf similarity index 100% rename from others/Maximal Square.pdf rename to docs/Leetcode Solutions/Summarization/Maximal Square.pdf diff --git "a/docs/SortingAlgorithm/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" "b/docs/Leetcode Solutions/Summarization/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" similarity index 100% rename from "docs/SortingAlgorithm/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" rename to "docs/Leetcode Solutions/Summarization/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" diff --git a/others/Range Sum Query 2D - Immutable.pdf b/docs/Leetcode Solutions/Summarization/Range Sum Query 2D - Immutable.pdf similarity index 100% rename from others/Range Sum Query 2D - Immutable.pdf rename to docs/Leetcode Solutions/Summarization/Range Sum Query 2D - Immutable.pdf diff --git a/others/Recusrion & BackTracking.md b/docs/Leetcode Solutions/Summarization/Recusrion & BackTracking.md similarity index 100% rename from others/Recusrion & BackTracking.md rename to docs/Leetcode Solutions/Summarization/Recusrion & BackTracking.md diff --git "a/others/backtracking\346\200\235\350\267\257.md" "b/docs/Leetcode Solutions/Summarization/backtracking\346\200\235\350\267\257.md" similarity index 100% rename from "others/backtracking\346\200\235\350\267\257.md" rename to "docs/Leetcode Solutions/Summarization/backtracking\346\200\235\350\267\257.md" diff --git "a/others/delete_node_in_a_linked_list\351\227\256\351\242\230.md" "b/docs/Leetcode Solutions/Summarization/delete_node_in_a_linked_list\351\227\256\351\242\230.md" similarity index 100% rename from "others/delete_node_in_a_linked_list\351\227\256\351\242\230.md" rename to "docs/Leetcode Solutions/Summarization/delete_node_in_a_linked_list\351\227\256\351\242\230.md" diff --git "a/others/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" "b/docs/Leetcode Solutions/Summarization/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" similarity index 100% rename from "others/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" rename to "docs/Leetcode Solutions/Summarization/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" diff --git "a/docs/SortingAlgorithm/python\347\232\204\345\220\204\347\247\215pass.md" "b/docs/Leetcode Solutions/Summarization/python\347\232\204\345\220\204\347\247\215pass.md" similarity index 100% rename from "docs/SortingAlgorithm/python\347\232\204\345\220\204\347\247\215pass.md" rename to "docs/Leetcode Solutions/Summarization/python\347\232\204\345\220\204\347\247\215pass.md" diff --git a/others/slide_windows_template.md b/docs/Leetcode Solutions/Summarization/slide_windows_template.md similarity index 100% rename from others/slide_windows_template.md rename to docs/Leetcode Solutions/Summarization/slide_windows_template.md diff --git "a/docs/SortingAlgorithm/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" "b/docs/Leetcode Solutions/Summarization/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" similarity index 100% rename from "docs/SortingAlgorithm/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" rename to "docs/Leetcode Solutions/Summarization/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" diff --git "a/others/\344\275\215\350\277\220\347\256\227.md" "b/docs/Leetcode Solutions/Summarization/\344\275\215\350\277\220\347\256\227.md" similarity index 100% rename from "others/\344\275\215\350\277\220\347\256\227.md" rename to "docs/Leetcode Solutions/Summarization/\344\275\215\350\277\220\347\256\227.md" diff --git "a/others/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" "b/docs/Leetcode Solutions/Summarization/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" similarity index 100% rename from "others/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" rename to "docs/Leetcode Solutions/Summarization/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" diff --git a/docs/SortingAlgorithm/README.md "b/docs/Leetcode Solutions/Summarization/\345\205\253\346\216\222\345\272\217.md" similarity index 100% rename from docs/SortingAlgorithm/README.md rename to "docs/Leetcode Solutions/Summarization/\345\205\253\346\216\222\345\272\217.md" diff --git "a/others/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" "b/docs/Leetcode Solutions/Summarization/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" similarity index 100% rename from "others/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" rename to "docs/Leetcode Solutions/Summarization/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" diff --git "a/others/\346\200\273\347\273\223.md" "b/docs/Leetcode Solutions/Summarization/\346\200\273\347\273\223.md" similarity index 100% rename from "others/\346\200\273\347\273\223.md" rename to "docs/Leetcode Solutions/Summarization/\346\200\273\347\273\223.md" diff --git "a/others/\347\273\204\345\220\210\351\227\256\351\242\230.md" "b/docs/Leetcode Solutions/Summarization/\347\273\204\345\220\210\351\227\256\351\242\230.md" similarity index 100% rename from "others/\347\273\204\345\220\210\351\227\256\351\242\230.md" rename to "docs/Leetcode Solutions/Summarization/\347\273\204\345\220\210\351\227\256\351\242\230.md" diff --git "a/others/\351\200\222\345\275\222_recursion.md" "b/docs/Leetcode Solutions/Summarization/\351\200\222\345\275\222_recursion.md" similarity index 100% rename from "others/\351\200\222\345\275\222_recursion.md" rename to "docs/Leetcode Solutions/Summarization/\351\200\222\345\275\222_recursion.md" diff --git a/src/py3.x/TreeRecursionIterator.py b/src/py3.x/TreeRecursionIterator.py new file mode 100644 index 000000000..ffb4be32f --- /dev/null +++ b/src/py3.x/TreeRecursionIterator.py @@ -0,0 +1,34 @@ +# coding:utf8 + +class Node(): + def __init__(self, value, left=None, right=None): + self.value = value + self.left = left + self.right = right + +def midRecusion(node): + if node is None: + return + midRecusion(node.left) + print node.value, + midRecusion(node.right) + +def midIterator(node): + stack = [] + while stack or node: + if node is not None: + stack.append(node) + node = node.left + else: + node = stack.pop(-1) + print node.value, + node = node.right + +if __name__ == "__main__": + node = Node("D", Node("B", Node("A"), Node("C")), Node("E", right=Node("G", left=Node("F")))) + + print('\n中序遍历<递归>:') + midRecusion(node) + + print('\n中序遍历<迭代>:') + midIterator(node) \ No newline at end of file diff --git a/src/py3.x/list2iteration.py b/src/py3.x/list2iteration.py new file mode 100644 index 000000000..145fd8335 --- /dev/null +++ b/src/py3.x/list2iteration.py @@ -0,0 +1,30 @@ +#!/usr/bin/python +# coding:utf8 +''' +迭代使用的是循环结构。 +递归使用的是选择结构。 +''' + +# 递归求解 +def calculate(l): + if len(l) <= 1: + return l[0] + value = calculate(l[1:]) + return 10**(len(l) - 1) * l[0] + value + + +# 迭代求解 +def calculate2(l): + result = 0 + while len(l) >= 1: + result += 10 ** (len(l)-1) * l[0] + l = l[1:] + return result + + +l1 = [1, 2, 3] +l2 = [4, 5] +sum = 0 +result = calculate(l1) + calculate(l2) +# result = calculate2(l1) + calculate2(l2) +print(result) From b697dd51d59e15c512c2c7d35ea215998f69b17d Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:21:21 -0500 Subject: [PATCH 452/473] Create README.md --- docs/Leetcode Solutions/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/Leetcode Solutions/README.md diff --git a/docs/Leetcode Solutions/README.md b/docs/Leetcode Solutions/README.md new file mode 100644 index 000000000..43df2acd7 --- /dev/null +++ b/docs/Leetcode Solutions/README.md @@ -0,0 +1 @@ +Leetcode solutions and summarizations! From fe52a5dd48b74976959af3c865b33811102b3b4f Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:21:43 -0500 Subject: [PATCH 453/473] Update README.md --- docs/Leetcode Solutions/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Leetcode Solutions/README.md b/docs/Leetcode Solutions/README.md index 43df2acd7..c477b8c84 100644 --- a/docs/Leetcode Solutions/README.md +++ b/docs/Leetcode Solutions/README.md @@ -1 +1 @@ -Leetcode solutions and summarizations! +# Leetcode solutions and summarizations! From 89cf8e95ab993161a7c8e866c3bf6ece920fe597 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:21:57 -0500 Subject: [PATCH 454/473] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f9547934f..75446ced7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# LeetCode 面试题 +# Algorithms ## [八大排序算法](/docs/SortingAlgorithm/README.md) @@ -20,7 +20,7 @@ * [pocketgems 面试题](/docs/interview/pocketgems/pocketgems.md) * [WePay 面试题](/docs/interview/WePay/WePay.md) -## LeetCode算法题 +## LeetCode Solutions and Summarizations * [](docs/某类别/001._two_sum.md) * [](/docs/某类别/002._add_two_numbers.md) From 20482055a9e54c4bafe210fa7d66d4a63dc2dcee Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:23:23 -0500 Subject: [PATCH 455/473] Reconstructuring the whole repository, expanding the scope from Leetcode to Algorithms --- docs/Algorithm Templates/README.md | 314 +++++++++++++++++++++++++++++ images/README.md | 314 +++++++++++++++++++++++++++++ 2 files changed, 628 insertions(+) create mode 100644 docs/Algorithm Templates/README.md create mode 100644 images/README.md diff --git a/docs/Algorithm Templates/README.md b/docs/Algorithm Templates/README.md new file mode 100644 index 000000000..f9547934f --- /dev/null +++ b/docs/Algorithm Templates/README.md @@ -0,0 +1,314 @@ +# LeetCode 面试题 + +## [八大排序算法](/docs/SortingAlgorithm/README.md) + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | + +## 面试问答 + +* [Google面试题](/docs/interview/Google/Google.md) +* [pocketgems 面试题](/docs/interview/pocketgems/pocketgems.md) +* [WePay 面试题](/docs/interview/WePay/WePay.md) + +## LeetCode算法题 + +* [](docs/某类别/001._two_sum.md) +* [](/docs/某类别/002._add_two_numbers.md) +* [](/docs/某类别/003._longest_substring_without_repeating_characters.md) +* [](/docs/某类别/004._median_of_two_sorted_arrays.md) +* [](/docs/某类别/005._longest_palindromic_substring.md) +* [](/docs/某类别/007._Reverse_Integer.md) +* [](/docs/某类别/008._string_to_integer_(atoi).md) +* [](/docs/某类别/010._regular_expression_matching.md) +* [](/docs/某类别/011._container_with_most_water.md) +* [](/docs/某类别/012._Integer_to_Roman.md) +* [](/docs/某类别/013._Roman_to_Integer.md) +* [](/docs/某类别/014._longest_common_prefix.md) +* [](/docs/某类别/015._3sum.md) +* [](/docs/某类别/016._3sum_closest.md) +* [](/docs/某类别/017._letter_combinations_of_a_phone_number.md) +* [](/docs/某类别/018._4sum.md) +* [](/docs/某类别/019._remove_nth_node_from_end_of_list.md) +* [](/docs/某类别/020._valid_parentheses.md) +* [](/docs/某类别/021._merge_two_sorted_lists.md) +* [](/docs/某类别/022._generate_parentheses.md) +* [](/docs/某类别/023._merge_k_sorted_lists.md) +* [](/docs/某类别/024._swap_nodes_in_pairs.md) +* [](/docs/某类别/026._Remove_Duplicates_from_Sorted_Array.md) +* [](/docs/某类别/027._Remove_Element.md) +* [](/docs/某类别/028._implement_strstr().md) +* [](/docs/某类别/030._Substring_with_Concatenation_of_All_Words.md) +* [](/docs/某类别/031._next_permutation.md) +* [](/docs/某类别/033._search_in_rotated_sorted_array.md) +* [](/docs/某类别/034._SearchforaRange.md) +* [](/docs/某类别/035._search_insert_position.md) +* [](/docs/某类别/038._Count_and_Say.md) +* [](/docs/某类别/039._combination_sum.md) +* [](/docs/某类别/040._combination_sum_ii.md) +* [](/docs/某类别/042._trapping_rain_water.md) +* [](/docs/某类别/043._multiply_strings.md) +* [](/docs/某类别/044._wildcard_matching.md) +* [](/docs/某类别/045._Jump_Game_II.md) +* [](/docs/某类别/046._permutations.md) +* [](/docs/某类别/047._permutations_ii.md) +* [](/docs/某类别/048._rotate_image.md) +* [](/docs/某类别/049._group_anagrams_python.md) +* [](/docs/某类别/050._pow(x,_n).md) +* [](/docs/某类别/051._n-queens.md) +* [](/docs/某类别/052._n-queens_ii.md) +* [](/docs/某类别/053._maximum_subarray.md) +* [](/docs/某类别/054._spiral_matrix.md) +* [](/docs/某类别/055._jump_game.md) +* [](/docs/某类别/056._Merge_Intervals.md) +* [](/docs/某类别/058._length_of_last_word.md) +* [](/docs/某类别/059._spiral_matrix_ii.md) +* [](/docs/某类别/060._permutation_sequence.md) +* [](/docs/某类别/061._rotate_list.md) +* [](/docs/某类别/064._minimum_path_sum.md) +* [](/docs/某类别/065.unique_paths_ii.md) +* [](/docs/某类别/066._plus_one.md) +* [](/docs/某类别/067._add_binary.md) +* [](/docs/某类别/069._sqrt(x).md) +* [](/docs/某类别/070.ClimbingStairs.md) +* [](/docs/某类别/072._edit_distance.md) +* [](/docs/某类别/073.SetMatrixZeroes.md) +* [](/docs/某类别/074._search_a_2d_matrix.md) +* [](/docs/某类别/075._sort_colors.md) +* [](/docs/某类别/076._Minimum_Window_Substring.md) +* [](/docs/某类别/077._combinations.md) +* [](/docs/某类别/078.Subsets.md) +* [](/docs/某类别/079._word_search.md) +* [](/docs/某类别/082._remove_duplicates_from_sorted_list_ii.md) +* [](/docs/某类别/083._remove_duplicates_from_sorted_list.md) +* [](/docs/某类别/086._partition_list.md) +* [](/docs/某类别/088._merge_sorted_array.md) +* [](/docs/某类别/089._gray_code.md) +* [](/docs/某类别/090._subsets_ii.md) +* [](/docs/某类别/091._decode_ways.md) +* [](/docs/某类别/092._reverse_linked_list_ii.md) +* [](/docs/某类别/093._restore_ip_addresses.md) +* [](/docs/某类别/094._binary_tree_inorder_traversal.md) +* [](/docs/某类别/096._unique_binary_search_trees.md) +* [](/docs/某类别/098._validate_binary_search_tree.md) +* [](/docs/某类别/100._same_tree.md) +* [](/docs/某类别/101._symmetric_tree.md) +* [](/docs/某类别/102._binary_tree_level_order_traversal.md) +* [](/docs/某类别/103._binary_tree_zigzag_level_order_traversal.md) +* [](/docs/某类别/104._maximum_depth_of_binary_tree.md) +* [](/docs/某类别/105._construct_binary_tree_from_preorder_and_inorder_traversal.md) +* [](/docs/某类别/106._construct_binary_tree_from_inorder_and_postorder_traversal.md) +* [](/docs/某类别/107._binary_tree_level_order_traversal_ii.md) +* [](/docs/某类别/108._convert_sorted_array_to_binary_search_tree.md) +* [](/docs/某类别/109._convert_sorted_list_to_binary_search_tree.md) +* [](/docs/某类别/110._balanced_binary_tree.md) +* [](/docs/某类别/111._minimum_depth_of_binary_tree.md) +* [](/docs/某类别/112._path_sum.md) +* [](/docs/某类别/113._path_sum_ii.md) +* [](/docs/某类别/114._flatten_binary_tree_to_linked_list.md) +* [](/docs/某类别/116._populating_next_right_pointers_in_each_node.md) +* [](/docs/某类别/118._pascal's_triangle.md) +* [](/docs/某类别/119.Pascal'sTriangleII.md) +* [](/docs/某类别/120.Triangle.md) +* [](/docs/某类别/121._Best_Time_to_Buy_and_Sell_Stock.md) +* [](/docs/某类别/125._valid_palindrome.md) +* [](/docs/某类别/126.WordLadderII.md) +* [](/docs/某类别/127._word_ladder.md) +* [](/docs/某类别/128._Longest_Consecutive_Sequence.md) +* [](/docs/某类别/129._sum_root_to_leaf_numbers.md) +* [](/docs/某类别/130._surrounded_regions.md) +* [](/docs/某类别/131._palindrome_partitioning.md) +* [](/docs/某类别/133._clone_graph.md) +* [](/docs/某类别/136._single_number.md) +* [](/docs/某类别/139._word_break.md) +* [](/docs/某类别/140._word_break_ii.md) +* [](/docs/某类别/141._linked_list_cycle.md) +* [](/docs/某类别/142_Linked_List_Cycle_II.md) +* [](/docs/某类别/143._reorder_list.md) +* [](/docs/某类别/144._binary_tree_preorder_traversal.md) +* [](/docs/某类别/145._binary_tree_postorder_traversal.md) +* [](/docs/某类别/147._insertion_sort_list.md) +* [](/docs/某类别/148._sort_list.md) +* [](/docs/某类别/150._evaluate_reverse_polish_notation.md) +* [](/docs/某类别/151._reverse_words_in_a_string.md) +* [](/docs/某类别/152._maximum_product_subarray.md) +* [](/docs/某类别/153._find_minimum_in_rotated_sorted_array.md) +* [](/docs/某类别/155._min_stack.md) +* [](/docs/某类别/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md) +* [](/docs/某类别/160._intersection_of_two_linked_lists.md) +* [](/docs/某类别/162._find_peak_element.md) +* [](/docs/某类别/165._compare_version_numbers.md) +* [](/docs/某类别/166._Fraction_to_Recurring_Decimal.md) +* [](/docs/某类别/167._two_sum_ii_-_input_array_is_sorted.md) +* [](/docs/某类别/168._excel_sheet_column_title.md) +* [](/docs/某类别/169._majority_element.md) +* [](/docs/某类别/171._excel_sheet_column_number.md) +* [](/docs/某类别/173._binary_search_tree_iterator.md) +* [](/docs/某类别/189._rotate_array.md) +* [](/docs/某类别/191._number_of_1_bits.md) +* [](/docs/某类别/198._house_robber.md) +* [](/docs/某类别/199._binary_tree_right_side_view.md) +* [](/docs/某类别/200._number_of_islands.md) +* [](/docs/某类别/203._remove_linked_list_elements.md) +* [](/docs/某类别/204._count_primes.md) +* [](/docs/某类别/205._isomorphic_strings.md) +* [](/docs/某类别/206._reverse_linked_list.md) +* [](/docs/某类别/207._course_schedule.md) +* [](/docs/某类别/208._implement_trie_(prefix_tree).md) +* [](/docs/某类别/210._course_schedule_ii.md) +* [](/docs/某类别/211.AddandSearchWord-Datastructuredesign.md) +* [](/docs/某类别/213._house_robber_ii.md) +* [](/docs/某类别/216._combination_sum_iii.md) +* [](/docs/某类别/217._contains_duplicate.md) +* [](/docs/某类别/218._The_Skyline_Problem.md) +* [](/docs/某类别/219._contains_duplicate_ii.md) +* [](/docs/某类别/221._maximal_square.md) +* [](/docs/某类别/222._count_complete_tree_nodes.md) +* [](/docs/某类别/223._rectangle_area.md) +* [](/docs/某类别/224.BasicCalculator.md) +* [](/docs/某类别/225._implement_stack_using_queues.md) +* [](/docs/某类别/226._invert_binary_tree.md) +* [](/docs/某类别/227._basic_calculator_ii.md) +* [](/docs/某类别/228._summary_ranges.md) +* [](/docs/某类别/229._majority_element_ii.md) +* [](/docs/某类别/230._kth_smallest_element_in_a_bst.md) +* [](/docs/某类别/231._Power_of_Two.md) +* [](/docs/某类别/232._implement_queue_using_stacks.md) +* [](/docs/某类别/234._palindrome_linked_list.md) +* [](/docs/某类别/235._lowest_common_ancestor_of_a_binary_search_tree.md) +* [](/docs/某类别/236._lowest_common_ancestor_of_a_binary_tree.md) +* [](/docs/某类别/237._delete_node_in_a_linked_list.md) +* [](/docs/某类别/238._product_of_array_except_self.md) +* [](/docs/某类别/240._search_a_2d_matrix_ii.md) +* [](/docs/某类别/242._valid_anagram.md) +* [](/docs/某类别/252.MeetingRooms.md) +* [](/docs/某类别/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md) +* [](/docs/某类别/256.PaintHouse.md) +* [](/docs/某类别/257._binary_tree_paths.md) +* [](/docs/某类别/258_Add_Digits.md) +* [](/docs/某类别/261.GraphValidTree.md) +* [](/docs/某类别/263._ugly_number.md) +* [](/docs/某类别/264._ugly_number_ii.md) +* [](/docs/某类别/265.PaintHouseII.md) +* [](/docs/某类别/266.PalindromePermutation.md) +* [](/docs/某类别/267.PalindromePermutationII.md) +* [](/docs/某类别/268._missing_number.md) +* [](/docs/某类别/270.ClosestBinarySearchTreeValue.md) +* [](/docs/某类别/276.PaintFence.md) +* [](/docs/某类别/277.FindtheCelebrity.md) +* [](/docs/某类别/278._First_Bad_Version.md) +* [](/docs/某类别/279._perfect_squares.md) +* [](/docs/某类别/280._Wiggle_Sort.md) +* [](/docs/某类别/283._move_zeroes.md) +* [](/docs/某类别/285._inorder_successor_in_bst.md) +* [](/docs/某类别/286.WallsandGates.md) +* [](/docs/某类别/289._game_of_life.md) +* [](/docs/某类别/290._word_pattern.md) +* [](/docs/某类别/292._nim_game.md) +* [](/docs/某类别/296.BestMeetingPoint.md) +* [](/docs/某类别/298.BinaryTreeLongestConsecutiveSequence.md) +* [](/docs/某类别/299._bulls_and_cows.md) +* [](/docs/某类别/300._longest_increasing_subsequence.md) +* [](/docs/某类别/303._range_sum_query_-_immutable.md) +* [](/docs/某类别/316._Remove_Duplicate_Letters.md) +* [](/docs/某类别/319._Bulb_Switcher.md) +* [](/docs/某类别/322.CoinChange.md) +* [](/docs/某类别/323.NumberofConnectedComponentsinanUndirectedGraph.md) +* [](/docs/某类别/324._Wiggle_Sort_II.md) +* [](/docs/某类别/326._power_of_three.md) +* [](/docs/某类别/328._odd_even_linked_list.md) +* [](/docs/某类别/334._increasing_triplet_subsequence.md) +* [](/docs/某类别/337._house_robber_iii.md) +* [](/docs/某类别/338.CountingBits.md) +* [](/docs/某类别/339.NestedListWeightSum.md) +* [](/docs/某类别/341._Flatten_Nested_List_Iterator.md) +* [](/docs/某类别/342._Power_of_Four.md) +* [](/docs/某类别/344._reverse_string.md) +* [](/docs/某类别/345._Reverse_Vowels_of_a_String.md) +* [](/docs/某类别/349._intersection_of_two_arrays.md) +* [](/docs/某类别/350._intersection_of_two_arrays_ii.md) +* [](/docs/某类别/353.DesignSnakeGame.md) +* [](/docs/某类别/364.NestedListWeightSumII.md) +* [](/docs/某类别/366.FindLeavesofBinaryTree.md) +* [](/docs/某类别/367._valid_perfect_square.md) +* [](/docs/某类别/369.PlusOneLinkedList.md) +* [](/docs/某类别/371._sum_of_two_integers.md) +* [](/docs/某类别/374._Guess_Number_Higher_or_Lower.md) +* [](/docs/某类别/377._combination_sum_iv.md) +* [](/docs/某类别/378._kth_smallest_element_in_a_sorted_matrix.md) +* [](/docs/某类别/380.InsertDeleteGetRandomO(1).md) +* [](/docs/某类别/381.InsertDeleteGetRandomO(1)-Duplicatesallowed.md) +* [](/docs/某类别/382._linked_list_random_node.md) +* [](/docs/某类别/383._ransom_note.md) +* [](/docs/某类别/384.ShuffleanArray.md) +* [](/docs/某类别/387._first_unique_character_in_a_string.md) +* [](/docs/某类别/388._Longest_Absolute_File_Path.md) +* [](/docs/某类别/389._find_the_difference.md) +* [](/docs/某类别/392._is_subsequence.md) +* [](/docs/某类别/394._decode_string.md) +* [](/docs/某类别/400.NthDigit.md) +* [](/docs/某类别/401._binary_watch.md) +* [](/docs/某类别/404._sum_of_left_leaves.md) +* [](/docs/某类别/405.ConvertaNumbertoHexadecimal.md) +* [](/docs/某类别/406._Queue_Reconstruction_by_Height.md) +* [](/docs/某类别/412._fizz_buzz.md) +* [](/docs/某类别/413.ArithmeticSlices.md) +* [](/docs/某类别/414._third_maximum_number.md) +* [](/docs/某类别/415._add_strings.md) +* [](/docs/某类别/416.PartitionEqualSubsetSum.md) +* [](/docs/某类别/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md) +* [](/docs/某类别/422.ValidWordSquare.md) +* [](/docs/某类别/434._number_of_segments_in_a_string.md) +* [](/docs/某类别/437._path_sum_iii.md) +* [](/docs/某类别/438._Find_All_Anagrams_in_a_String.md) +* [](/docs/某类别/439.TernaryExpressionParser.md) +* [](/docs/某类别/441._arranging_coins.md) +* [](/docs/某类别/448._Find_All_Numbers_Disappeared_in_an_Array.md) +* [](/docs/某类别/450.DeleteNodeinaBST.md) +* [](/docs/某类别/453._Minimum_Moves_to_Equal_Array_Elements.md) +* [](/docs/某类别/459._Repeated_Substring_Pattern.md) +* [](/docs/某类别/461._HammingDistance.md) +* [](/docs/某类别/463._Island_Perimeter.md) +* [](/docs/某类别/467._Unique_Substrings_in_Wraparound_String.md) +* [](/docs/某类别/469.ConvexPolygon.md) +* [](/docs/某类别/476._Number_Complement.md) +* [](/docs/某类别/477._Total_Hamming_Distance.md) +* [](/docs/某类别/485._Max_Consecutive_Ones.md) +* [](/docs/某类别/587._Erect_the_Fence.md) +* [](/docs/某类别/599._Minimum_Index_Sum_of_Two_Lists.md) +* [](/docs/某类别/647._Palindromic_Substrings.md) +* [](/docs/某类别/657._Judge_Route_Circle.md) +* [](/docs/某类别/665._Non-decreasing_Array.md) +* [](/docs/某类别/672._Bulb_Switcher_II.md) +* [](/docs/某类别/681._Next_Closest_Time.md) +* [](/docs/某类别/682._Baseball_Game.md) +* [](/docs/某类别/687._Longest_Univalue_Path.md) +* [](/docs/某类别/740._delete_and_earn.md) +* [](/docs/某类别/760._Find_Anagram_Mappings.md) + +## 推荐的一些LeetCode网站 + +1. [KrisYu的GItuhub](https://github.com/KrisYu/LeetCode-CLRS-Python) +2. [kamyu104的Github](https://github.com/kamyu104/LeetCode) +3. [数据结构与算法/leetcode/lintcode题解](https://algorithm.yuanbin.me/zh-hans/) +4. [Leetcode 讨论区](https://discuss.leetcode.com/) +5. [visualgo算法可视化网站](https://visualgo.net/en) +6. [Data Structure Visualization](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) +7. [我的算法学习之路 - Lucida](http://zh.lucida.me/blog/on-learning-algorithms/) +8. [HiredInTech](https://www.hiredintech.com/) System Design 的总结特别适合入门 +9. [mitcc的Github](https://github.com/mitcc/AlgoSolutions) +10. [小土刀的面试刷题笔记](http://wdxtub.com/interview/14520594642530.html) + + +### Please note, this repository is inspired from [KrisYu](https://github.com/KrisYu/LeetCode-CLRS-Python). However, it has been modified, added and improved to reflect our knowledge, wisdom and effort. + + - 💪就是干! diff --git a/images/README.md b/images/README.md new file mode 100644 index 000000000..f9547934f --- /dev/null +++ b/images/README.md @@ -0,0 +1,314 @@ +# LeetCode 面试题 + +## [八大排序算法](/docs/SortingAlgorithm/README.md) + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | + +## 面试问答 + +* [Google面试题](/docs/interview/Google/Google.md) +* [pocketgems 面试题](/docs/interview/pocketgems/pocketgems.md) +* [WePay 面试题](/docs/interview/WePay/WePay.md) + +## LeetCode算法题 + +* [](docs/某类别/001._two_sum.md) +* [](/docs/某类别/002._add_two_numbers.md) +* [](/docs/某类别/003._longest_substring_without_repeating_characters.md) +* [](/docs/某类别/004._median_of_two_sorted_arrays.md) +* [](/docs/某类别/005._longest_palindromic_substring.md) +* [](/docs/某类别/007._Reverse_Integer.md) +* [](/docs/某类别/008._string_to_integer_(atoi).md) +* [](/docs/某类别/010._regular_expression_matching.md) +* [](/docs/某类别/011._container_with_most_water.md) +* [](/docs/某类别/012._Integer_to_Roman.md) +* [](/docs/某类别/013._Roman_to_Integer.md) +* [](/docs/某类别/014._longest_common_prefix.md) +* [](/docs/某类别/015._3sum.md) +* [](/docs/某类别/016._3sum_closest.md) +* [](/docs/某类别/017._letter_combinations_of_a_phone_number.md) +* [](/docs/某类别/018._4sum.md) +* [](/docs/某类别/019._remove_nth_node_from_end_of_list.md) +* [](/docs/某类别/020._valid_parentheses.md) +* [](/docs/某类别/021._merge_two_sorted_lists.md) +* [](/docs/某类别/022._generate_parentheses.md) +* [](/docs/某类别/023._merge_k_sorted_lists.md) +* [](/docs/某类别/024._swap_nodes_in_pairs.md) +* [](/docs/某类别/026._Remove_Duplicates_from_Sorted_Array.md) +* [](/docs/某类别/027._Remove_Element.md) +* [](/docs/某类别/028._implement_strstr().md) +* [](/docs/某类别/030._Substring_with_Concatenation_of_All_Words.md) +* [](/docs/某类别/031._next_permutation.md) +* [](/docs/某类别/033._search_in_rotated_sorted_array.md) +* [](/docs/某类别/034._SearchforaRange.md) +* [](/docs/某类别/035._search_insert_position.md) +* [](/docs/某类别/038._Count_and_Say.md) +* [](/docs/某类别/039._combination_sum.md) +* [](/docs/某类别/040._combination_sum_ii.md) +* [](/docs/某类别/042._trapping_rain_water.md) +* [](/docs/某类别/043._multiply_strings.md) +* [](/docs/某类别/044._wildcard_matching.md) +* [](/docs/某类别/045._Jump_Game_II.md) +* [](/docs/某类别/046._permutations.md) +* [](/docs/某类别/047._permutations_ii.md) +* [](/docs/某类别/048._rotate_image.md) +* [](/docs/某类别/049._group_anagrams_python.md) +* [](/docs/某类别/050._pow(x,_n).md) +* [](/docs/某类别/051._n-queens.md) +* [](/docs/某类别/052._n-queens_ii.md) +* [](/docs/某类别/053._maximum_subarray.md) +* [](/docs/某类别/054._spiral_matrix.md) +* [](/docs/某类别/055._jump_game.md) +* [](/docs/某类别/056._Merge_Intervals.md) +* [](/docs/某类别/058._length_of_last_word.md) +* [](/docs/某类别/059._spiral_matrix_ii.md) +* [](/docs/某类别/060._permutation_sequence.md) +* [](/docs/某类别/061._rotate_list.md) +* [](/docs/某类别/064._minimum_path_sum.md) +* [](/docs/某类别/065.unique_paths_ii.md) +* [](/docs/某类别/066._plus_one.md) +* [](/docs/某类别/067._add_binary.md) +* [](/docs/某类别/069._sqrt(x).md) +* [](/docs/某类别/070.ClimbingStairs.md) +* [](/docs/某类别/072._edit_distance.md) +* [](/docs/某类别/073.SetMatrixZeroes.md) +* [](/docs/某类别/074._search_a_2d_matrix.md) +* [](/docs/某类别/075._sort_colors.md) +* [](/docs/某类别/076._Minimum_Window_Substring.md) +* [](/docs/某类别/077._combinations.md) +* [](/docs/某类别/078.Subsets.md) +* [](/docs/某类别/079._word_search.md) +* [](/docs/某类别/082._remove_duplicates_from_sorted_list_ii.md) +* [](/docs/某类别/083._remove_duplicates_from_sorted_list.md) +* [](/docs/某类别/086._partition_list.md) +* [](/docs/某类别/088._merge_sorted_array.md) +* [](/docs/某类别/089._gray_code.md) +* [](/docs/某类别/090._subsets_ii.md) +* [](/docs/某类别/091._decode_ways.md) +* [](/docs/某类别/092._reverse_linked_list_ii.md) +* [](/docs/某类别/093._restore_ip_addresses.md) +* [](/docs/某类别/094._binary_tree_inorder_traversal.md) +* [](/docs/某类别/096._unique_binary_search_trees.md) +* [](/docs/某类别/098._validate_binary_search_tree.md) +* [](/docs/某类别/100._same_tree.md) +* [](/docs/某类别/101._symmetric_tree.md) +* [](/docs/某类别/102._binary_tree_level_order_traversal.md) +* [](/docs/某类别/103._binary_tree_zigzag_level_order_traversal.md) +* [](/docs/某类别/104._maximum_depth_of_binary_tree.md) +* [](/docs/某类别/105._construct_binary_tree_from_preorder_and_inorder_traversal.md) +* [](/docs/某类别/106._construct_binary_tree_from_inorder_and_postorder_traversal.md) +* [](/docs/某类别/107._binary_tree_level_order_traversal_ii.md) +* [](/docs/某类别/108._convert_sorted_array_to_binary_search_tree.md) +* [](/docs/某类别/109._convert_sorted_list_to_binary_search_tree.md) +* [](/docs/某类别/110._balanced_binary_tree.md) +* [](/docs/某类别/111._minimum_depth_of_binary_tree.md) +* [](/docs/某类别/112._path_sum.md) +* [](/docs/某类别/113._path_sum_ii.md) +* [](/docs/某类别/114._flatten_binary_tree_to_linked_list.md) +* [](/docs/某类别/116._populating_next_right_pointers_in_each_node.md) +* [](/docs/某类别/118._pascal's_triangle.md) +* [](/docs/某类别/119.Pascal'sTriangleII.md) +* [](/docs/某类别/120.Triangle.md) +* [](/docs/某类别/121._Best_Time_to_Buy_and_Sell_Stock.md) +* [](/docs/某类别/125._valid_palindrome.md) +* [](/docs/某类别/126.WordLadderII.md) +* [](/docs/某类别/127._word_ladder.md) +* [](/docs/某类别/128._Longest_Consecutive_Sequence.md) +* [](/docs/某类别/129._sum_root_to_leaf_numbers.md) +* [](/docs/某类别/130._surrounded_regions.md) +* [](/docs/某类别/131._palindrome_partitioning.md) +* [](/docs/某类别/133._clone_graph.md) +* [](/docs/某类别/136._single_number.md) +* [](/docs/某类别/139._word_break.md) +* [](/docs/某类别/140._word_break_ii.md) +* [](/docs/某类别/141._linked_list_cycle.md) +* [](/docs/某类别/142_Linked_List_Cycle_II.md) +* [](/docs/某类别/143._reorder_list.md) +* [](/docs/某类别/144._binary_tree_preorder_traversal.md) +* [](/docs/某类别/145._binary_tree_postorder_traversal.md) +* [](/docs/某类别/147._insertion_sort_list.md) +* [](/docs/某类别/148._sort_list.md) +* [](/docs/某类别/150._evaluate_reverse_polish_notation.md) +* [](/docs/某类别/151._reverse_words_in_a_string.md) +* [](/docs/某类别/152._maximum_product_subarray.md) +* [](/docs/某类别/153._find_minimum_in_rotated_sorted_array.md) +* [](/docs/某类别/155._min_stack.md) +* [](/docs/某类别/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md) +* [](/docs/某类别/160._intersection_of_two_linked_lists.md) +* [](/docs/某类别/162._find_peak_element.md) +* [](/docs/某类别/165._compare_version_numbers.md) +* [](/docs/某类别/166._Fraction_to_Recurring_Decimal.md) +* [](/docs/某类别/167._two_sum_ii_-_input_array_is_sorted.md) +* [](/docs/某类别/168._excel_sheet_column_title.md) +* [](/docs/某类别/169._majority_element.md) +* [](/docs/某类别/171._excel_sheet_column_number.md) +* [](/docs/某类别/173._binary_search_tree_iterator.md) +* [](/docs/某类别/189._rotate_array.md) +* [](/docs/某类别/191._number_of_1_bits.md) +* [](/docs/某类别/198._house_robber.md) +* [](/docs/某类别/199._binary_tree_right_side_view.md) +* [](/docs/某类别/200._number_of_islands.md) +* [](/docs/某类别/203._remove_linked_list_elements.md) +* [](/docs/某类别/204._count_primes.md) +* [](/docs/某类别/205._isomorphic_strings.md) +* [](/docs/某类别/206._reverse_linked_list.md) +* [](/docs/某类别/207._course_schedule.md) +* [](/docs/某类别/208._implement_trie_(prefix_tree).md) +* [](/docs/某类别/210._course_schedule_ii.md) +* [](/docs/某类别/211.AddandSearchWord-Datastructuredesign.md) +* [](/docs/某类别/213._house_robber_ii.md) +* [](/docs/某类别/216._combination_sum_iii.md) +* [](/docs/某类别/217._contains_duplicate.md) +* [](/docs/某类别/218._The_Skyline_Problem.md) +* [](/docs/某类别/219._contains_duplicate_ii.md) +* [](/docs/某类别/221._maximal_square.md) +* [](/docs/某类别/222._count_complete_tree_nodes.md) +* [](/docs/某类别/223._rectangle_area.md) +* [](/docs/某类别/224.BasicCalculator.md) +* [](/docs/某类别/225._implement_stack_using_queues.md) +* [](/docs/某类别/226._invert_binary_tree.md) +* [](/docs/某类别/227._basic_calculator_ii.md) +* [](/docs/某类别/228._summary_ranges.md) +* [](/docs/某类别/229._majority_element_ii.md) +* [](/docs/某类别/230._kth_smallest_element_in_a_bst.md) +* [](/docs/某类别/231._Power_of_Two.md) +* [](/docs/某类别/232._implement_queue_using_stacks.md) +* [](/docs/某类别/234._palindrome_linked_list.md) +* [](/docs/某类别/235._lowest_common_ancestor_of_a_binary_search_tree.md) +* [](/docs/某类别/236._lowest_common_ancestor_of_a_binary_tree.md) +* [](/docs/某类别/237._delete_node_in_a_linked_list.md) +* [](/docs/某类别/238._product_of_array_except_self.md) +* [](/docs/某类别/240._search_a_2d_matrix_ii.md) +* [](/docs/某类别/242._valid_anagram.md) +* [](/docs/某类别/252.MeetingRooms.md) +* [](/docs/某类别/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md) +* [](/docs/某类别/256.PaintHouse.md) +* [](/docs/某类别/257._binary_tree_paths.md) +* [](/docs/某类别/258_Add_Digits.md) +* [](/docs/某类别/261.GraphValidTree.md) +* [](/docs/某类别/263._ugly_number.md) +* [](/docs/某类别/264._ugly_number_ii.md) +* [](/docs/某类别/265.PaintHouseII.md) +* [](/docs/某类别/266.PalindromePermutation.md) +* [](/docs/某类别/267.PalindromePermutationII.md) +* [](/docs/某类别/268._missing_number.md) +* [](/docs/某类别/270.ClosestBinarySearchTreeValue.md) +* [](/docs/某类别/276.PaintFence.md) +* [](/docs/某类别/277.FindtheCelebrity.md) +* [](/docs/某类别/278._First_Bad_Version.md) +* [](/docs/某类别/279._perfect_squares.md) +* [](/docs/某类别/280._Wiggle_Sort.md) +* [](/docs/某类别/283._move_zeroes.md) +* [](/docs/某类别/285._inorder_successor_in_bst.md) +* [](/docs/某类别/286.WallsandGates.md) +* [](/docs/某类别/289._game_of_life.md) +* [](/docs/某类别/290._word_pattern.md) +* [](/docs/某类别/292._nim_game.md) +* [](/docs/某类别/296.BestMeetingPoint.md) +* [](/docs/某类别/298.BinaryTreeLongestConsecutiveSequence.md) +* [](/docs/某类别/299._bulls_and_cows.md) +* [](/docs/某类别/300._longest_increasing_subsequence.md) +* [](/docs/某类别/303._range_sum_query_-_immutable.md) +* [](/docs/某类别/316._Remove_Duplicate_Letters.md) +* [](/docs/某类别/319._Bulb_Switcher.md) +* [](/docs/某类别/322.CoinChange.md) +* [](/docs/某类别/323.NumberofConnectedComponentsinanUndirectedGraph.md) +* [](/docs/某类别/324._Wiggle_Sort_II.md) +* [](/docs/某类别/326._power_of_three.md) +* [](/docs/某类别/328._odd_even_linked_list.md) +* [](/docs/某类别/334._increasing_triplet_subsequence.md) +* [](/docs/某类别/337._house_robber_iii.md) +* [](/docs/某类别/338.CountingBits.md) +* [](/docs/某类别/339.NestedListWeightSum.md) +* [](/docs/某类别/341._Flatten_Nested_List_Iterator.md) +* [](/docs/某类别/342._Power_of_Four.md) +* [](/docs/某类别/344._reverse_string.md) +* [](/docs/某类别/345._Reverse_Vowels_of_a_String.md) +* [](/docs/某类别/349._intersection_of_two_arrays.md) +* [](/docs/某类别/350._intersection_of_two_arrays_ii.md) +* [](/docs/某类别/353.DesignSnakeGame.md) +* [](/docs/某类别/364.NestedListWeightSumII.md) +* [](/docs/某类别/366.FindLeavesofBinaryTree.md) +* [](/docs/某类别/367._valid_perfect_square.md) +* [](/docs/某类别/369.PlusOneLinkedList.md) +* [](/docs/某类别/371._sum_of_two_integers.md) +* [](/docs/某类别/374._Guess_Number_Higher_or_Lower.md) +* [](/docs/某类别/377._combination_sum_iv.md) +* [](/docs/某类别/378._kth_smallest_element_in_a_sorted_matrix.md) +* [](/docs/某类别/380.InsertDeleteGetRandomO(1).md) +* [](/docs/某类别/381.InsertDeleteGetRandomO(1)-Duplicatesallowed.md) +* [](/docs/某类别/382._linked_list_random_node.md) +* [](/docs/某类别/383._ransom_note.md) +* [](/docs/某类别/384.ShuffleanArray.md) +* [](/docs/某类别/387._first_unique_character_in_a_string.md) +* [](/docs/某类别/388._Longest_Absolute_File_Path.md) +* [](/docs/某类别/389._find_the_difference.md) +* [](/docs/某类别/392._is_subsequence.md) +* [](/docs/某类别/394._decode_string.md) +* [](/docs/某类别/400.NthDigit.md) +* [](/docs/某类别/401._binary_watch.md) +* [](/docs/某类别/404._sum_of_left_leaves.md) +* [](/docs/某类别/405.ConvertaNumbertoHexadecimal.md) +* [](/docs/某类别/406._Queue_Reconstruction_by_Height.md) +* [](/docs/某类别/412._fizz_buzz.md) +* [](/docs/某类别/413.ArithmeticSlices.md) +* [](/docs/某类别/414._third_maximum_number.md) +* [](/docs/某类别/415._add_strings.md) +* [](/docs/某类别/416.PartitionEqualSubsetSum.md) +* [](/docs/某类别/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md) +* [](/docs/某类别/422.ValidWordSquare.md) +* [](/docs/某类别/434._number_of_segments_in_a_string.md) +* [](/docs/某类别/437._path_sum_iii.md) +* [](/docs/某类别/438._Find_All_Anagrams_in_a_String.md) +* [](/docs/某类别/439.TernaryExpressionParser.md) +* [](/docs/某类别/441._arranging_coins.md) +* [](/docs/某类别/448._Find_All_Numbers_Disappeared_in_an_Array.md) +* [](/docs/某类别/450.DeleteNodeinaBST.md) +* [](/docs/某类别/453._Minimum_Moves_to_Equal_Array_Elements.md) +* [](/docs/某类别/459._Repeated_Substring_Pattern.md) +* [](/docs/某类别/461._HammingDistance.md) +* [](/docs/某类别/463._Island_Perimeter.md) +* [](/docs/某类别/467._Unique_Substrings_in_Wraparound_String.md) +* [](/docs/某类别/469.ConvexPolygon.md) +* [](/docs/某类别/476._Number_Complement.md) +* [](/docs/某类别/477._Total_Hamming_Distance.md) +* [](/docs/某类别/485._Max_Consecutive_Ones.md) +* [](/docs/某类别/587._Erect_the_Fence.md) +* [](/docs/某类别/599._Minimum_Index_Sum_of_Two_Lists.md) +* [](/docs/某类别/647._Palindromic_Substrings.md) +* [](/docs/某类别/657._Judge_Route_Circle.md) +* [](/docs/某类别/665._Non-decreasing_Array.md) +* [](/docs/某类别/672._Bulb_Switcher_II.md) +* [](/docs/某类别/681._Next_Closest_Time.md) +* [](/docs/某类别/682._Baseball_Game.md) +* [](/docs/某类别/687._Longest_Univalue_Path.md) +* [](/docs/某类别/740._delete_and_earn.md) +* [](/docs/某类别/760._Find_Anagram_Mappings.md) + +## 推荐的一些LeetCode网站 + +1. [KrisYu的GItuhub](https://github.com/KrisYu/LeetCode-CLRS-Python) +2. [kamyu104的Github](https://github.com/kamyu104/LeetCode) +3. [数据结构与算法/leetcode/lintcode题解](https://algorithm.yuanbin.me/zh-hans/) +4. [Leetcode 讨论区](https://discuss.leetcode.com/) +5. [visualgo算法可视化网站](https://visualgo.net/en) +6. [Data Structure Visualization](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) +7. [我的算法学习之路 - Lucida](http://zh.lucida.me/blog/on-learning-algorithms/) +8. [HiredInTech](https://www.hiredintech.com/) System Design 的总结特别适合入门 +9. [mitcc的Github](https://github.com/mitcc/AlgoSolutions) +10. [小土刀的面试刷题笔记](http://wdxtub.com/interview/14520594642530.html) + + +### Please note, this repository is inspired from [KrisYu](https://github.com/KrisYu/LeetCode-CLRS-Python). However, it has been modified, added and improved to reflect our knowledge, wisdom and effort. + + - 💪就是干! From 1176df3b3b7aec8381f721307c48da7530683d93 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:30:23 -0500 Subject: [PATCH 456/473] Update README.md --- docs/Algorithm Templates/README.md | 315 +---------------------------- 1 file changed, 1 insertion(+), 314 deletions(-) diff --git a/docs/Algorithm Templates/README.md b/docs/Algorithm Templates/README.md index f9547934f..d5e46e7c8 100644 --- a/docs/Algorithm Templates/README.md +++ b/docs/Algorithm Templates/README.md @@ -1,314 +1 @@ -# LeetCode 面试题 - -## [八大排序算法](/docs/SortingAlgorithm/README.md) - -![](/images/SortingAlgorithm/八大排序算法性能.png) - -| 名称 | 动图 | 代码 | -| --- | --- | --- | -| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/BubbleSort.py) | -| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | -| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | -| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | -| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | -| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | -| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | - -## 面试问答 - -* [Google面试题](/docs/interview/Google/Google.md) -* [pocketgems 面试题](/docs/interview/pocketgems/pocketgems.md) -* [WePay 面试题](/docs/interview/WePay/WePay.md) - -## LeetCode算法题 - -* [](docs/某类别/001._two_sum.md) -* [](/docs/某类别/002._add_two_numbers.md) -* [](/docs/某类别/003._longest_substring_without_repeating_characters.md) -* [](/docs/某类别/004._median_of_two_sorted_arrays.md) -* [](/docs/某类别/005._longest_palindromic_substring.md) -* [](/docs/某类别/007._Reverse_Integer.md) -* [](/docs/某类别/008._string_to_integer_(atoi).md) -* [](/docs/某类别/010._regular_expression_matching.md) -* [](/docs/某类别/011._container_with_most_water.md) -* [](/docs/某类别/012._Integer_to_Roman.md) -* [](/docs/某类别/013._Roman_to_Integer.md) -* [](/docs/某类别/014._longest_common_prefix.md) -* [](/docs/某类别/015._3sum.md) -* [](/docs/某类别/016._3sum_closest.md) -* [](/docs/某类别/017._letter_combinations_of_a_phone_number.md) -* [](/docs/某类别/018._4sum.md) -* [](/docs/某类别/019._remove_nth_node_from_end_of_list.md) -* [](/docs/某类别/020._valid_parentheses.md) -* [](/docs/某类别/021._merge_two_sorted_lists.md) -* [](/docs/某类别/022._generate_parentheses.md) -* [](/docs/某类别/023._merge_k_sorted_lists.md) -* [](/docs/某类别/024._swap_nodes_in_pairs.md) -* [](/docs/某类别/026._Remove_Duplicates_from_Sorted_Array.md) -* [](/docs/某类别/027._Remove_Element.md) -* [](/docs/某类别/028._implement_strstr().md) -* [](/docs/某类别/030._Substring_with_Concatenation_of_All_Words.md) -* [](/docs/某类别/031._next_permutation.md) -* [](/docs/某类别/033._search_in_rotated_sorted_array.md) -* [](/docs/某类别/034._SearchforaRange.md) -* [](/docs/某类别/035._search_insert_position.md) -* [](/docs/某类别/038._Count_and_Say.md) -* [](/docs/某类别/039._combination_sum.md) -* [](/docs/某类别/040._combination_sum_ii.md) -* [](/docs/某类别/042._trapping_rain_water.md) -* [](/docs/某类别/043._multiply_strings.md) -* [](/docs/某类别/044._wildcard_matching.md) -* [](/docs/某类别/045._Jump_Game_II.md) -* [](/docs/某类别/046._permutations.md) -* [](/docs/某类别/047._permutations_ii.md) -* [](/docs/某类别/048._rotate_image.md) -* [](/docs/某类别/049._group_anagrams_python.md) -* [](/docs/某类别/050._pow(x,_n).md) -* [](/docs/某类别/051._n-queens.md) -* [](/docs/某类别/052._n-queens_ii.md) -* [](/docs/某类别/053._maximum_subarray.md) -* [](/docs/某类别/054._spiral_matrix.md) -* [](/docs/某类别/055._jump_game.md) -* [](/docs/某类别/056._Merge_Intervals.md) -* [](/docs/某类别/058._length_of_last_word.md) -* [](/docs/某类别/059._spiral_matrix_ii.md) -* [](/docs/某类别/060._permutation_sequence.md) -* [](/docs/某类别/061._rotate_list.md) -* [](/docs/某类别/064._minimum_path_sum.md) -* [](/docs/某类别/065.unique_paths_ii.md) -* [](/docs/某类别/066._plus_one.md) -* [](/docs/某类别/067._add_binary.md) -* [](/docs/某类别/069._sqrt(x).md) -* [](/docs/某类别/070.ClimbingStairs.md) -* [](/docs/某类别/072._edit_distance.md) -* [](/docs/某类别/073.SetMatrixZeroes.md) -* [](/docs/某类别/074._search_a_2d_matrix.md) -* [](/docs/某类别/075._sort_colors.md) -* [](/docs/某类别/076._Minimum_Window_Substring.md) -* [](/docs/某类别/077._combinations.md) -* [](/docs/某类别/078.Subsets.md) -* [](/docs/某类别/079._word_search.md) -* [](/docs/某类别/082._remove_duplicates_from_sorted_list_ii.md) -* [](/docs/某类别/083._remove_duplicates_from_sorted_list.md) -* [](/docs/某类别/086._partition_list.md) -* [](/docs/某类别/088._merge_sorted_array.md) -* [](/docs/某类别/089._gray_code.md) -* [](/docs/某类别/090._subsets_ii.md) -* [](/docs/某类别/091._decode_ways.md) -* [](/docs/某类别/092._reverse_linked_list_ii.md) -* [](/docs/某类别/093._restore_ip_addresses.md) -* [](/docs/某类别/094._binary_tree_inorder_traversal.md) -* [](/docs/某类别/096._unique_binary_search_trees.md) -* [](/docs/某类别/098._validate_binary_search_tree.md) -* [](/docs/某类别/100._same_tree.md) -* [](/docs/某类别/101._symmetric_tree.md) -* [](/docs/某类别/102._binary_tree_level_order_traversal.md) -* [](/docs/某类别/103._binary_tree_zigzag_level_order_traversal.md) -* [](/docs/某类别/104._maximum_depth_of_binary_tree.md) -* [](/docs/某类别/105._construct_binary_tree_from_preorder_and_inorder_traversal.md) -* [](/docs/某类别/106._construct_binary_tree_from_inorder_and_postorder_traversal.md) -* [](/docs/某类别/107._binary_tree_level_order_traversal_ii.md) -* [](/docs/某类别/108._convert_sorted_array_to_binary_search_tree.md) -* [](/docs/某类别/109._convert_sorted_list_to_binary_search_tree.md) -* [](/docs/某类别/110._balanced_binary_tree.md) -* [](/docs/某类别/111._minimum_depth_of_binary_tree.md) -* [](/docs/某类别/112._path_sum.md) -* [](/docs/某类别/113._path_sum_ii.md) -* [](/docs/某类别/114._flatten_binary_tree_to_linked_list.md) -* [](/docs/某类别/116._populating_next_right_pointers_in_each_node.md) -* [](/docs/某类别/118._pascal's_triangle.md) -* [](/docs/某类别/119.Pascal'sTriangleII.md) -* [](/docs/某类别/120.Triangle.md) -* [](/docs/某类别/121._Best_Time_to_Buy_and_Sell_Stock.md) -* [](/docs/某类别/125._valid_palindrome.md) -* [](/docs/某类别/126.WordLadderII.md) -* [](/docs/某类别/127._word_ladder.md) -* [](/docs/某类别/128._Longest_Consecutive_Sequence.md) -* [](/docs/某类别/129._sum_root_to_leaf_numbers.md) -* [](/docs/某类别/130._surrounded_regions.md) -* [](/docs/某类别/131._palindrome_partitioning.md) -* [](/docs/某类别/133._clone_graph.md) -* [](/docs/某类别/136._single_number.md) -* [](/docs/某类别/139._word_break.md) -* [](/docs/某类别/140._word_break_ii.md) -* [](/docs/某类别/141._linked_list_cycle.md) -* [](/docs/某类别/142_Linked_List_Cycle_II.md) -* [](/docs/某类别/143._reorder_list.md) -* [](/docs/某类别/144._binary_tree_preorder_traversal.md) -* [](/docs/某类别/145._binary_tree_postorder_traversal.md) -* [](/docs/某类别/147._insertion_sort_list.md) -* [](/docs/某类别/148._sort_list.md) -* [](/docs/某类别/150._evaluate_reverse_polish_notation.md) -* [](/docs/某类别/151._reverse_words_in_a_string.md) -* [](/docs/某类别/152._maximum_product_subarray.md) -* [](/docs/某类别/153._find_minimum_in_rotated_sorted_array.md) -* [](/docs/某类别/155._min_stack.md) -* [](/docs/某类别/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md) -* [](/docs/某类别/160._intersection_of_two_linked_lists.md) -* [](/docs/某类别/162._find_peak_element.md) -* [](/docs/某类别/165._compare_version_numbers.md) -* [](/docs/某类别/166._Fraction_to_Recurring_Decimal.md) -* [](/docs/某类别/167._two_sum_ii_-_input_array_is_sorted.md) -* [](/docs/某类别/168._excel_sheet_column_title.md) -* [](/docs/某类别/169._majority_element.md) -* [](/docs/某类别/171._excel_sheet_column_number.md) -* [](/docs/某类别/173._binary_search_tree_iterator.md) -* [](/docs/某类别/189._rotate_array.md) -* [](/docs/某类别/191._number_of_1_bits.md) -* [](/docs/某类别/198._house_robber.md) -* [](/docs/某类别/199._binary_tree_right_side_view.md) -* [](/docs/某类别/200._number_of_islands.md) -* [](/docs/某类别/203._remove_linked_list_elements.md) -* [](/docs/某类别/204._count_primes.md) -* [](/docs/某类别/205._isomorphic_strings.md) -* [](/docs/某类别/206._reverse_linked_list.md) -* [](/docs/某类别/207._course_schedule.md) -* [](/docs/某类别/208._implement_trie_(prefix_tree).md) -* [](/docs/某类别/210._course_schedule_ii.md) -* [](/docs/某类别/211.AddandSearchWord-Datastructuredesign.md) -* [](/docs/某类别/213._house_robber_ii.md) -* [](/docs/某类别/216._combination_sum_iii.md) -* [](/docs/某类别/217._contains_duplicate.md) -* [](/docs/某类别/218._The_Skyline_Problem.md) -* [](/docs/某类别/219._contains_duplicate_ii.md) -* [](/docs/某类别/221._maximal_square.md) -* [](/docs/某类别/222._count_complete_tree_nodes.md) -* [](/docs/某类别/223._rectangle_area.md) -* [](/docs/某类别/224.BasicCalculator.md) -* [](/docs/某类别/225._implement_stack_using_queues.md) -* [](/docs/某类别/226._invert_binary_tree.md) -* [](/docs/某类别/227._basic_calculator_ii.md) -* [](/docs/某类别/228._summary_ranges.md) -* [](/docs/某类别/229._majority_element_ii.md) -* [](/docs/某类别/230._kth_smallest_element_in_a_bst.md) -* [](/docs/某类别/231._Power_of_Two.md) -* [](/docs/某类别/232._implement_queue_using_stacks.md) -* [](/docs/某类别/234._palindrome_linked_list.md) -* [](/docs/某类别/235._lowest_common_ancestor_of_a_binary_search_tree.md) -* [](/docs/某类别/236._lowest_common_ancestor_of_a_binary_tree.md) -* [](/docs/某类别/237._delete_node_in_a_linked_list.md) -* [](/docs/某类别/238._product_of_array_except_self.md) -* [](/docs/某类别/240._search_a_2d_matrix_ii.md) -* [](/docs/某类别/242._valid_anagram.md) -* [](/docs/某类别/252.MeetingRooms.md) -* [](/docs/某类别/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md) -* [](/docs/某类别/256.PaintHouse.md) -* [](/docs/某类别/257._binary_tree_paths.md) -* [](/docs/某类别/258_Add_Digits.md) -* [](/docs/某类别/261.GraphValidTree.md) -* [](/docs/某类别/263._ugly_number.md) -* [](/docs/某类别/264._ugly_number_ii.md) -* [](/docs/某类别/265.PaintHouseII.md) -* [](/docs/某类别/266.PalindromePermutation.md) -* [](/docs/某类别/267.PalindromePermutationII.md) -* [](/docs/某类别/268._missing_number.md) -* [](/docs/某类别/270.ClosestBinarySearchTreeValue.md) -* [](/docs/某类别/276.PaintFence.md) -* [](/docs/某类别/277.FindtheCelebrity.md) -* [](/docs/某类别/278._First_Bad_Version.md) -* [](/docs/某类别/279._perfect_squares.md) -* [](/docs/某类别/280._Wiggle_Sort.md) -* [](/docs/某类别/283._move_zeroes.md) -* [](/docs/某类别/285._inorder_successor_in_bst.md) -* [](/docs/某类别/286.WallsandGates.md) -* [](/docs/某类别/289._game_of_life.md) -* [](/docs/某类别/290._word_pattern.md) -* [](/docs/某类别/292._nim_game.md) -* [](/docs/某类别/296.BestMeetingPoint.md) -* [](/docs/某类别/298.BinaryTreeLongestConsecutiveSequence.md) -* [](/docs/某类别/299._bulls_and_cows.md) -* [](/docs/某类别/300._longest_increasing_subsequence.md) -* [](/docs/某类别/303._range_sum_query_-_immutable.md) -* [](/docs/某类别/316._Remove_Duplicate_Letters.md) -* [](/docs/某类别/319._Bulb_Switcher.md) -* [](/docs/某类别/322.CoinChange.md) -* [](/docs/某类别/323.NumberofConnectedComponentsinanUndirectedGraph.md) -* [](/docs/某类别/324._Wiggle_Sort_II.md) -* [](/docs/某类别/326._power_of_three.md) -* [](/docs/某类别/328._odd_even_linked_list.md) -* [](/docs/某类别/334._increasing_triplet_subsequence.md) -* [](/docs/某类别/337._house_robber_iii.md) -* [](/docs/某类别/338.CountingBits.md) -* [](/docs/某类别/339.NestedListWeightSum.md) -* [](/docs/某类别/341._Flatten_Nested_List_Iterator.md) -* [](/docs/某类别/342._Power_of_Four.md) -* [](/docs/某类别/344._reverse_string.md) -* [](/docs/某类别/345._Reverse_Vowels_of_a_String.md) -* [](/docs/某类别/349._intersection_of_two_arrays.md) -* [](/docs/某类别/350._intersection_of_two_arrays_ii.md) -* [](/docs/某类别/353.DesignSnakeGame.md) -* [](/docs/某类别/364.NestedListWeightSumII.md) -* [](/docs/某类别/366.FindLeavesofBinaryTree.md) -* [](/docs/某类别/367._valid_perfect_square.md) -* [](/docs/某类别/369.PlusOneLinkedList.md) -* [](/docs/某类别/371._sum_of_two_integers.md) -* [](/docs/某类别/374._Guess_Number_Higher_or_Lower.md) -* [](/docs/某类别/377._combination_sum_iv.md) -* [](/docs/某类别/378._kth_smallest_element_in_a_sorted_matrix.md) -* [](/docs/某类别/380.InsertDeleteGetRandomO(1).md) -* [](/docs/某类别/381.InsertDeleteGetRandomO(1)-Duplicatesallowed.md) -* [](/docs/某类别/382._linked_list_random_node.md) -* [](/docs/某类别/383._ransom_note.md) -* [](/docs/某类别/384.ShuffleanArray.md) -* [](/docs/某类别/387._first_unique_character_in_a_string.md) -* [](/docs/某类别/388._Longest_Absolute_File_Path.md) -* [](/docs/某类别/389._find_the_difference.md) -* [](/docs/某类别/392._is_subsequence.md) -* [](/docs/某类别/394._decode_string.md) -* [](/docs/某类别/400.NthDigit.md) -* [](/docs/某类别/401._binary_watch.md) -* [](/docs/某类别/404._sum_of_left_leaves.md) -* [](/docs/某类别/405.ConvertaNumbertoHexadecimal.md) -* [](/docs/某类别/406._Queue_Reconstruction_by_Height.md) -* [](/docs/某类别/412._fizz_buzz.md) -* [](/docs/某类别/413.ArithmeticSlices.md) -* [](/docs/某类别/414._third_maximum_number.md) -* [](/docs/某类别/415._add_strings.md) -* [](/docs/某类别/416.PartitionEqualSubsetSum.md) -* [](/docs/某类别/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md) -* [](/docs/某类别/422.ValidWordSquare.md) -* [](/docs/某类别/434._number_of_segments_in_a_string.md) -* [](/docs/某类别/437._path_sum_iii.md) -* [](/docs/某类别/438._Find_All_Anagrams_in_a_String.md) -* [](/docs/某类别/439.TernaryExpressionParser.md) -* [](/docs/某类别/441._arranging_coins.md) -* [](/docs/某类别/448._Find_All_Numbers_Disappeared_in_an_Array.md) -* [](/docs/某类别/450.DeleteNodeinaBST.md) -* [](/docs/某类别/453._Minimum_Moves_to_Equal_Array_Elements.md) -* [](/docs/某类别/459._Repeated_Substring_Pattern.md) -* [](/docs/某类别/461._HammingDistance.md) -* [](/docs/某类别/463._Island_Perimeter.md) -* [](/docs/某类别/467._Unique_Substrings_in_Wraparound_String.md) -* [](/docs/某类别/469.ConvexPolygon.md) -* [](/docs/某类别/476._Number_Complement.md) -* [](/docs/某类别/477._Total_Hamming_Distance.md) -* [](/docs/某类别/485._Max_Consecutive_Ones.md) -* [](/docs/某类别/587._Erect_the_Fence.md) -* [](/docs/某类别/599._Minimum_Index_Sum_of_Two_Lists.md) -* [](/docs/某类别/647._Palindromic_Substrings.md) -* [](/docs/某类别/657._Judge_Route_Circle.md) -* [](/docs/某类别/665._Non-decreasing_Array.md) -* [](/docs/某类别/672._Bulb_Switcher_II.md) -* [](/docs/某类别/681._Next_Closest_Time.md) -* [](/docs/某类别/682._Baseball_Game.md) -* [](/docs/某类别/687._Longest_Univalue_Path.md) -* [](/docs/某类别/740._delete_and_earn.md) -* [](/docs/某类别/760._Find_Anagram_Mappings.md) - -## 推荐的一些LeetCode网站 - -1. [KrisYu的GItuhub](https://github.com/KrisYu/LeetCode-CLRS-Python) -2. [kamyu104的Github](https://github.com/kamyu104/LeetCode) -3. [数据结构与算法/leetcode/lintcode题解](https://algorithm.yuanbin.me/zh-hans/) -4. [Leetcode 讨论区](https://discuss.leetcode.com/) -5. [visualgo算法可视化网站](https://visualgo.net/en) -6. [Data Structure Visualization](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) -7. [我的算法学习之路 - Lucida](http://zh.lucida.me/blog/on-learning-algorithms/) -8. [HiredInTech](https://www.hiredintech.com/) System Design 的总结特别适合入门 -9. [mitcc的Github](https://github.com/mitcc/AlgoSolutions) -10. [小土刀的面试刷题笔记](http://wdxtub.com/interview/14520594642530.html) - - -### Please note, this repository is inspired from [KrisYu](https://github.com/KrisYu/LeetCode-CLRS-Python). However, it has been modified, added and improved to reflect our knowledge, wisdom and effort. - - - 💪就是干! +# Some algorithm templates for better understanding! From f6f33633732595e99e78edf9bf7aa499fdd784c2 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:31:34 -0500 Subject: [PATCH 457/473] Update README.md --- images/README.md | 315 +---------------------------------------------- 1 file changed, 1 insertion(+), 314 deletions(-) diff --git a/images/README.md b/images/README.md index f9547934f..d71e82389 100644 --- a/images/README.md +++ b/images/README.md @@ -1,314 +1 @@ -# LeetCode 面试题 - -## [八大排序算法](/docs/SortingAlgorithm/README.md) - -![](/images/SortingAlgorithm/八大排序算法性能.png) - -| 名称 | 动图 | 代码 | -| --- | --- | --- | -| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/BubbleSort.py) | -| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | -| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | -| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | -| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | -| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | -| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | - -## 面试问答 - -* [Google面试题](/docs/interview/Google/Google.md) -* [pocketgems 面试题](/docs/interview/pocketgems/pocketgems.md) -* [WePay 面试题](/docs/interview/WePay/WePay.md) - -## LeetCode算法题 - -* [](docs/某类别/001._two_sum.md) -* [](/docs/某类别/002._add_two_numbers.md) -* [](/docs/某类别/003._longest_substring_without_repeating_characters.md) -* [](/docs/某类别/004._median_of_two_sorted_arrays.md) -* [](/docs/某类别/005._longest_palindromic_substring.md) -* [](/docs/某类别/007._Reverse_Integer.md) -* [](/docs/某类别/008._string_to_integer_(atoi).md) -* [](/docs/某类别/010._regular_expression_matching.md) -* [](/docs/某类别/011._container_with_most_water.md) -* [](/docs/某类别/012._Integer_to_Roman.md) -* [](/docs/某类别/013._Roman_to_Integer.md) -* [](/docs/某类别/014._longest_common_prefix.md) -* [](/docs/某类别/015._3sum.md) -* [](/docs/某类别/016._3sum_closest.md) -* [](/docs/某类别/017._letter_combinations_of_a_phone_number.md) -* [](/docs/某类别/018._4sum.md) -* [](/docs/某类别/019._remove_nth_node_from_end_of_list.md) -* [](/docs/某类别/020._valid_parentheses.md) -* [](/docs/某类别/021._merge_two_sorted_lists.md) -* [](/docs/某类别/022._generate_parentheses.md) -* [](/docs/某类别/023._merge_k_sorted_lists.md) -* [](/docs/某类别/024._swap_nodes_in_pairs.md) -* [](/docs/某类别/026._Remove_Duplicates_from_Sorted_Array.md) -* [](/docs/某类别/027._Remove_Element.md) -* [](/docs/某类别/028._implement_strstr().md) -* [](/docs/某类别/030._Substring_with_Concatenation_of_All_Words.md) -* [](/docs/某类别/031._next_permutation.md) -* [](/docs/某类别/033._search_in_rotated_sorted_array.md) -* [](/docs/某类别/034._SearchforaRange.md) -* [](/docs/某类别/035._search_insert_position.md) -* [](/docs/某类别/038._Count_and_Say.md) -* [](/docs/某类别/039._combination_sum.md) -* [](/docs/某类别/040._combination_sum_ii.md) -* [](/docs/某类别/042._trapping_rain_water.md) -* [](/docs/某类别/043._multiply_strings.md) -* [](/docs/某类别/044._wildcard_matching.md) -* [](/docs/某类别/045._Jump_Game_II.md) -* [](/docs/某类别/046._permutations.md) -* [](/docs/某类别/047._permutations_ii.md) -* [](/docs/某类别/048._rotate_image.md) -* [](/docs/某类别/049._group_anagrams_python.md) -* [](/docs/某类别/050._pow(x,_n).md) -* [](/docs/某类别/051._n-queens.md) -* [](/docs/某类别/052._n-queens_ii.md) -* [](/docs/某类别/053._maximum_subarray.md) -* [](/docs/某类别/054._spiral_matrix.md) -* [](/docs/某类别/055._jump_game.md) -* [](/docs/某类别/056._Merge_Intervals.md) -* [](/docs/某类别/058._length_of_last_word.md) -* [](/docs/某类别/059._spiral_matrix_ii.md) -* [](/docs/某类别/060._permutation_sequence.md) -* [](/docs/某类别/061._rotate_list.md) -* [](/docs/某类别/064._minimum_path_sum.md) -* [](/docs/某类别/065.unique_paths_ii.md) -* [](/docs/某类别/066._plus_one.md) -* [](/docs/某类别/067._add_binary.md) -* [](/docs/某类别/069._sqrt(x).md) -* [](/docs/某类别/070.ClimbingStairs.md) -* [](/docs/某类别/072._edit_distance.md) -* [](/docs/某类别/073.SetMatrixZeroes.md) -* [](/docs/某类别/074._search_a_2d_matrix.md) -* [](/docs/某类别/075._sort_colors.md) -* [](/docs/某类别/076._Minimum_Window_Substring.md) -* [](/docs/某类别/077._combinations.md) -* [](/docs/某类别/078.Subsets.md) -* [](/docs/某类别/079._word_search.md) -* [](/docs/某类别/082._remove_duplicates_from_sorted_list_ii.md) -* [](/docs/某类别/083._remove_duplicates_from_sorted_list.md) -* [](/docs/某类别/086._partition_list.md) -* [](/docs/某类别/088._merge_sorted_array.md) -* [](/docs/某类别/089._gray_code.md) -* [](/docs/某类别/090._subsets_ii.md) -* [](/docs/某类别/091._decode_ways.md) -* [](/docs/某类别/092._reverse_linked_list_ii.md) -* [](/docs/某类别/093._restore_ip_addresses.md) -* [](/docs/某类别/094._binary_tree_inorder_traversal.md) -* [](/docs/某类别/096._unique_binary_search_trees.md) -* [](/docs/某类别/098._validate_binary_search_tree.md) -* [](/docs/某类别/100._same_tree.md) -* [](/docs/某类别/101._symmetric_tree.md) -* [](/docs/某类别/102._binary_tree_level_order_traversal.md) -* [](/docs/某类别/103._binary_tree_zigzag_level_order_traversal.md) -* [](/docs/某类别/104._maximum_depth_of_binary_tree.md) -* [](/docs/某类别/105._construct_binary_tree_from_preorder_and_inorder_traversal.md) -* [](/docs/某类别/106._construct_binary_tree_from_inorder_and_postorder_traversal.md) -* [](/docs/某类别/107._binary_tree_level_order_traversal_ii.md) -* [](/docs/某类别/108._convert_sorted_array_to_binary_search_tree.md) -* [](/docs/某类别/109._convert_sorted_list_to_binary_search_tree.md) -* [](/docs/某类别/110._balanced_binary_tree.md) -* [](/docs/某类别/111._minimum_depth_of_binary_tree.md) -* [](/docs/某类别/112._path_sum.md) -* [](/docs/某类别/113._path_sum_ii.md) -* [](/docs/某类别/114._flatten_binary_tree_to_linked_list.md) -* [](/docs/某类别/116._populating_next_right_pointers_in_each_node.md) -* [](/docs/某类别/118._pascal's_triangle.md) -* [](/docs/某类别/119.Pascal'sTriangleII.md) -* [](/docs/某类别/120.Triangle.md) -* [](/docs/某类别/121._Best_Time_to_Buy_and_Sell_Stock.md) -* [](/docs/某类别/125._valid_palindrome.md) -* [](/docs/某类别/126.WordLadderII.md) -* [](/docs/某类别/127._word_ladder.md) -* [](/docs/某类别/128._Longest_Consecutive_Sequence.md) -* [](/docs/某类别/129._sum_root_to_leaf_numbers.md) -* [](/docs/某类别/130._surrounded_regions.md) -* [](/docs/某类别/131._palindrome_partitioning.md) -* [](/docs/某类别/133._clone_graph.md) -* [](/docs/某类别/136._single_number.md) -* [](/docs/某类别/139._word_break.md) -* [](/docs/某类别/140._word_break_ii.md) -* [](/docs/某类别/141._linked_list_cycle.md) -* [](/docs/某类别/142_Linked_List_Cycle_II.md) -* [](/docs/某类别/143._reorder_list.md) -* [](/docs/某类别/144._binary_tree_preorder_traversal.md) -* [](/docs/某类别/145._binary_tree_postorder_traversal.md) -* [](/docs/某类别/147._insertion_sort_list.md) -* [](/docs/某类别/148._sort_list.md) -* [](/docs/某类别/150._evaluate_reverse_polish_notation.md) -* [](/docs/某类别/151._reverse_words_in_a_string.md) -* [](/docs/某类别/152._maximum_product_subarray.md) -* [](/docs/某类别/153._find_minimum_in_rotated_sorted_array.md) -* [](/docs/某类别/155._min_stack.md) -* [](/docs/某类别/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md) -* [](/docs/某类别/160._intersection_of_two_linked_lists.md) -* [](/docs/某类别/162._find_peak_element.md) -* [](/docs/某类别/165._compare_version_numbers.md) -* [](/docs/某类别/166._Fraction_to_Recurring_Decimal.md) -* [](/docs/某类别/167._two_sum_ii_-_input_array_is_sorted.md) -* [](/docs/某类别/168._excel_sheet_column_title.md) -* [](/docs/某类别/169._majority_element.md) -* [](/docs/某类别/171._excel_sheet_column_number.md) -* [](/docs/某类别/173._binary_search_tree_iterator.md) -* [](/docs/某类别/189._rotate_array.md) -* [](/docs/某类别/191._number_of_1_bits.md) -* [](/docs/某类别/198._house_robber.md) -* [](/docs/某类别/199._binary_tree_right_side_view.md) -* [](/docs/某类别/200._number_of_islands.md) -* [](/docs/某类别/203._remove_linked_list_elements.md) -* [](/docs/某类别/204._count_primes.md) -* [](/docs/某类别/205._isomorphic_strings.md) -* [](/docs/某类别/206._reverse_linked_list.md) -* [](/docs/某类别/207._course_schedule.md) -* [](/docs/某类别/208._implement_trie_(prefix_tree).md) -* [](/docs/某类别/210._course_schedule_ii.md) -* [](/docs/某类别/211.AddandSearchWord-Datastructuredesign.md) -* [](/docs/某类别/213._house_robber_ii.md) -* [](/docs/某类别/216._combination_sum_iii.md) -* [](/docs/某类别/217._contains_duplicate.md) -* [](/docs/某类别/218._The_Skyline_Problem.md) -* [](/docs/某类别/219._contains_duplicate_ii.md) -* [](/docs/某类别/221._maximal_square.md) -* [](/docs/某类别/222._count_complete_tree_nodes.md) -* [](/docs/某类别/223._rectangle_area.md) -* [](/docs/某类别/224.BasicCalculator.md) -* [](/docs/某类别/225._implement_stack_using_queues.md) -* [](/docs/某类别/226._invert_binary_tree.md) -* [](/docs/某类别/227._basic_calculator_ii.md) -* [](/docs/某类别/228._summary_ranges.md) -* [](/docs/某类别/229._majority_element_ii.md) -* [](/docs/某类别/230._kth_smallest_element_in_a_bst.md) -* [](/docs/某类别/231._Power_of_Two.md) -* [](/docs/某类别/232._implement_queue_using_stacks.md) -* [](/docs/某类别/234._palindrome_linked_list.md) -* [](/docs/某类别/235._lowest_common_ancestor_of_a_binary_search_tree.md) -* [](/docs/某类别/236._lowest_common_ancestor_of_a_binary_tree.md) -* [](/docs/某类别/237._delete_node_in_a_linked_list.md) -* [](/docs/某类别/238._product_of_array_except_self.md) -* [](/docs/某类别/240._search_a_2d_matrix_ii.md) -* [](/docs/某类别/242._valid_anagram.md) -* [](/docs/某类别/252.MeetingRooms.md) -* [](/docs/某类别/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md) -* [](/docs/某类别/256.PaintHouse.md) -* [](/docs/某类别/257._binary_tree_paths.md) -* [](/docs/某类别/258_Add_Digits.md) -* [](/docs/某类别/261.GraphValidTree.md) -* [](/docs/某类别/263._ugly_number.md) -* [](/docs/某类别/264._ugly_number_ii.md) -* [](/docs/某类别/265.PaintHouseII.md) -* [](/docs/某类别/266.PalindromePermutation.md) -* [](/docs/某类别/267.PalindromePermutationII.md) -* [](/docs/某类别/268._missing_number.md) -* [](/docs/某类别/270.ClosestBinarySearchTreeValue.md) -* [](/docs/某类别/276.PaintFence.md) -* [](/docs/某类别/277.FindtheCelebrity.md) -* [](/docs/某类别/278._First_Bad_Version.md) -* [](/docs/某类别/279._perfect_squares.md) -* [](/docs/某类别/280._Wiggle_Sort.md) -* [](/docs/某类别/283._move_zeroes.md) -* [](/docs/某类别/285._inorder_successor_in_bst.md) -* [](/docs/某类别/286.WallsandGates.md) -* [](/docs/某类别/289._game_of_life.md) -* [](/docs/某类别/290._word_pattern.md) -* [](/docs/某类别/292._nim_game.md) -* [](/docs/某类别/296.BestMeetingPoint.md) -* [](/docs/某类别/298.BinaryTreeLongestConsecutiveSequence.md) -* [](/docs/某类别/299._bulls_and_cows.md) -* [](/docs/某类别/300._longest_increasing_subsequence.md) -* [](/docs/某类别/303._range_sum_query_-_immutable.md) -* [](/docs/某类别/316._Remove_Duplicate_Letters.md) -* [](/docs/某类别/319._Bulb_Switcher.md) -* [](/docs/某类别/322.CoinChange.md) -* [](/docs/某类别/323.NumberofConnectedComponentsinanUndirectedGraph.md) -* [](/docs/某类别/324._Wiggle_Sort_II.md) -* [](/docs/某类别/326._power_of_three.md) -* [](/docs/某类别/328._odd_even_linked_list.md) -* [](/docs/某类别/334._increasing_triplet_subsequence.md) -* [](/docs/某类别/337._house_robber_iii.md) -* [](/docs/某类别/338.CountingBits.md) -* [](/docs/某类别/339.NestedListWeightSum.md) -* [](/docs/某类别/341._Flatten_Nested_List_Iterator.md) -* [](/docs/某类别/342._Power_of_Four.md) -* [](/docs/某类别/344._reverse_string.md) -* [](/docs/某类别/345._Reverse_Vowels_of_a_String.md) -* [](/docs/某类别/349._intersection_of_two_arrays.md) -* [](/docs/某类别/350._intersection_of_two_arrays_ii.md) -* [](/docs/某类别/353.DesignSnakeGame.md) -* [](/docs/某类别/364.NestedListWeightSumII.md) -* [](/docs/某类别/366.FindLeavesofBinaryTree.md) -* [](/docs/某类别/367._valid_perfect_square.md) -* [](/docs/某类别/369.PlusOneLinkedList.md) -* [](/docs/某类别/371._sum_of_two_integers.md) -* [](/docs/某类别/374._Guess_Number_Higher_or_Lower.md) -* [](/docs/某类别/377._combination_sum_iv.md) -* [](/docs/某类别/378._kth_smallest_element_in_a_sorted_matrix.md) -* [](/docs/某类别/380.InsertDeleteGetRandomO(1).md) -* [](/docs/某类别/381.InsertDeleteGetRandomO(1)-Duplicatesallowed.md) -* [](/docs/某类别/382._linked_list_random_node.md) -* [](/docs/某类别/383._ransom_note.md) -* [](/docs/某类别/384.ShuffleanArray.md) -* [](/docs/某类别/387._first_unique_character_in_a_string.md) -* [](/docs/某类别/388._Longest_Absolute_File_Path.md) -* [](/docs/某类别/389._find_the_difference.md) -* [](/docs/某类别/392._is_subsequence.md) -* [](/docs/某类别/394._decode_string.md) -* [](/docs/某类别/400.NthDigit.md) -* [](/docs/某类别/401._binary_watch.md) -* [](/docs/某类别/404._sum_of_left_leaves.md) -* [](/docs/某类别/405.ConvertaNumbertoHexadecimal.md) -* [](/docs/某类别/406._Queue_Reconstruction_by_Height.md) -* [](/docs/某类别/412._fizz_buzz.md) -* [](/docs/某类别/413.ArithmeticSlices.md) -* [](/docs/某类别/414._third_maximum_number.md) -* [](/docs/某类别/415._add_strings.md) -* [](/docs/某类别/416.PartitionEqualSubsetSum.md) -* [](/docs/某类别/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md) -* [](/docs/某类别/422.ValidWordSquare.md) -* [](/docs/某类别/434._number_of_segments_in_a_string.md) -* [](/docs/某类别/437._path_sum_iii.md) -* [](/docs/某类别/438._Find_All_Anagrams_in_a_String.md) -* [](/docs/某类别/439.TernaryExpressionParser.md) -* [](/docs/某类别/441._arranging_coins.md) -* [](/docs/某类别/448._Find_All_Numbers_Disappeared_in_an_Array.md) -* [](/docs/某类别/450.DeleteNodeinaBST.md) -* [](/docs/某类别/453._Minimum_Moves_to_Equal_Array_Elements.md) -* [](/docs/某类别/459._Repeated_Substring_Pattern.md) -* [](/docs/某类别/461._HammingDistance.md) -* [](/docs/某类别/463._Island_Perimeter.md) -* [](/docs/某类别/467._Unique_Substrings_in_Wraparound_String.md) -* [](/docs/某类别/469.ConvexPolygon.md) -* [](/docs/某类别/476._Number_Complement.md) -* [](/docs/某类别/477._Total_Hamming_Distance.md) -* [](/docs/某类别/485._Max_Consecutive_Ones.md) -* [](/docs/某类别/587._Erect_the_Fence.md) -* [](/docs/某类别/599._Minimum_Index_Sum_of_Two_Lists.md) -* [](/docs/某类别/647._Palindromic_Substrings.md) -* [](/docs/某类别/657._Judge_Route_Circle.md) -* [](/docs/某类别/665._Non-decreasing_Array.md) -* [](/docs/某类别/672._Bulb_Switcher_II.md) -* [](/docs/某类别/681._Next_Closest_Time.md) -* [](/docs/某类别/682._Baseball_Game.md) -* [](/docs/某类别/687._Longest_Univalue_Path.md) -* [](/docs/某类别/740._delete_and_earn.md) -* [](/docs/某类别/760._Find_Anagram_Mappings.md) - -## 推荐的一些LeetCode网站 - -1. [KrisYu的GItuhub](https://github.com/KrisYu/LeetCode-CLRS-Python) -2. [kamyu104的Github](https://github.com/kamyu104/LeetCode) -3. [数据结构与算法/leetcode/lintcode题解](https://algorithm.yuanbin.me/zh-hans/) -4. [Leetcode 讨论区](https://discuss.leetcode.com/) -5. [visualgo算法可视化网站](https://visualgo.net/en) -6. [Data Structure Visualization](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) -7. [我的算法学习之路 - Lucida](http://zh.lucida.me/blog/on-learning-algorithms/) -8. [HiredInTech](https://www.hiredintech.com/) System Design 的总结特别适合入门 -9. [mitcc的Github](https://github.com/mitcc/AlgoSolutions) -10. [小土刀的面试刷题笔记](http://wdxtub.com/interview/14520594642530.html) - - -### Please note, this repository is inspired from [KrisYu](https://github.com/KrisYu/LeetCode-CLRS-Python). However, it has been modified, added and improved to reflect our knowledge, wisdom and effort. - - - 💪就是干! +# Images for the whole repository! From 8e6039c9363793ad031f673a7307b8917acd6b6a Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:32:24 -0500 Subject: [PATCH 458/473] Update README.md --- README.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/README.md b/README.md index 75446ced7..2e0d34398 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,6 @@ # Algorithms -## [八大排序算法](/docs/SortingAlgorithm/README.md) -![](/images/SortingAlgorithm/八大排序算法性能.png) - -| 名称 | 动图 | 代码 | -| --- | --- | --- | -| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/BubbleSort.py) | -| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | -| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | -| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | -| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | -| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | -| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | ## 面试问答 From 3c7451f8af4e0888fda22069c3d7402166eeced5 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:40:31 -0500 Subject: [PATCH 459/473] Update README.md --- docs/Algorithm Templates/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/Algorithm Templates/README.md b/docs/Algorithm Templates/README.md index d5e46e7c8..fe9c7bbf3 100644 --- a/docs/Algorithm Templates/README.md +++ b/docs/Algorithm Templates/README.md @@ -1 +1,15 @@ # Some algorithm templates for better understanding! + +## 八大排序算法 + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | From 68e6871885bcd5c0b02c046095d953badb3f3739 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:45:35 -0500 Subject: [PATCH 460/473] Reconstructuring the whole repository, expanding the scope from Leetcode to Algorithms --- docs/Algorithm_Templates/Cipher/README.md | 0 .../Compression}/README.md | 0 docs/Algorithm_Templates/Conversion/README.md | 0 .../Data_Structure/Graph/README.md | 15 +++++++++++++++ .../Data_Structure/HashMap/README.md | 15 +++++++++++++++ .../Data_Structure/HashTable/README.md | 15 +++++++++++++++ .../Data_Structure/Heqp/README.md | 15 +++++++++++++++ .../Data_Structure/LinkedList/README.md | 15 +++++++++++++++ .../Data_Structure/Matrix/README.md | 15 +++++++++++++++ .../Data_Structure/Queue/README.md | 15 +++++++++++++++ .../Algorithm_Templates/Data_Structure/README.md | 15 +++++++++++++++ .../Data_Structure/Stack/README.md | 15 +++++++++++++++ .../Data_Structure/Tree/README.md | 15 +++++++++++++++ .../Dynamic_Programming/README.md | 0 docs/Algorithm_Templates/Hash/README.md | 0 docs/Algorithm_Templates/README.md | 15 +++++++++++++++ docs/Algorithm_Templates/Search/README.md | 0 .../Sort/BubbleSort.py | 0 .../Sort/InsertSort.py | 0 .../Sort/MergeSort.py | 0 .../Sort/QuickSort.py | 0 docs/Algorithm_Templates/Sort/README.md | 15 +++++++++++++++ .../Sort/SelectionSort.py | 0 .../Sort/ShellSort.py | 0 docs/Algorithm_Templates/Traversals/README.md | 0 .../001._two_sum.md | 0 .../002._add_two_numbers.md | 0 ...est_substring_without_repeating_characters.md | 0 .../004._median_of_two_sorted_arrays.md | 0 .../005._longest_palindromic_substring.md | 0 .../006._ZigZag_Conversion.md | 0 .../007._Reverse_Integer.md | 0 .../008._string_to_integer_(atoi).md | 0 .../009._Palindrome_Number.md | 0 .../010._regular_expression_matching.md | 0 .../011._container_with_most_water.md | 0 .../012._Integer_to_Roman.md | 0 .../013._Roman_to_Integer.md | 0 .../014._longest_common_prefix.md | 0 .../015._3sum.md | 0 .../016._3sum_closest.md | 0 ...017._letter_combinations_of_a_phone_number.md | 0 .../018._4sum.md | 0 .../019._remove_nth_node_from_end_of_list.md | 0 .../020._valid_parentheses.md | 0 .../021._merge_two_sorted_lists.md | 0 .../022._generate_parentheses.md | 0 .../023._merge_k_sorted_lists.md | 0 .../024._swap_nodes_in_pairs.md | 0 .../026._Remove_Duplicates_from_Sorted_Array.md | 0 .../027._Remove_Element.md | 0 .../028._implement_strstr().md | 0 ..._Substring_with_Concatenation_of_All_Words.md | 0 .../031._next_permutation.md | 0 .../033._search_in_rotated_sorted_array.md | 0 .../034._Search for a Range.md | 0 .../035._search_insert_position.md | 0 .../038._Count_and_Say.md | 0 .../039._combination_sum.md | 0 .../040._combination_sum_ii.md | 0 .../042._trapping_rain_water.md | 0 .../043._multiply_strings.md | 0 .../044._wildcard_matching.md | 0 .../045._Jump_Game_II.md | 0 .../046._permutations.md | 0 .../047._permutations_ii.md | 0 .../048._rotate_image.md | 0 .../049._group_anagrams_python.md | 0 .../050._pow(x,_n).md | 0 .../051._n-queens.md | 0 .../052._n-queens_ii.md | 0 .../053._maximum_subarray.md | 0 .../054._spiral_matrix.md | 0 .../055._jump_game.md | 0 .../056._Merge_Intervals.md | 0 .../058._length_of_last_word.md | 0 .../059._spiral_matrix_ii.md | 0 .../060._permutation_sequence.md | 0 .../061._rotate_list.md | 0 .../064._minimum_path_sum.md | 0 .../065.unique_paths_ii.md | 0 .../066._plus_one.md | 0 .../067._add_binary.md | 0 .../069._sqrt(x).md | 0 .../070. Climbing Stairs.md | 0 .../072._edit_distance.md | 0 .../073. Set Matrix Zeroes.md | 0 .../074._search_a_2d_matrix.md | 0 .../075._sort_colors.md | 0 .../076._Minimum_Window_Substring.md | 0 .../077._combinations.md | 0 .../078.Subsets .md | 0 .../079._word_search.md | 0 ...082._remove_duplicates_from_sorted_list_ii.md | 0 .../083._remove_duplicates_from_sorted_list.md | 0 .../086._partition_list.md | 0 .../088._merge_sorted_array.md | 0 .../089._gray_code.md | 0 .../090._subsets_ii.md | 0 .../091._decode_ways.md | 0 .../092._reverse_linked_list_ii.md | 0 .../093._restore_ip_addresses.md | 0 .../094._binary_tree_inorder_traversal.md | 0 .../096._unique_binary_search_trees.md | 0 .../098._validate_binary_search_tree.md | 0 .../100._same_tree.md | 0 .../101._symmetric_tree.md | 0 .../102._binary_tree_level_order_traversal.md | 0 ...._binary_tree_zigzag_level_order_traversal.md | 0 .../104._maximum_depth_of_binary_tree.md | 0 ...y_tree_from_preorder_and_inorder_traversal.md | 0 ..._tree_from_inorder_and_postorder_traversal.md | 0 .../107._binary_tree_level_order_traversal_ii.md | 0 ...convert_sorted_array_to_binary_search_tree.md | 0 ..._convert_sorted_list_to_binary_search_tree.md | 0 .../110._balanced_binary_tree.md | 0 .../111._minimum_depth_of_binary_tree.md | 0 .../112._path_sum.md | 0 .../113._path_sum_ii.md | 0 .../114._flatten_binary_tree_to_linked_list.md | 0 ...opulating_next_right_pointers_in_each_node.md | 0 .../118._pascal's_triangle.md | 0 .../119. Pascal's Triangle II.md | 0 .../120. Triangle.md | 0 .../121._Best_Time_to_Buy_and_Sell_Stock.md | 0 .../125._valid_palindrome.md | 0 .../126. Word Ladder II.md | 0 .../127._word_ladder.md | 0 .../128._Longest_Consecutive_Sequence.md | 0 .../129._sum_root_to_leaf_numbers.md | 0 .../130._surrounded_regions.md | 0 .../131._palindrome_partitioning.md | 0 .../133._clone_graph.md | 0 .../136._single_number.md | 0 .../139._word_break.md | 0 .../140._word_break_ii.md | 0 .../141._linked_list_cycle.md | 0 .../142_Linked_List_Cycle_II.md | 0 .../143._reorder_list.md | 0 .../144._binary_tree_preorder_traversal.md | 0 .../145._binary_tree_postorder_traversal.md | 0 .../147._insertion_sort_list.md | 0 .../148._sort_list.md | 0 .../150._evaluate_reverse_polish_notation.md | 0 .../151._reverse_words_in_a_string.md | 0 .../152._maximum_product_subarray.md | 0 .../153._find_minimum_in_rotated_sorted_array.md | 0 .../155._min_stack.md | 0 ...tring_with_At_Most_Two_Distinct_Characters.md | 0 .../160._intersection_of_two_linked_lists.md | 0 .../162._find_peak_element.md | 0 .../165._compare_version_numbers.md | 0 .../166._Fraction_to_Recurring_Decimal.md | 0 .../167._two_sum_ii_-_input_array_is_sorted.md | 0 .../168._excel_sheet_column_title.md | 0 .../169._majority_element.md | 0 .../171._excel_sheet_column_number.md | 0 .../173._binary_search_tree_iterator.md | 0 .../189._rotate_array.md | 0 .../191._number_of_1_bits.md | 0 .../198._house_robber.md | 0 .../199._binary_tree_right_side_view.md | 0 .../200._number_of_islands.md | 0 .../203._remove_linked_list_elements.md | 0 .../204._count_primes.md | 0 .../205._isomorphic_strings.md | 0 .../206._reverse_linked_list.md | 0 .../207._course_schedule.md | 0 .../208._implement_trie_(prefix_tree).md | 0 .../210._course_schedule_ii.md | 0 ...dd and Search Word - Data structure design.md | 0 .../213._house_robber_ii.md | 0 .../216._combination_sum_iii.md | 0 .../217._contains_duplicate.md | 0 .../218._The _Skyline_Problem .md | 0 .../219._contains_duplicate_ii.md | 0 .../221._maximal_square.md | 0 .../222._count_complete_tree_nodes.md | 0 .../223._rectangle_area.md | 0 .../224. Basic Calculator .md | 0 .../225._implement_stack_using_queues.md | 0 .../226._invert_binary_tree.md | 0 .../227._basic_calculator_ii.md | 0 .../228._summary_ranges.md | 0 .../229._majority_element_ii.md | 0 .../230._kth_smallest_element_in_a_bst.md | 0 .../231. _Power_of_Two.md | 0 .../232._implement_queue_using_stacks.md | 0 .../234._palindrome_linked_list.md | 0 ...st_common_ancestor_of_a_binary_search_tree.md | 0 ...6._lowest_common_ancestor_of_a_binary_tree.md | 0 .../237._delete_node_in_a_linked_list.md | 0 .../238._product_of_array_except_self.md | 0 .../240._search_a_2d_matrix_ii.md | 0 .../242._valid_anagram.md | 0 .../252. Meeting Rooms.md | 0 ...fy_Preorder_Sequence_in_Binary_Search_Tree.md | 0 .../256. Paint House.md | 0 .../257._binary_tree_paths.md | 0 .../258_ Add_Digits.md | 0 .../261. Graph Valid Tree.md | 0 .../263._ugly_number.md | 0 .../264._ugly_number_ii.md | 0 .../265. Paint House II.md | 0 .../266. Palindrome Permutation.md | 0 .../267. Palindrome Permutation II.md | 0 .../268._missing_number.md | 0 .../270. Closest Binary Search Tree Value.md | 0 .../276. Paint Fence.md | 0 .../277. Find the Celebrity.md | 0 .../278._First_Bad _Version.md | 0 .../279._perfect_squares.md | 0 .../280._Wiggle_Sort.md | 0 .../283._move_zeroes.md | 0 .../285._inorder_successor_in_bst.md | 0 .../286. Walls and Gates.md | 0 .../289._game_of_life.md | 0 .../290._word_pattern.md | 0 .../292._nim_game.md | 0 .../296. Best Meeting Point.md | 0 .... Binary Tree Longest Consecutive Sequence.md | 0 .../299._bulls_and_cows.md | 0 .../300._longest_increasing_subsequence.md | 0 .../303._range_sum_query_-_immutable.md | 0 .../316._Remove_Duplicate_Letters.md | 0 .../319._Bulb_Switcher.md | 0 .../322. Coin Change.md | 0 ...onnected Components in an Undirected Graph.md | 0 .../324._Wiggle_Sort_II.md | 0 .../326._power_of_three.md | 0 .../328._odd_even_linked_list.md | 0 .../334._increasing_triplet_subsequence.md | 0 .../337._house_robber_iii.md | 0 .../338. Counting Bits.md | 0 .../339. Nested List Weight Sum.md | 0 .../341._Flatten_Nested_List_Iterator.md | 0 .../342._Power_of_Four.md | 0 .../344._reverse_string.md | 0 .../345._Reverse_Vowels_of_a_String.md | 0 .../349._intersection_of_two_arrays.md | 0 .../350._intersection_of_two_arrays_ii.md | 0 .../353. Design Snake Game.md | 0 .../364. Nested List Weight Sum II.md | 0 .../366. Find Leaves of Binary Tree.md | 0 .../367._valid_perfect_square.md | 0 .../369.Plus One Linked List.md | 0 .../371._sum_of_two_integers.md | 0 .../374._Guess_Number_Higher_or_Lower.md | 0 .../377._combination_sum_iv.md | 0 ...8._kth_smallest_element_in_a_sorted_matrix.md | 0 .../380. Insert Delete GetRandom O(1).md | 0 ...Delete GetRandom O(1) - Duplicates allowed.md | 0 .../382._linked_list_random_node.md | 0 .../383._ransom_note.md | 0 .../384. Shuffle an Array.md | 0 .../387._first_unique_character_in_a_string.md | 0 .../388._Longest_Absolute_File_Path.md | 0 .../389._find_the_difference.md | 0 .../392._is_subsequence.md | 0 .../394._decode_string.md | 0 .../400. Nth Digit.md | 0 .../401._binary_watch.md | 0 .../404._sum_of_left_leaves.md | 0 .../405. Convert a Number to Hexadecimal.md | 0 .../406._Queue_Reconstruction_by_Height.md | 0 .../412._fizz_buzz.md | 0 .../413. Arithmetic Slices.md | 0 .../414._third_maximum_number.md | 0 .../415._add_strings.md | 0 .../416. Partition Equal Subset Sum.md | 0 ...21._Maximum_XOR_of_Two_Numbers_in_an_Array.md | 0 .../422. Valid Word Square.md | 0 .../434._number_of_segments_in_a_string.md | 0 .../437._path_sum_iii.md | 0 .../438._Find_All_Anagrams_in_a_String.md | 0 .../439. Ternary Expression Parser.md | 0 .../441._arranging_coins.md | 0 ...._Find_All_Numbers_Disappeared_in_an_Array.md | 0 .../450. Delete Node in a BST.md | 0 ...453._Minimum_Moves_to_Equal_Array_Elements.md | 0 .../459._Repeated_Substring_Pattern.md | 0 .../461._Hamming Distance.md | 0 .../463._Island_Perimeter.md | 0 ...67._Unique_Substrings_in_Wraparound_String.md | 0 .../469. Convex Polygon.md | 0 .../476._Number_Complement.md | 0 .../477._Total_Hamming_Distance.md | 0 .../485._Max_Consecutive_Ones.md | 0 .../587._Erect_the_Fence .md | 0 .../599._Minimum_Index_Sum_of_Two_Lists.md | 0 .../647._Palindromic_Substrings.md | 0 .../657._Judge_Route_Circle.md | 0 .../665._Non-decreasing_Array.md | 0 .../672._Bulb_Switcher_II.md | 0 .../681._Next_Closest_Time.md | 0 .../682._Baseball_Game.md | 0 .../687._Longest_Univalue_Path.md | 0 .../740._delete_and_earn.md | 0 .../760._Find_Anagram_Mappings.md | 0 .../README.md | 0 ...arch \344\270\215\346\230\223\345\206\231.md" | 0 .../Data Structure and Algorthim Review.md | 0 .../Summarization/Dynamic Programming.md | 0 ...arching Algorithms \342\200\223 topcoder.pdf" | Bin ...6\213\347\232\204\350\275\254\346\215\242.md" | 0 .../LinkedList\346\212\200\345\267\247.md" | 0 .../Summarization/Maximal Square.pdf | Bin ...2\200\345\267\247\347\254\224\350\256\260.py" | 0 .../Range Sum Query 2D - Immutable.pdf | Bin .../Summarization/Recusrion & BackTracking.md | 0 .../backtracking\346\200\235\350\267\257.md" | 0 ..._in_a_linked_list\351\227\256\351\242\230.md" | 0 ...6\260\347\232\204\346\200\235\350\267\257.md" | 0 ...n\347\232\204\345\220\204\347\247\215pass.md" | 0 .../Summarization/slide_windows_template.md | 0 ...274\214_graph_search\357\274\214_dfs,_bfs.md" | 0 .../\344\275\215\350\277\220\347\256\227.md" | 0 ...6\222\345\210\227\347\256\227\346\263\225.md" | 0 .../\345\205\253\346\216\222\345\272\217.md" | 0 ...3\206\345\220\210\351\227\256\351\242\230.md" | 0 .../Summarization/\346\200\273\347\273\223.md" | 0 ...3\204\345\220\210\351\227\256\351\242\230.md" | 0 .../\351\200\222\345\275\222_recursion.md" | 0 323 files changed, 180 insertions(+) create mode 100644 docs/Algorithm_Templates/Cipher/README.md rename docs/{Algorithm Templates => Algorithm_Templates/Compression}/README.md (100%) create mode 100644 docs/Algorithm_Templates/Conversion/README.md create mode 100644 docs/Algorithm_Templates/Data_Structure/Graph/README.md create mode 100644 docs/Algorithm_Templates/Data_Structure/HashMap/README.md create mode 100644 docs/Algorithm_Templates/Data_Structure/HashTable/README.md create mode 100644 docs/Algorithm_Templates/Data_Structure/Heqp/README.md create mode 100644 docs/Algorithm_Templates/Data_Structure/LinkedList/README.md create mode 100644 docs/Algorithm_Templates/Data_Structure/Matrix/README.md create mode 100644 docs/Algorithm_Templates/Data_Structure/Queue/README.md create mode 100644 docs/Algorithm_Templates/Data_Structure/README.md create mode 100644 docs/Algorithm_Templates/Data_Structure/Stack/README.md create mode 100644 docs/Algorithm_Templates/Data_Structure/Tree/README.md create mode 100644 docs/Algorithm_Templates/Dynamic_Programming/README.md create mode 100644 docs/Algorithm_Templates/Hash/README.md create mode 100644 docs/Algorithm_Templates/README.md create mode 100644 docs/Algorithm_Templates/Search/README.md rename docs/{Algorithm Templates => Algorithm_Templates}/Sort/BubbleSort.py (100%) rename docs/{Algorithm Templates => Algorithm_Templates}/Sort/InsertSort.py (100%) rename docs/{Algorithm Templates => Algorithm_Templates}/Sort/MergeSort.py (100%) rename docs/{Algorithm Templates => Algorithm_Templates}/Sort/QuickSort.py (100%) create mode 100644 docs/Algorithm_Templates/Sort/README.md rename docs/{Algorithm Templates => Algorithm_Templates}/Sort/SelectionSort.py (100%) rename docs/{Algorithm Templates => Algorithm_Templates}/Sort/ShellSort.py (100%) create mode 100644 docs/Algorithm_Templates/Traversals/README.md rename docs/{Leetcode Solutions => Leetcode_Solutions}/001._two_sum.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/002._add_two_numbers.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/003._longest_substring_without_repeating_characters.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/004._median_of_two_sorted_arrays.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/005._longest_palindromic_substring.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/006._ZigZag_Conversion.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/007._Reverse_Integer.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/008._string_to_integer_(atoi).md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/009._Palindrome_Number.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/010._regular_expression_matching.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/011._container_with_most_water.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/012._Integer_to_Roman.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/013._Roman_to_Integer.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/014._longest_common_prefix.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/015._3sum.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/016._3sum_closest.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/017._letter_combinations_of_a_phone_number.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/018._4sum.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/019._remove_nth_node_from_end_of_list.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/020._valid_parentheses.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/021._merge_two_sorted_lists.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/022._generate_parentheses.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/023._merge_k_sorted_lists.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/024._swap_nodes_in_pairs.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/026._Remove_Duplicates_from_Sorted_Array.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/027._Remove_Element.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/028._implement_strstr().md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/030._Substring_with_Concatenation_of_All_Words.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/031._next_permutation.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/033._search_in_rotated_sorted_array.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/034._Search for a Range.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/035._search_insert_position.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/038._Count_and_Say.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/039._combination_sum.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/040._combination_sum_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/042._trapping_rain_water.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/043._multiply_strings.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/044._wildcard_matching.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/045._Jump_Game_II.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/046._permutations.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/047._permutations_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/048._rotate_image.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/049._group_anagrams_python.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/050._pow(x,_n).md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/051._n-queens.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/052._n-queens_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/053._maximum_subarray.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/054._spiral_matrix.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/055._jump_game.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/056._Merge_Intervals.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/058._length_of_last_word.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/059._spiral_matrix_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/060._permutation_sequence.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/061._rotate_list.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/064._minimum_path_sum.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/065.unique_paths_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/066._plus_one.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/067._add_binary.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/069._sqrt(x).md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/070. Climbing Stairs.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/072._edit_distance.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/073. Set Matrix Zeroes.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/074._search_a_2d_matrix.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/075._sort_colors.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/076._Minimum_Window_Substring.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/077._combinations.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/078.Subsets .md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/079._word_search.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/082._remove_duplicates_from_sorted_list_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/083._remove_duplicates_from_sorted_list.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/086._partition_list.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/088._merge_sorted_array.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/089._gray_code.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/090._subsets_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/091._decode_ways.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/092._reverse_linked_list_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/093._restore_ip_addresses.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/094._binary_tree_inorder_traversal.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/096._unique_binary_search_trees.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/098._validate_binary_search_tree.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/100._same_tree.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/101._symmetric_tree.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/102._binary_tree_level_order_traversal.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/103._binary_tree_zigzag_level_order_traversal.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/104._maximum_depth_of_binary_tree.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/105._construct_binary_tree_from_preorder_and_inorder_traversal.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/106._construct_binary_tree_from_inorder_and_postorder_traversal.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/107._binary_tree_level_order_traversal_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/108._convert_sorted_array_to_binary_search_tree.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/109._convert_sorted_list_to_binary_search_tree.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/110._balanced_binary_tree.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/111._minimum_depth_of_binary_tree.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/112._path_sum.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/113._path_sum_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/114._flatten_binary_tree_to_linked_list.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/116._populating_next_right_pointers_in_each_node.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/118._pascal's_triangle.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/119. Pascal's Triangle II.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/120. Triangle.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/121._Best_Time_to_Buy_and_Sell_Stock.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/125._valid_palindrome.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/126. Word Ladder II.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/127._word_ladder.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/128._Longest_Consecutive_Sequence.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/129._sum_root_to_leaf_numbers.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/130._surrounded_regions.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/131._palindrome_partitioning.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/133._clone_graph.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/136._single_number.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/139._word_break.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/140._word_break_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/141._linked_list_cycle.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/142_Linked_List_Cycle_II.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/143._reorder_list.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/144._binary_tree_preorder_traversal.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/145._binary_tree_postorder_traversal.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/147._insertion_sort_list.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/148._sort_list.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/150._evaluate_reverse_polish_notation.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/151._reverse_words_in_a_string.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/152._maximum_product_subarray.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/153._find_minimum_in_rotated_sorted_array.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/155._min_stack.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/160._intersection_of_two_linked_lists.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/162._find_peak_element.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/165._compare_version_numbers.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/166._Fraction_to_Recurring_Decimal.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/167._two_sum_ii_-_input_array_is_sorted.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/168._excel_sheet_column_title.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/169._majority_element.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/171._excel_sheet_column_number.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/173._binary_search_tree_iterator.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/189._rotate_array.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/191._number_of_1_bits.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/198._house_robber.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/199._binary_tree_right_side_view.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/200._number_of_islands.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/203._remove_linked_list_elements.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/204._count_primes.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/205._isomorphic_strings.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/206._reverse_linked_list.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/207._course_schedule.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/208._implement_trie_(prefix_tree).md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/210._course_schedule_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/211. Add and Search Word - Data structure design.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/213._house_robber_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/216._combination_sum_iii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/217._contains_duplicate.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/218._The _Skyline_Problem .md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/219._contains_duplicate_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/221._maximal_square.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/222._count_complete_tree_nodes.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/223._rectangle_area.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/224. Basic Calculator .md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/225._implement_stack_using_queues.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/226._invert_binary_tree.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/227._basic_calculator_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/228._summary_ranges.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/229._majority_element_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/230._kth_smallest_element_in_a_bst.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/231. _Power_of_Two.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/232._implement_queue_using_stacks.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/234._palindrome_linked_list.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/235._lowest_common_ancestor_of_a_binary_search_tree.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/236._lowest_common_ancestor_of_a_binary_tree.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/237._delete_node_in_a_linked_list.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/238._product_of_array_except_self.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/240._search_a_2d_matrix_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/242._valid_anagram.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/252. Meeting Rooms.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/256. Paint House.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/257._binary_tree_paths.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/258_ Add_Digits.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/261. Graph Valid Tree.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/263._ugly_number.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/264._ugly_number_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/265. Paint House II.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/266. Palindrome Permutation.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/267. Palindrome Permutation II.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/268._missing_number.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/270. Closest Binary Search Tree Value.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/276. Paint Fence.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/277. Find the Celebrity.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/278._First_Bad _Version.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/279._perfect_squares.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/280._Wiggle_Sort.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/283._move_zeroes.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/285._inorder_successor_in_bst.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/286. Walls and Gates.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/289._game_of_life.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/290._word_pattern.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/292._nim_game.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/296. Best Meeting Point.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/298. Binary Tree Longest Consecutive Sequence.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/299._bulls_and_cows.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/300._longest_increasing_subsequence.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/303._range_sum_query_-_immutable.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/316._Remove_Duplicate_Letters.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/319._Bulb_Switcher.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/322. Coin Change.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/323. Number of Connected Components in an Undirected Graph.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/324._Wiggle_Sort_II.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/326._power_of_three.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/328._odd_even_linked_list.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/334._increasing_triplet_subsequence.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/337._house_robber_iii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/338. Counting Bits.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/339. Nested List Weight Sum.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/341._Flatten_Nested_List_Iterator.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/342._Power_of_Four.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/344._reverse_string.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/345._Reverse_Vowels_of_a_String.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/349._intersection_of_two_arrays.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/350._intersection_of_two_arrays_ii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/353. Design Snake Game.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/364. Nested List Weight Sum II.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/366. Find Leaves of Binary Tree.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/367._valid_perfect_square.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/369.Plus One Linked List.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/371._sum_of_two_integers.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/374._Guess_Number_Higher_or_Lower.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/377._combination_sum_iv.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/378._kth_smallest_element_in_a_sorted_matrix.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/380. Insert Delete GetRandom O(1).md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/381. Insert Delete GetRandom O(1) - Duplicates allowed.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/382._linked_list_random_node.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/383._ransom_note.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/384. Shuffle an Array.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/387._first_unique_character_in_a_string.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/388._Longest_Absolute_File_Path.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/389._find_the_difference.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/392._is_subsequence.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/394._decode_string.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/400. Nth Digit.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/401._binary_watch.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/404._sum_of_left_leaves.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/405. Convert a Number to Hexadecimal.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/406._Queue_Reconstruction_by_Height.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/412._fizz_buzz.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/413. Arithmetic Slices.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/414._third_maximum_number.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/415._add_strings.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/416. Partition Equal Subset Sum.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/422. Valid Word Square.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/434._number_of_segments_in_a_string.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/437._path_sum_iii.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/438._Find_All_Anagrams_in_a_String.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/439. Ternary Expression Parser.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/441._arranging_coins.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/448._Find_All_Numbers_Disappeared_in_an_Array.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/450. Delete Node in a BST.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/453._Minimum_Moves_to_Equal_Array_Elements.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/459._Repeated_Substring_Pattern.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/461._Hamming Distance.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/463._Island_Perimeter.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/467._Unique_Substrings_in_Wraparound_String.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/469. Convex Polygon.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/476._Number_Complement.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/477._Total_Hamming_Distance.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/485._Max_Consecutive_Ones.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/587._Erect_the_Fence .md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/599._Minimum_Index_Sum_of_Two_Lists.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/647._Palindromic_Substrings.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/657._Judge_Route_Circle.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/665._Non-decreasing_Array.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/672._Bulb_Switcher_II.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/681._Next_Closest_Time.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/682._Baseball_Game.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/687._Longest_Univalue_Path.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/740._delete_and_earn.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/760._Find_Anagram_Mappings.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/README.md (100%) rename "docs/Leetcode Solutions/Summarization/Binary Search \344\270\215\346\230\223\345\206\231.md" => "docs/Leetcode_Solutions/Summarization/Binary Search \344\270\215\346\230\223\345\206\231.md" (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/Summarization/Data Structure and Algorthim Review.md (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/Summarization/Dynamic Programming.md (100%) rename "docs/Leetcode Solutions/Summarization/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" => "docs/Leetcode_Solutions/Summarization/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" (100%) rename "docs/Leetcode Solutions/Summarization/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" => "docs/Leetcode_Solutions/Summarization/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" (100%) rename "docs/Leetcode Solutions/Summarization/LinkedList\346\212\200\345\267\247.md" => "docs/Leetcode_Solutions/Summarization/LinkedList\346\212\200\345\267\247.md" (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/Summarization/Maximal Square.pdf (100%) rename "docs/Leetcode Solutions/Summarization/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" => "docs/Leetcode_Solutions/Summarization/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/Summarization/Range Sum Query 2D - Immutable.pdf (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/Summarization/Recusrion & BackTracking.md (100%) rename "docs/Leetcode Solutions/Summarization/backtracking\346\200\235\350\267\257.md" => "docs/Leetcode_Solutions/Summarization/backtracking\346\200\235\350\267\257.md" (100%) rename "docs/Leetcode Solutions/Summarization/delete_node_in_a_linked_list\351\227\256\351\242\230.md" => "docs/Leetcode_Solutions/Summarization/delete_node_in_a_linked_list\351\227\256\351\242\230.md" (100%) rename "docs/Leetcode Solutions/Summarization/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" => "docs/Leetcode_Solutions/Summarization/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" (100%) rename "docs/Leetcode Solutions/Summarization/python\347\232\204\345\220\204\347\247\215pass.md" => "docs/Leetcode_Solutions/Summarization/python\347\232\204\345\220\204\347\247\215pass.md" (100%) rename docs/{Leetcode Solutions => Leetcode_Solutions}/Summarization/slide_windows_template.md (100%) rename "docs/Leetcode Solutions/Summarization/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" => "docs/Leetcode_Solutions/Summarization/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" (100%) rename "docs/Leetcode Solutions/Summarization/\344\275\215\350\277\220\347\256\227.md" => "docs/Leetcode_Solutions/Summarization/\344\275\215\350\277\220\347\256\227.md" (100%) rename "docs/Leetcode Solutions/Summarization/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" => "docs/Leetcode_Solutions/Summarization/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" (100%) rename "docs/Leetcode Solutions/Summarization/\345\205\253\346\216\222\345\272\217.md" => "docs/Leetcode_Solutions/Summarization/\345\205\253\346\216\222\345\272\217.md" (100%) rename "docs/Leetcode Solutions/Summarization/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" => "docs/Leetcode_Solutions/Summarization/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" (100%) rename "docs/Leetcode Solutions/Summarization/\346\200\273\347\273\223.md" => "docs/Leetcode_Solutions/Summarization/\346\200\273\347\273\223.md" (100%) rename "docs/Leetcode Solutions/Summarization/\347\273\204\345\220\210\351\227\256\351\242\230.md" => "docs/Leetcode_Solutions/Summarization/\347\273\204\345\220\210\351\227\256\351\242\230.md" (100%) rename "docs/Leetcode Solutions/Summarization/\351\200\222\345\275\222_recursion.md" => "docs/Leetcode_Solutions/Summarization/\351\200\222\345\275\222_recursion.md" (100%) diff --git a/docs/Algorithm_Templates/Cipher/README.md b/docs/Algorithm_Templates/Cipher/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/Algorithm Templates/README.md b/docs/Algorithm_Templates/Compression/README.md similarity index 100% rename from docs/Algorithm Templates/README.md rename to docs/Algorithm_Templates/Compression/README.md diff --git a/docs/Algorithm_Templates/Conversion/README.md b/docs/Algorithm_Templates/Conversion/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/Algorithm_Templates/Data_Structure/Graph/README.md b/docs/Algorithm_Templates/Data_Structure/Graph/README.md new file mode 100644 index 000000000..fe9c7bbf3 --- /dev/null +++ b/docs/Algorithm_Templates/Data_Structure/Graph/README.md @@ -0,0 +1,15 @@ +# Some algorithm templates for better understanding! + +## 八大排序算法 + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | diff --git a/docs/Algorithm_Templates/Data_Structure/HashMap/README.md b/docs/Algorithm_Templates/Data_Structure/HashMap/README.md new file mode 100644 index 000000000..fe9c7bbf3 --- /dev/null +++ b/docs/Algorithm_Templates/Data_Structure/HashMap/README.md @@ -0,0 +1,15 @@ +# Some algorithm templates for better understanding! + +## 八大排序算法 + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | diff --git a/docs/Algorithm_Templates/Data_Structure/HashTable/README.md b/docs/Algorithm_Templates/Data_Structure/HashTable/README.md new file mode 100644 index 000000000..fe9c7bbf3 --- /dev/null +++ b/docs/Algorithm_Templates/Data_Structure/HashTable/README.md @@ -0,0 +1,15 @@ +# Some algorithm templates for better understanding! + +## 八大排序算法 + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | diff --git a/docs/Algorithm_Templates/Data_Structure/Heqp/README.md b/docs/Algorithm_Templates/Data_Structure/Heqp/README.md new file mode 100644 index 000000000..fe9c7bbf3 --- /dev/null +++ b/docs/Algorithm_Templates/Data_Structure/Heqp/README.md @@ -0,0 +1,15 @@ +# Some algorithm templates for better understanding! + +## 八大排序算法 + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | diff --git a/docs/Algorithm_Templates/Data_Structure/LinkedList/README.md b/docs/Algorithm_Templates/Data_Structure/LinkedList/README.md new file mode 100644 index 000000000..fe9c7bbf3 --- /dev/null +++ b/docs/Algorithm_Templates/Data_Structure/LinkedList/README.md @@ -0,0 +1,15 @@ +# Some algorithm templates for better understanding! + +## 八大排序算法 + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | diff --git a/docs/Algorithm_Templates/Data_Structure/Matrix/README.md b/docs/Algorithm_Templates/Data_Structure/Matrix/README.md new file mode 100644 index 000000000..fe9c7bbf3 --- /dev/null +++ b/docs/Algorithm_Templates/Data_Structure/Matrix/README.md @@ -0,0 +1,15 @@ +# Some algorithm templates for better understanding! + +## 八大排序算法 + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | diff --git a/docs/Algorithm_Templates/Data_Structure/Queue/README.md b/docs/Algorithm_Templates/Data_Structure/Queue/README.md new file mode 100644 index 000000000..fe9c7bbf3 --- /dev/null +++ b/docs/Algorithm_Templates/Data_Structure/Queue/README.md @@ -0,0 +1,15 @@ +# Some algorithm templates for better understanding! + +## 八大排序算法 + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | diff --git a/docs/Algorithm_Templates/Data_Structure/README.md b/docs/Algorithm_Templates/Data_Structure/README.md new file mode 100644 index 000000000..fe9c7bbf3 --- /dev/null +++ b/docs/Algorithm_Templates/Data_Structure/README.md @@ -0,0 +1,15 @@ +# Some algorithm templates for better understanding! + +## 八大排序算法 + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | diff --git a/docs/Algorithm_Templates/Data_Structure/Stack/README.md b/docs/Algorithm_Templates/Data_Structure/Stack/README.md new file mode 100644 index 000000000..fe9c7bbf3 --- /dev/null +++ b/docs/Algorithm_Templates/Data_Structure/Stack/README.md @@ -0,0 +1,15 @@ +# Some algorithm templates for better understanding! + +## 八大排序算法 + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | diff --git a/docs/Algorithm_Templates/Data_Structure/Tree/README.md b/docs/Algorithm_Templates/Data_Structure/Tree/README.md new file mode 100644 index 000000000..fe9c7bbf3 --- /dev/null +++ b/docs/Algorithm_Templates/Data_Structure/Tree/README.md @@ -0,0 +1,15 @@ +# Some algorithm templates for better understanding! + +## 八大排序算法 + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | diff --git a/docs/Algorithm_Templates/Dynamic_Programming/README.md b/docs/Algorithm_Templates/Dynamic_Programming/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/Algorithm_Templates/Hash/README.md b/docs/Algorithm_Templates/Hash/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/Algorithm_Templates/README.md b/docs/Algorithm_Templates/README.md new file mode 100644 index 000000000..fe9c7bbf3 --- /dev/null +++ b/docs/Algorithm_Templates/README.md @@ -0,0 +1,15 @@ +# Some algorithm templates for better understanding! + +## 八大排序算法 + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | diff --git a/docs/Algorithm_Templates/Search/README.md b/docs/Algorithm_Templates/Search/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/Algorithm Templates/Sort/BubbleSort.py b/docs/Algorithm_Templates/Sort/BubbleSort.py similarity index 100% rename from docs/Algorithm Templates/Sort/BubbleSort.py rename to docs/Algorithm_Templates/Sort/BubbleSort.py diff --git a/docs/Algorithm Templates/Sort/InsertSort.py b/docs/Algorithm_Templates/Sort/InsertSort.py similarity index 100% rename from docs/Algorithm Templates/Sort/InsertSort.py rename to docs/Algorithm_Templates/Sort/InsertSort.py diff --git a/docs/Algorithm Templates/Sort/MergeSort.py b/docs/Algorithm_Templates/Sort/MergeSort.py similarity index 100% rename from docs/Algorithm Templates/Sort/MergeSort.py rename to docs/Algorithm_Templates/Sort/MergeSort.py diff --git a/docs/Algorithm Templates/Sort/QuickSort.py b/docs/Algorithm_Templates/Sort/QuickSort.py similarity index 100% rename from docs/Algorithm Templates/Sort/QuickSort.py rename to docs/Algorithm_Templates/Sort/QuickSort.py diff --git a/docs/Algorithm_Templates/Sort/README.md b/docs/Algorithm_Templates/Sort/README.md new file mode 100644 index 000000000..fe9c7bbf3 --- /dev/null +++ b/docs/Algorithm_Templates/Sort/README.md @@ -0,0 +1,15 @@ +# Some algorithm templates for better understanding! + +## 八大排序算法 + +![](/images/SortingAlgorithm/八大排序算法性能.png) + +| 名称 | 动图 | 代码 | +| --- | --- | --- | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | diff --git a/docs/Algorithm Templates/Sort/SelectionSort.py b/docs/Algorithm_Templates/Sort/SelectionSort.py similarity index 100% rename from docs/Algorithm Templates/Sort/SelectionSort.py rename to docs/Algorithm_Templates/Sort/SelectionSort.py diff --git a/docs/Algorithm Templates/Sort/ShellSort.py b/docs/Algorithm_Templates/Sort/ShellSort.py similarity index 100% rename from docs/Algorithm Templates/Sort/ShellSort.py rename to docs/Algorithm_Templates/Sort/ShellSort.py diff --git a/docs/Algorithm_Templates/Traversals/README.md b/docs/Algorithm_Templates/Traversals/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/Leetcode Solutions/001._two_sum.md b/docs/Leetcode_Solutions/001._two_sum.md similarity index 100% rename from docs/Leetcode Solutions/001._two_sum.md rename to docs/Leetcode_Solutions/001._two_sum.md diff --git a/docs/Leetcode Solutions/002._add_two_numbers.md b/docs/Leetcode_Solutions/002._add_two_numbers.md similarity index 100% rename from docs/Leetcode Solutions/002._add_two_numbers.md rename to docs/Leetcode_Solutions/002._add_two_numbers.md diff --git a/docs/Leetcode Solutions/003._longest_substring_without_repeating_characters.md b/docs/Leetcode_Solutions/003._longest_substring_without_repeating_characters.md similarity index 100% rename from docs/Leetcode Solutions/003._longest_substring_without_repeating_characters.md rename to docs/Leetcode_Solutions/003._longest_substring_without_repeating_characters.md diff --git a/docs/Leetcode Solutions/004._median_of_two_sorted_arrays.md b/docs/Leetcode_Solutions/004._median_of_two_sorted_arrays.md similarity index 100% rename from docs/Leetcode Solutions/004._median_of_two_sorted_arrays.md rename to docs/Leetcode_Solutions/004._median_of_two_sorted_arrays.md diff --git a/docs/Leetcode Solutions/005._longest_palindromic_substring.md b/docs/Leetcode_Solutions/005._longest_palindromic_substring.md similarity index 100% rename from docs/Leetcode Solutions/005._longest_palindromic_substring.md rename to docs/Leetcode_Solutions/005._longest_palindromic_substring.md diff --git a/docs/Leetcode Solutions/006._ZigZag_Conversion.md b/docs/Leetcode_Solutions/006._ZigZag_Conversion.md similarity index 100% rename from docs/Leetcode Solutions/006._ZigZag_Conversion.md rename to docs/Leetcode_Solutions/006._ZigZag_Conversion.md diff --git a/docs/Leetcode Solutions/007._Reverse_Integer.md b/docs/Leetcode_Solutions/007._Reverse_Integer.md similarity index 100% rename from docs/Leetcode Solutions/007._Reverse_Integer.md rename to docs/Leetcode_Solutions/007._Reverse_Integer.md diff --git a/docs/Leetcode Solutions/008._string_to_integer_(atoi).md b/docs/Leetcode_Solutions/008._string_to_integer_(atoi).md similarity index 100% rename from docs/Leetcode Solutions/008._string_to_integer_(atoi).md rename to docs/Leetcode_Solutions/008._string_to_integer_(atoi).md diff --git a/docs/Leetcode Solutions/009._Palindrome_Number.md b/docs/Leetcode_Solutions/009._Palindrome_Number.md similarity index 100% rename from docs/Leetcode Solutions/009._Palindrome_Number.md rename to docs/Leetcode_Solutions/009._Palindrome_Number.md diff --git a/docs/Leetcode Solutions/010._regular_expression_matching.md b/docs/Leetcode_Solutions/010._regular_expression_matching.md similarity index 100% rename from docs/Leetcode Solutions/010._regular_expression_matching.md rename to docs/Leetcode_Solutions/010._regular_expression_matching.md diff --git a/docs/Leetcode Solutions/011._container_with_most_water.md b/docs/Leetcode_Solutions/011._container_with_most_water.md similarity index 100% rename from docs/Leetcode Solutions/011._container_with_most_water.md rename to docs/Leetcode_Solutions/011._container_with_most_water.md diff --git a/docs/Leetcode Solutions/012._Integer_to_Roman.md b/docs/Leetcode_Solutions/012._Integer_to_Roman.md similarity index 100% rename from docs/Leetcode Solutions/012._Integer_to_Roman.md rename to docs/Leetcode_Solutions/012._Integer_to_Roman.md diff --git a/docs/Leetcode Solutions/013._Roman_to_Integer.md b/docs/Leetcode_Solutions/013._Roman_to_Integer.md similarity index 100% rename from docs/Leetcode Solutions/013._Roman_to_Integer.md rename to docs/Leetcode_Solutions/013._Roman_to_Integer.md diff --git a/docs/Leetcode Solutions/014._longest_common_prefix.md b/docs/Leetcode_Solutions/014._longest_common_prefix.md similarity index 100% rename from docs/Leetcode Solutions/014._longest_common_prefix.md rename to docs/Leetcode_Solutions/014._longest_common_prefix.md diff --git a/docs/Leetcode Solutions/015._3sum.md b/docs/Leetcode_Solutions/015._3sum.md similarity index 100% rename from docs/Leetcode Solutions/015._3sum.md rename to docs/Leetcode_Solutions/015._3sum.md diff --git a/docs/Leetcode Solutions/016._3sum_closest.md b/docs/Leetcode_Solutions/016._3sum_closest.md similarity index 100% rename from docs/Leetcode Solutions/016._3sum_closest.md rename to docs/Leetcode_Solutions/016._3sum_closest.md diff --git a/docs/Leetcode Solutions/017._letter_combinations_of_a_phone_number.md b/docs/Leetcode_Solutions/017._letter_combinations_of_a_phone_number.md similarity index 100% rename from docs/Leetcode Solutions/017._letter_combinations_of_a_phone_number.md rename to docs/Leetcode_Solutions/017._letter_combinations_of_a_phone_number.md diff --git a/docs/Leetcode Solutions/018._4sum.md b/docs/Leetcode_Solutions/018._4sum.md similarity index 100% rename from docs/Leetcode Solutions/018._4sum.md rename to docs/Leetcode_Solutions/018._4sum.md diff --git a/docs/Leetcode Solutions/019._remove_nth_node_from_end_of_list.md b/docs/Leetcode_Solutions/019._remove_nth_node_from_end_of_list.md similarity index 100% rename from docs/Leetcode Solutions/019._remove_nth_node_from_end_of_list.md rename to docs/Leetcode_Solutions/019._remove_nth_node_from_end_of_list.md diff --git a/docs/Leetcode Solutions/020._valid_parentheses.md b/docs/Leetcode_Solutions/020._valid_parentheses.md similarity index 100% rename from docs/Leetcode Solutions/020._valid_parentheses.md rename to docs/Leetcode_Solutions/020._valid_parentheses.md diff --git a/docs/Leetcode Solutions/021._merge_two_sorted_lists.md b/docs/Leetcode_Solutions/021._merge_two_sorted_lists.md similarity index 100% rename from docs/Leetcode Solutions/021._merge_two_sorted_lists.md rename to docs/Leetcode_Solutions/021._merge_two_sorted_lists.md diff --git a/docs/Leetcode Solutions/022._generate_parentheses.md b/docs/Leetcode_Solutions/022._generate_parentheses.md similarity index 100% rename from docs/Leetcode Solutions/022._generate_parentheses.md rename to docs/Leetcode_Solutions/022._generate_parentheses.md diff --git a/docs/Leetcode Solutions/023._merge_k_sorted_lists.md b/docs/Leetcode_Solutions/023._merge_k_sorted_lists.md similarity index 100% rename from docs/Leetcode Solutions/023._merge_k_sorted_lists.md rename to docs/Leetcode_Solutions/023._merge_k_sorted_lists.md diff --git a/docs/Leetcode Solutions/024._swap_nodes_in_pairs.md b/docs/Leetcode_Solutions/024._swap_nodes_in_pairs.md similarity index 100% rename from docs/Leetcode Solutions/024._swap_nodes_in_pairs.md rename to docs/Leetcode_Solutions/024._swap_nodes_in_pairs.md diff --git a/docs/Leetcode Solutions/026._Remove_Duplicates_from_Sorted_Array.md b/docs/Leetcode_Solutions/026._Remove_Duplicates_from_Sorted_Array.md similarity index 100% rename from docs/Leetcode Solutions/026._Remove_Duplicates_from_Sorted_Array.md rename to docs/Leetcode_Solutions/026._Remove_Duplicates_from_Sorted_Array.md diff --git a/docs/Leetcode Solutions/027._Remove_Element.md b/docs/Leetcode_Solutions/027._Remove_Element.md similarity index 100% rename from docs/Leetcode Solutions/027._Remove_Element.md rename to docs/Leetcode_Solutions/027._Remove_Element.md diff --git a/docs/Leetcode Solutions/028._implement_strstr().md b/docs/Leetcode_Solutions/028._implement_strstr().md similarity index 100% rename from docs/Leetcode Solutions/028._implement_strstr().md rename to docs/Leetcode_Solutions/028._implement_strstr().md diff --git a/docs/Leetcode Solutions/030._Substring_with_Concatenation_of_All_Words.md b/docs/Leetcode_Solutions/030._Substring_with_Concatenation_of_All_Words.md similarity index 100% rename from docs/Leetcode Solutions/030._Substring_with_Concatenation_of_All_Words.md rename to docs/Leetcode_Solutions/030._Substring_with_Concatenation_of_All_Words.md diff --git a/docs/Leetcode Solutions/031._next_permutation.md b/docs/Leetcode_Solutions/031._next_permutation.md similarity index 100% rename from docs/Leetcode Solutions/031._next_permutation.md rename to docs/Leetcode_Solutions/031._next_permutation.md diff --git a/docs/Leetcode Solutions/033._search_in_rotated_sorted_array.md b/docs/Leetcode_Solutions/033._search_in_rotated_sorted_array.md similarity index 100% rename from docs/Leetcode Solutions/033._search_in_rotated_sorted_array.md rename to docs/Leetcode_Solutions/033._search_in_rotated_sorted_array.md diff --git a/docs/Leetcode Solutions/034._Search for a Range.md b/docs/Leetcode_Solutions/034._Search for a Range.md similarity index 100% rename from docs/Leetcode Solutions/034._Search for a Range.md rename to docs/Leetcode_Solutions/034._Search for a Range.md diff --git a/docs/Leetcode Solutions/035._search_insert_position.md b/docs/Leetcode_Solutions/035._search_insert_position.md similarity index 100% rename from docs/Leetcode Solutions/035._search_insert_position.md rename to docs/Leetcode_Solutions/035._search_insert_position.md diff --git a/docs/Leetcode Solutions/038._Count_and_Say.md b/docs/Leetcode_Solutions/038._Count_and_Say.md similarity index 100% rename from docs/Leetcode Solutions/038._Count_and_Say.md rename to docs/Leetcode_Solutions/038._Count_and_Say.md diff --git a/docs/Leetcode Solutions/039._combination_sum.md b/docs/Leetcode_Solutions/039._combination_sum.md similarity index 100% rename from docs/Leetcode Solutions/039._combination_sum.md rename to docs/Leetcode_Solutions/039._combination_sum.md diff --git a/docs/Leetcode Solutions/040._combination_sum_ii.md b/docs/Leetcode_Solutions/040._combination_sum_ii.md similarity index 100% rename from docs/Leetcode Solutions/040._combination_sum_ii.md rename to docs/Leetcode_Solutions/040._combination_sum_ii.md diff --git a/docs/Leetcode Solutions/042._trapping_rain_water.md b/docs/Leetcode_Solutions/042._trapping_rain_water.md similarity index 100% rename from docs/Leetcode Solutions/042._trapping_rain_water.md rename to docs/Leetcode_Solutions/042._trapping_rain_water.md diff --git a/docs/Leetcode Solutions/043._multiply_strings.md b/docs/Leetcode_Solutions/043._multiply_strings.md similarity index 100% rename from docs/Leetcode Solutions/043._multiply_strings.md rename to docs/Leetcode_Solutions/043._multiply_strings.md diff --git a/docs/Leetcode Solutions/044._wildcard_matching.md b/docs/Leetcode_Solutions/044._wildcard_matching.md similarity index 100% rename from docs/Leetcode Solutions/044._wildcard_matching.md rename to docs/Leetcode_Solutions/044._wildcard_matching.md diff --git a/docs/Leetcode Solutions/045._Jump_Game_II.md b/docs/Leetcode_Solutions/045._Jump_Game_II.md similarity index 100% rename from docs/Leetcode Solutions/045._Jump_Game_II.md rename to docs/Leetcode_Solutions/045._Jump_Game_II.md diff --git a/docs/Leetcode Solutions/046._permutations.md b/docs/Leetcode_Solutions/046._permutations.md similarity index 100% rename from docs/Leetcode Solutions/046._permutations.md rename to docs/Leetcode_Solutions/046._permutations.md diff --git a/docs/Leetcode Solutions/047._permutations_ii.md b/docs/Leetcode_Solutions/047._permutations_ii.md similarity index 100% rename from docs/Leetcode Solutions/047._permutations_ii.md rename to docs/Leetcode_Solutions/047._permutations_ii.md diff --git a/docs/Leetcode Solutions/048._rotate_image.md b/docs/Leetcode_Solutions/048._rotate_image.md similarity index 100% rename from docs/Leetcode Solutions/048._rotate_image.md rename to docs/Leetcode_Solutions/048._rotate_image.md diff --git a/docs/Leetcode Solutions/049._group_anagrams_python.md b/docs/Leetcode_Solutions/049._group_anagrams_python.md similarity index 100% rename from docs/Leetcode Solutions/049._group_anagrams_python.md rename to docs/Leetcode_Solutions/049._group_anagrams_python.md diff --git a/docs/Leetcode Solutions/050._pow(x,_n).md b/docs/Leetcode_Solutions/050._pow(x,_n).md similarity index 100% rename from docs/Leetcode Solutions/050._pow(x,_n).md rename to docs/Leetcode_Solutions/050._pow(x,_n).md diff --git a/docs/Leetcode Solutions/051._n-queens.md b/docs/Leetcode_Solutions/051._n-queens.md similarity index 100% rename from docs/Leetcode Solutions/051._n-queens.md rename to docs/Leetcode_Solutions/051._n-queens.md diff --git a/docs/Leetcode Solutions/052._n-queens_ii.md b/docs/Leetcode_Solutions/052._n-queens_ii.md similarity index 100% rename from docs/Leetcode Solutions/052._n-queens_ii.md rename to docs/Leetcode_Solutions/052._n-queens_ii.md diff --git a/docs/Leetcode Solutions/053._maximum_subarray.md b/docs/Leetcode_Solutions/053._maximum_subarray.md similarity index 100% rename from docs/Leetcode Solutions/053._maximum_subarray.md rename to docs/Leetcode_Solutions/053._maximum_subarray.md diff --git a/docs/Leetcode Solutions/054._spiral_matrix.md b/docs/Leetcode_Solutions/054._spiral_matrix.md similarity index 100% rename from docs/Leetcode Solutions/054._spiral_matrix.md rename to docs/Leetcode_Solutions/054._spiral_matrix.md diff --git a/docs/Leetcode Solutions/055._jump_game.md b/docs/Leetcode_Solutions/055._jump_game.md similarity index 100% rename from docs/Leetcode Solutions/055._jump_game.md rename to docs/Leetcode_Solutions/055._jump_game.md diff --git a/docs/Leetcode Solutions/056._Merge_Intervals.md b/docs/Leetcode_Solutions/056._Merge_Intervals.md similarity index 100% rename from docs/Leetcode Solutions/056._Merge_Intervals.md rename to docs/Leetcode_Solutions/056._Merge_Intervals.md diff --git a/docs/Leetcode Solutions/058._length_of_last_word.md b/docs/Leetcode_Solutions/058._length_of_last_word.md similarity index 100% rename from docs/Leetcode Solutions/058._length_of_last_word.md rename to docs/Leetcode_Solutions/058._length_of_last_word.md diff --git a/docs/Leetcode Solutions/059._spiral_matrix_ii.md b/docs/Leetcode_Solutions/059._spiral_matrix_ii.md similarity index 100% rename from docs/Leetcode Solutions/059._spiral_matrix_ii.md rename to docs/Leetcode_Solutions/059._spiral_matrix_ii.md diff --git a/docs/Leetcode Solutions/060._permutation_sequence.md b/docs/Leetcode_Solutions/060._permutation_sequence.md similarity index 100% rename from docs/Leetcode Solutions/060._permutation_sequence.md rename to docs/Leetcode_Solutions/060._permutation_sequence.md diff --git a/docs/Leetcode Solutions/061._rotate_list.md b/docs/Leetcode_Solutions/061._rotate_list.md similarity index 100% rename from docs/Leetcode Solutions/061._rotate_list.md rename to docs/Leetcode_Solutions/061._rotate_list.md diff --git a/docs/Leetcode Solutions/064._minimum_path_sum.md b/docs/Leetcode_Solutions/064._minimum_path_sum.md similarity index 100% rename from docs/Leetcode Solutions/064._minimum_path_sum.md rename to docs/Leetcode_Solutions/064._minimum_path_sum.md diff --git a/docs/Leetcode Solutions/065.unique_paths_ii.md b/docs/Leetcode_Solutions/065.unique_paths_ii.md similarity index 100% rename from docs/Leetcode Solutions/065.unique_paths_ii.md rename to docs/Leetcode_Solutions/065.unique_paths_ii.md diff --git a/docs/Leetcode Solutions/066._plus_one.md b/docs/Leetcode_Solutions/066._plus_one.md similarity index 100% rename from docs/Leetcode Solutions/066._plus_one.md rename to docs/Leetcode_Solutions/066._plus_one.md diff --git a/docs/Leetcode Solutions/067._add_binary.md b/docs/Leetcode_Solutions/067._add_binary.md similarity index 100% rename from docs/Leetcode Solutions/067._add_binary.md rename to docs/Leetcode_Solutions/067._add_binary.md diff --git a/docs/Leetcode Solutions/069._sqrt(x).md b/docs/Leetcode_Solutions/069._sqrt(x).md similarity index 100% rename from docs/Leetcode Solutions/069._sqrt(x).md rename to docs/Leetcode_Solutions/069._sqrt(x).md diff --git a/docs/Leetcode Solutions/070. Climbing Stairs.md b/docs/Leetcode_Solutions/070. Climbing Stairs.md similarity index 100% rename from docs/Leetcode Solutions/070. Climbing Stairs.md rename to docs/Leetcode_Solutions/070. Climbing Stairs.md diff --git a/docs/Leetcode Solutions/072._edit_distance.md b/docs/Leetcode_Solutions/072._edit_distance.md similarity index 100% rename from docs/Leetcode Solutions/072._edit_distance.md rename to docs/Leetcode_Solutions/072._edit_distance.md diff --git a/docs/Leetcode Solutions/073. Set Matrix Zeroes.md b/docs/Leetcode_Solutions/073. Set Matrix Zeroes.md similarity index 100% rename from docs/Leetcode Solutions/073. Set Matrix Zeroes.md rename to docs/Leetcode_Solutions/073. Set Matrix Zeroes.md diff --git a/docs/Leetcode Solutions/074._search_a_2d_matrix.md b/docs/Leetcode_Solutions/074._search_a_2d_matrix.md similarity index 100% rename from docs/Leetcode Solutions/074._search_a_2d_matrix.md rename to docs/Leetcode_Solutions/074._search_a_2d_matrix.md diff --git a/docs/Leetcode Solutions/075._sort_colors.md b/docs/Leetcode_Solutions/075._sort_colors.md similarity index 100% rename from docs/Leetcode Solutions/075._sort_colors.md rename to docs/Leetcode_Solutions/075._sort_colors.md diff --git a/docs/Leetcode Solutions/076._Minimum_Window_Substring.md b/docs/Leetcode_Solutions/076._Minimum_Window_Substring.md similarity index 100% rename from docs/Leetcode Solutions/076._Minimum_Window_Substring.md rename to docs/Leetcode_Solutions/076._Minimum_Window_Substring.md diff --git a/docs/Leetcode Solutions/077._combinations.md b/docs/Leetcode_Solutions/077._combinations.md similarity index 100% rename from docs/Leetcode Solutions/077._combinations.md rename to docs/Leetcode_Solutions/077._combinations.md diff --git a/docs/Leetcode Solutions/078.Subsets .md b/docs/Leetcode_Solutions/078.Subsets .md similarity index 100% rename from docs/Leetcode Solutions/078.Subsets .md rename to docs/Leetcode_Solutions/078.Subsets .md diff --git a/docs/Leetcode Solutions/079._word_search.md b/docs/Leetcode_Solutions/079._word_search.md similarity index 100% rename from docs/Leetcode Solutions/079._word_search.md rename to docs/Leetcode_Solutions/079._word_search.md diff --git a/docs/Leetcode Solutions/082._remove_duplicates_from_sorted_list_ii.md b/docs/Leetcode_Solutions/082._remove_duplicates_from_sorted_list_ii.md similarity index 100% rename from docs/Leetcode Solutions/082._remove_duplicates_from_sorted_list_ii.md rename to docs/Leetcode_Solutions/082._remove_duplicates_from_sorted_list_ii.md diff --git a/docs/Leetcode Solutions/083._remove_duplicates_from_sorted_list.md b/docs/Leetcode_Solutions/083._remove_duplicates_from_sorted_list.md similarity index 100% rename from docs/Leetcode Solutions/083._remove_duplicates_from_sorted_list.md rename to docs/Leetcode_Solutions/083._remove_duplicates_from_sorted_list.md diff --git a/docs/Leetcode Solutions/086._partition_list.md b/docs/Leetcode_Solutions/086._partition_list.md similarity index 100% rename from docs/Leetcode Solutions/086._partition_list.md rename to docs/Leetcode_Solutions/086._partition_list.md diff --git a/docs/Leetcode Solutions/088._merge_sorted_array.md b/docs/Leetcode_Solutions/088._merge_sorted_array.md similarity index 100% rename from docs/Leetcode Solutions/088._merge_sorted_array.md rename to docs/Leetcode_Solutions/088._merge_sorted_array.md diff --git a/docs/Leetcode Solutions/089._gray_code.md b/docs/Leetcode_Solutions/089._gray_code.md similarity index 100% rename from docs/Leetcode Solutions/089._gray_code.md rename to docs/Leetcode_Solutions/089._gray_code.md diff --git a/docs/Leetcode Solutions/090._subsets_ii.md b/docs/Leetcode_Solutions/090._subsets_ii.md similarity index 100% rename from docs/Leetcode Solutions/090._subsets_ii.md rename to docs/Leetcode_Solutions/090._subsets_ii.md diff --git a/docs/Leetcode Solutions/091._decode_ways.md b/docs/Leetcode_Solutions/091._decode_ways.md similarity index 100% rename from docs/Leetcode Solutions/091._decode_ways.md rename to docs/Leetcode_Solutions/091._decode_ways.md diff --git a/docs/Leetcode Solutions/092._reverse_linked_list_ii.md b/docs/Leetcode_Solutions/092._reverse_linked_list_ii.md similarity index 100% rename from docs/Leetcode Solutions/092._reverse_linked_list_ii.md rename to docs/Leetcode_Solutions/092._reverse_linked_list_ii.md diff --git a/docs/Leetcode Solutions/093._restore_ip_addresses.md b/docs/Leetcode_Solutions/093._restore_ip_addresses.md similarity index 100% rename from docs/Leetcode Solutions/093._restore_ip_addresses.md rename to docs/Leetcode_Solutions/093._restore_ip_addresses.md diff --git a/docs/Leetcode Solutions/094._binary_tree_inorder_traversal.md b/docs/Leetcode_Solutions/094._binary_tree_inorder_traversal.md similarity index 100% rename from docs/Leetcode Solutions/094._binary_tree_inorder_traversal.md rename to docs/Leetcode_Solutions/094._binary_tree_inorder_traversal.md diff --git a/docs/Leetcode Solutions/096._unique_binary_search_trees.md b/docs/Leetcode_Solutions/096._unique_binary_search_trees.md similarity index 100% rename from docs/Leetcode Solutions/096._unique_binary_search_trees.md rename to docs/Leetcode_Solutions/096._unique_binary_search_trees.md diff --git a/docs/Leetcode Solutions/098._validate_binary_search_tree.md b/docs/Leetcode_Solutions/098._validate_binary_search_tree.md similarity index 100% rename from docs/Leetcode Solutions/098._validate_binary_search_tree.md rename to docs/Leetcode_Solutions/098._validate_binary_search_tree.md diff --git a/docs/Leetcode Solutions/100._same_tree.md b/docs/Leetcode_Solutions/100._same_tree.md similarity index 100% rename from docs/Leetcode Solutions/100._same_tree.md rename to docs/Leetcode_Solutions/100._same_tree.md diff --git a/docs/Leetcode Solutions/101._symmetric_tree.md b/docs/Leetcode_Solutions/101._symmetric_tree.md similarity index 100% rename from docs/Leetcode Solutions/101._symmetric_tree.md rename to docs/Leetcode_Solutions/101._symmetric_tree.md diff --git a/docs/Leetcode Solutions/102._binary_tree_level_order_traversal.md b/docs/Leetcode_Solutions/102._binary_tree_level_order_traversal.md similarity index 100% rename from docs/Leetcode Solutions/102._binary_tree_level_order_traversal.md rename to docs/Leetcode_Solutions/102._binary_tree_level_order_traversal.md diff --git a/docs/Leetcode Solutions/103._binary_tree_zigzag_level_order_traversal.md b/docs/Leetcode_Solutions/103._binary_tree_zigzag_level_order_traversal.md similarity index 100% rename from docs/Leetcode Solutions/103._binary_tree_zigzag_level_order_traversal.md rename to docs/Leetcode_Solutions/103._binary_tree_zigzag_level_order_traversal.md diff --git a/docs/Leetcode Solutions/104._maximum_depth_of_binary_tree.md b/docs/Leetcode_Solutions/104._maximum_depth_of_binary_tree.md similarity index 100% rename from docs/Leetcode Solutions/104._maximum_depth_of_binary_tree.md rename to docs/Leetcode_Solutions/104._maximum_depth_of_binary_tree.md diff --git a/docs/Leetcode Solutions/105._construct_binary_tree_from_preorder_and_inorder_traversal.md b/docs/Leetcode_Solutions/105._construct_binary_tree_from_preorder_and_inorder_traversal.md similarity index 100% rename from docs/Leetcode Solutions/105._construct_binary_tree_from_preorder_and_inorder_traversal.md rename to docs/Leetcode_Solutions/105._construct_binary_tree_from_preorder_and_inorder_traversal.md diff --git a/docs/Leetcode Solutions/106._construct_binary_tree_from_inorder_and_postorder_traversal.md b/docs/Leetcode_Solutions/106._construct_binary_tree_from_inorder_and_postorder_traversal.md similarity index 100% rename from docs/Leetcode Solutions/106._construct_binary_tree_from_inorder_and_postorder_traversal.md rename to docs/Leetcode_Solutions/106._construct_binary_tree_from_inorder_and_postorder_traversal.md diff --git a/docs/Leetcode Solutions/107._binary_tree_level_order_traversal_ii.md b/docs/Leetcode_Solutions/107._binary_tree_level_order_traversal_ii.md similarity index 100% rename from docs/Leetcode Solutions/107._binary_tree_level_order_traversal_ii.md rename to docs/Leetcode_Solutions/107._binary_tree_level_order_traversal_ii.md diff --git a/docs/Leetcode Solutions/108._convert_sorted_array_to_binary_search_tree.md b/docs/Leetcode_Solutions/108._convert_sorted_array_to_binary_search_tree.md similarity index 100% rename from docs/Leetcode Solutions/108._convert_sorted_array_to_binary_search_tree.md rename to docs/Leetcode_Solutions/108._convert_sorted_array_to_binary_search_tree.md diff --git a/docs/Leetcode Solutions/109._convert_sorted_list_to_binary_search_tree.md b/docs/Leetcode_Solutions/109._convert_sorted_list_to_binary_search_tree.md similarity index 100% rename from docs/Leetcode Solutions/109._convert_sorted_list_to_binary_search_tree.md rename to docs/Leetcode_Solutions/109._convert_sorted_list_to_binary_search_tree.md diff --git a/docs/Leetcode Solutions/110._balanced_binary_tree.md b/docs/Leetcode_Solutions/110._balanced_binary_tree.md similarity index 100% rename from docs/Leetcode Solutions/110._balanced_binary_tree.md rename to docs/Leetcode_Solutions/110._balanced_binary_tree.md diff --git a/docs/Leetcode Solutions/111._minimum_depth_of_binary_tree.md b/docs/Leetcode_Solutions/111._minimum_depth_of_binary_tree.md similarity index 100% rename from docs/Leetcode Solutions/111._minimum_depth_of_binary_tree.md rename to docs/Leetcode_Solutions/111._minimum_depth_of_binary_tree.md diff --git a/docs/Leetcode Solutions/112._path_sum.md b/docs/Leetcode_Solutions/112._path_sum.md similarity index 100% rename from docs/Leetcode Solutions/112._path_sum.md rename to docs/Leetcode_Solutions/112._path_sum.md diff --git a/docs/Leetcode Solutions/113._path_sum_ii.md b/docs/Leetcode_Solutions/113._path_sum_ii.md similarity index 100% rename from docs/Leetcode Solutions/113._path_sum_ii.md rename to docs/Leetcode_Solutions/113._path_sum_ii.md diff --git a/docs/Leetcode Solutions/114._flatten_binary_tree_to_linked_list.md b/docs/Leetcode_Solutions/114._flatten_binary_tree_to_linked_list.md similarity index 100% rename from docs/Leetcode Solutions/114._flatten_binary_tree_to_linked_list.md rename to docs/Leetcode_Solutions/114._flatten_binary_tree_to_linked_list.md diff --git a/docs/Leetcode Solutions/116._populating_next_right_pointers_in_each_node.md b/docs/Leetcode_Solutions/116._populating_next_right_pointers_in_each_node.md similarity index 100% rename from docs/Leetcode Solutions/116._populating_next_right_pointers_in_each_node.md rename to docs/Leetcode_Solutions/116._populating_next_right_pointers_in_each_node.md diff --git a/docs/Leetcode Solutions/118._pascal's_triangle.md b/docs/Leetcode_Solutions/118._pascal's_triangle.md similarity index 100% rename from docs/Leetcode Solutions/118._pascal's_triangle.md rename to docs/Leetcode_Solutions/118._pascal's_triangle.md diff --git a/docs/Leetcode Solutions/119. Pascal's Triangle II.md b/docs/Leetcode_Solutions/119. Pascal's Triangle II.md similarity index 100% rename from docs/Leetcode Solutions/119. Pascal's Triangle II.md rename to docs/Leetcode_Solutions/119. Pascal's Triangle II.md diff --git a/docs/Leetcode Solutions/120. Triangle.md b/docs/Leetcode_Solutions/120. Triangle.md similarity index 100% rename from docs/Leetcode Solutions/120. Triangle.md rename to docs/Leetcode_Solutions/120. Triangle.md diff --git a/docs/Leetcode Solutions/121._Best_Time_to_Buy_and_Sell_Stock.md b/docs/Leetcode_Solutions/121._Best_Time_to_Buy_and_Sell_Stock.md similarity index 100% rename from docs/Leetcode Solutions/121._Best_Time_to_Buy_and_Sell_Stock.md rename to docs/Leetcode_Solutions/121._Best_Time_to_Buy_and_Sell_Stock.md diff --git a/docs/Leetcode Solutions/125._valid_palindrome.md b/docs/Leetcode_Solutions/125._valid_palindrome.md similarity index 100% rename from docs/Leetcode Solutions/125._valid_palindrome.md rename to docs/Leetcode_Solutions/125._valid_palindrome.md diff --git a/docs/Leetcode Solutions/126. Word Ladder II.md b/docs/Leetcode_Solutions/126. Word Ladder II.md similarity index 100% rename from docs/Leetcode Solutions/126. Word Ladder II.md rename to docs/Leetcode_Solutions/126. Word Ladder II.md diff --git a/docs/Leetcode Solutions/127._word_ladder.md b/docs/Leetcode_Solutions/127._word_ladder.md similarity index 100% rename from docs/Leetcode Solutions/127._word_ladder.md rename to docs/Leetcode_Solutions/127._word_ladder.md diff --git a/docs/Leetcode Solutions/128._Longest_Consecutive_Sequence.md b/docs/Leetcode_Solutions/128._Longest_Consecutive_Sequence.md similarity index 100% rename from docs/Leetcode Solutions/128._Longest_Consecutive_Sequence.md rename to docs/Leetcode_Solutions/128._Longest_Consecutive_Sequence.md diff --git a/docs/Leetcode Solutions/129._sum_root_to_leaf_numbers.md b/docs/Leetcode_Solutions/129._sum_root_to_leaf_numbers.md similarity index 100% rename from docs/Leetcode Solutions/129._sum_root_to_leaf_numbers.md rename to docs/Leetcode_Solutions/129._sum_root_to_leaf_numbers.md diff --git a/docs/Leetcode Solutions/130._surrounded_regions.md b/docs/Leetcode_Solutions/130._surrounded_regions.md similarity index 100% rename from docs/Leetcode Solutions/130._surrounded_regions.md rename to docs/Leetcode_Solutions/130._surrounded_regions.md diff --git a/docs/Leetcode Solutions/131._palindrome_partitioning.md b/docs/Leetcode_Solutions/131._palindrome_partitioning.md similarity index 100% rename from docs/Leetcode Solutions/131._palindrome_partitioning.md rename to docs/Leetcode_Solutions/131._palindrome_partitioning.md diff --git a/docs/Leetcode Solutions/133._clone_graph.md b/docs/Leetcode_Solutions/133._clone_graph.md similarity index 100% rename from docs/Leetcode Solutions/133._clone_graph.md rename to docs/Leetcode_Solutions/133._clone_graph.md diff --git a/docs/Leetcode Solutions/136._single_number.md b/docs/Leetcode_Solutions/136._single_number.md similarity index 100% rename from docs/Leetcode Solutions/136._single_number.md rename to docs/Leetcode_Solutions/136._single_number.md diff --git a/docs/Leetcode Solutions/139._word_break.md b/docs/Leetcode_Solutions/139._word_break.md similarity index 100% rename from docs/Leetcode Solutions/139._word_break.md rename to docs/Leetcode_Solutions/139._word_break.md diff --git a/docs/Leetcode Solutions/140._word_break_ii.md b/docs/Leetcode_Solutions/140._word_break_ii.md similarity index 100% rename from docs/Leetcode Solutions/140._word_break_ii.md rename to docs/Leetcode_Solutions/140._word_break_ii.md diff --git a/docs/Leetcode Solutions/141._linked_list_cycle.md b/docs/Leetcode_Solutions/141._linked_list_cycle.md similarity index 100% rename from docs/Leetcode Solutions/141._linked_list_cycle.md rename to docs/Leetcode_Solutions/141._linked_list_cycle.md diff --git a/docs/Leetcode Solutions/142_Linked_List_Cycle_II.md b/docs/Leetcode_Solutions/142_Linked_List_Cycle_II.md similarity index 100% rename from docs/Leetcode Solutions/142_Linked_List_Cycle_II.md rename to docs/Leetcode_Solutions/142_Linked_List_Cycle_II.md diff --git a/docs/Leetcode Solutions/143._reorder_list.md b/docs/Leetcode_Solutions/143._reorder_list.md similarity index 100% rename from docs/Leetcode Solutions/143._reorder_list.md rename to docs/Leetcode_Solutions/143._reorder_list.md diff --git a/docs/Leetcode Solutions/144._binary_tree_preorder_traversal.md b/docs/Leetcode_Solutions/144._binary_tree_preorder_traversal.md similarity index 100% rename from docs/Leetcode Solutions/144._binary_tree_preorder_traversal.md rename to docs/Leetcode_Solutions/144._binary_tree_preorder_traversal.md diff --git a/docs/Leetcode Solutions/145._binary_tree_postorder_traversal.md b/docs/Leetcode_Solutions/145._binary_tree_postorder_traversal.md similarity index 100% rename from docs/Leetcode Solutions/145._binary_tree_postorder_traversal.md rename to docs/Leetcode_Solutions/145._binary_tree_postorder_traversal.md diff --git a/docs/Leetcode Solutions/147._insertion_sort_list.md b/docs/Leetcode_Solutions/147._insertion_sort_list.md similarity index 100% rename from docs/Leetcode Solutions/147._insertion_sort_list.md rename to docs/Leetcode_Solutions/147._insertion_sort_list.md diff --git a/docs/Leetcode Solutions/148._sort_list.md b/docs/Leetcode_Solutions/148._sort_list.md similarity index 100% rename from docs/Leetcode Solutions/148._sort_list.md rename to docs/Leetcode_Solutions/148._sort_list.md diff --git a/docs/Leetcode Solutions/150._evaluate_reverse_polish_notation.md b/docs/Leetcode_Solutions/150._evaluate_reverse_polish_notation.md similarity index 100% rename from docs/Leetcode Solutions/150._evaluate_reverse_polish_notation.md rename to docs/Leetcode_Solutions/150._evaluate_reverse_polish_notation.md diff --git a/docs/Leetcode Solutions/151._reverse_words_in_a_string.md b/docs/Leetcode_Solutions/151._reverse_words_in_a_string.md similarity index 100% rename from docs/Leetcode Solutions/151._reverse_words_in_a_string.md rename to docs/Leetcode_Solutions/151._reverse_words_in_a_string.md diff --git a/docs/Leetcode Solutions/152._maximum_product_subarray.md b/docs/Leetcode_Solutions/152._maximum_product_subarray.md similarity index 100% rename from docs/Leetcode Solutions/152._maximum_product_subarray.md rename to docs/Leetcode_Solutions/152._maximum_product_subarray.md diff --git a/docs/Leetcode Solutions/153._find_minimum_in_rotated_sorted_array.md b/docs/Leetcode_Solutions/153._find_minimum_in_rotated_sorted_array.md similarity index 100% rename from docs/Leetcode Solutions/153._find_minimum_in_rotated_sorted_array.md rename to docs/Leetcode_Solutions/153._find_minimum_in_rotated_sorted_array.md diff --git a/docs/Leetcode Solutions/155._min_stack.md b/docs/Leetcode_Solutions/155._min_stack.md similarity index 100% rename from docs/Leetcode Solutions/155._min_stack.md rename to docs/Leetcode_Solutions/155._min_stack.md diff --git a/docs/Leetcode Solutions/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md b/docs/Leetcode_Solutions/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md similarity index 100% rename from docs/Leetcode Solutions/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md rename to docs/Leetcode_Solutions/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md diff --git a/docs/Leetcode Solutions/160._intersection_of_two_linked_lists.md b/docs/Leetcode_Solutions/160._intersection_of_two_linked_lists.md similarity index 100% rename from docs/Leetcode Solutions/160._intersection_of_two_linked_lists.md rename to docs/Leetcode_Solutions/160._intersection_of_two_linked_lists.md diff --git a/docs/Leetcode Solutions/162._find_peak_element.md b/docs/Leetcode_Solutions/162._find_peak_element.md similarity index 100% rename from docs/Leetcode Solutions/162._find_peak_element.md rename to docs/Leetcode_Solutions/162._find_peak_element.md diff --git a/docs/Leetcode Solutions/165._compare_version_numbers.md b/docs/Leetcode_Solutions/165._compare_version_numbers.md similarity index 100% rename from docs/Leetcode Solutions/165._compare_version_numbers.md rename to docs/Leetcode_Solutions/165._compare_version_numbers.md diff --git a/docs/Leetcode Solutions/166._Fraction_to_Recurring_Decimal.md b/docs/Leetcode_Solutions/166._Fraction_to_Recurring_Decimal.md similarity index 100% rename from docs/Leetcode Solutions/166._Fraction_to_Recurring_Decimal.md rename to docs/Leetcode_Solutions/166._Fraction_to_Recurring_Decimal.md diff --git a/docs/Leetcode Solutions/167._two_sum_ii_-_input_array_is_sorted.md b/docs/Leetcode_Solutions/167._two_sum_ii_-_input_array_is_sorted.md similarity index 100% rename from docs/Leetcode Solutions/167._two_sum_ii_-_input_array_is_sorted.md rename to docs/Leetcode_Solutions/167._two_sum_ii_-_input_array_is_sorted.md diff --git a/docs/Leetcode Solutions/168._excel_sheet_column_title.md b/docs/Leetcode_Solutions/168._excel_sheet_column_title.md similarity index 100% rename from docs/Leetcode Solutions/168._excel_sheet_column_title.md rename to docs/Leetcode_Solutions/168._excel_sheet_column_title.md diff --git a/docs/Leetcode Solutions/169._majority_element.md b/docs/Leetcode_Solutions/169._majority_element.md similarity index 100% rename from docs/Leetcode Solutions/169._majority_element.md rename to docs/Leetcode_Solutions/169._majority_element.md diff --git a/docs/Leetcode Solutions/171._excel_sheet_column_number.md b/docs/Leetcode_Solutions/171._excel_sheet_column_number.md similarity index 100% rename from docs/Leetcode Solutions/171._excel_sheet_column_number.md rename to docs/Leetcode_Solutions/171._excel_sheet_column_number.md diff --git a/docs/Leetcode Solutions/173._binary_search_tree_iterator.md b/docs/Leetcode_Solutions/173._binary_search_tree_iterator.md similarity index 100% rename from docs/Leetcode Solutions/173._binary_search_tree_iterator.md rename to docs/Leetcode_Solutions/173._binary_search_tree_iterator.md diff --git a/docs/Leetcode Solutions/189._rotate_array.md b/docs/Leetcode_Solutions/189._rotate_array.md similarity index 100% rename from docs/Leetcode Solutions/189._rotate_array.md rename to docs/Leetcode_Solutions/189._rotate_array.md diff --git a/docs/Leetcode Solutions/191._number_of_1_bits.md b/docs/Leetcode_Solutions/191._number_of_1_bits.md similarity index 100% rename from docs/Leetcode Solutions/191._number_of_1_bits.md rename to docs/Leetcode_Solutions/191._number_of_1_bits.md diff --git a/docs/Leetcode Solutions/198._house_robber.md b/docs/Leetcode_Solutions/198._house_robber.md similarity index 100% rename from docs/Leetcode Solutions/198._house_robber.md rename to docs/Leetcode_Solutions/198._house_robber.md diff --git a/docs/Leetcode Solutions/199._binary_tree_right_side_view.md b/docs/Leetcode_Solutions/199._binary_tree_right_side_view.md similarity index 100% rename from docs/Leetcode Solutions/199._binary_tree_right_side_view.md rename to docs/Leetcode_Solutions/199._binary_tree_right_side_view.md diff --git a/docs/Leetcode Solutions/200._number_of_islands.md b/docs/Leetcode_Solutions/200._number_of_islands.md similarity index 100% rename from docs/Leetcode Solutions/200._number_of_islands.md rename to docs/Leetcode_Solutions/200._number_of_islands.md diff --git a/docs/Leetcode Solutions/203._remove_linked_list_elements.md b/docs/Leetcode_Solutions/203._remove_linked_list_elements.md similarity index 100% rename from docs/Leetcode Solutions/203._remove_linked_list_elements.md rename to docs/Leetcode_Solutions/203._remove_linked_list_elements.md diff --git a/docs/Leetcode Solutions/204._count_primes.md b/docs/Leetcode_Solutions/204._count_primes.md similarity index 100% rename from docs/Leetcode Solutions/204._count_primes.md rename to docs/Leetcode_Solutions/204._count_primes.md diff --git a/docs/Leetcode Solutions/205._isomorphic_strings.md b/docs/Leetcode_Solutions/205._isomorphic_strings.md similarity index 100% rename from docs/Leetcode Solutions/205._isomorphic_strings.md rename to docs/Leetcode_Solutions/205._isomorphic_strings.md diff --git a/docs/Leetcode Solutions/206._reverse_linked_list.md b/docs/Leetcode_Solutions/206._reverse_linked_list.md similarity index 100% rename from docs/Leetcode Solutions/206._reverse_linked_list.md rename to docs/Leetcode_Solutions/206._reverse_linked_list.md diff --git a/docs/Leetcode Solutions/207._course_schedule.md b/docs/Leetcode_Solutions/207._course_schedule.md similarity index 100% rename from docs/Leetcode Solutions/207._course_schedule.md rename to docs/Leetcode_Solutions/207._course_schedule.md diff --git a/docs/Leetcode Solutions/208._implement_trie_(prefix_tree).md b/docs/Leetcode_Solutions/208._implement_trie_(prefix_tree).md similarity index 100% rename from docs/Leetcode Solutions/208._implement_trie_(prefix_tree).md rename to docs/Leetcode_Solutions/208._implement_trie_(prefix_tree).md diff --git a/docs/Leetcode Solutions/210._course_schedule_ii.md b/docs/Leetcode_Solutions/210._course_schedule_ii.md similarity index 100% rename from docs/Leetcode Solutions/210._course_schedule_ii.md rename to docs/Leetcode_Solutions/210._course_schedule_ii.md diff --git a/docs/Leetcode Solutions/211. Add and Search Word - Data structure design.md b/docs/Leetcode_Solutions/211. Add and Search Word - Data structure design.md similarity index 100% rename from docs/Leetcode Solutions/211. Add and Search Word - Data structure design.md rename to docs/Leetcode_Solutions/211. Add and Search Word - Data structure design.md diff --git a/docs/Leetcode Solutions/213._house_robber_ii.md b/docs/Leetcode_Solutions/213._house_robber_ii.md similarity index 100% rename from docs/Leetcode Solutions/213._house_robber_ii.md rename to docs/Leetcode_Solutions/213._house_robber_ii.md diff --git a/docs/Leetcode Solutions/216._combination_sum_iii.md b/docs/Leetcode_Solutions/216._combination_sum_iii.md similarity index 100% rename from docs/Leetcode Solutions/216._combination_sum_iii.md rename to docs/Leetcode_Solutions/216._combination_sum_iii.md diff --git a/docs/Leetcode Solutions/217._contains_duplicate.md b/docs/Leetcode_Solutions/217._contains_duplicate.md similarity index 100% rename from docs/Leetcode Solutions/217._contains_duplicate.md rename to docs/Leetcode_Solutions/217._contains_duplicate.md diff --git a/docs/Leetcode Solutions/218._The _Skyline_Problem .md b/docs/Leetcode_Solutions/218._The _Skyline_Problem .md similarity index 100% rename from docs/Leetcode Solutions/218._The _Skyline_Problem .md rename to docs/Leetcode_Solutions/218._The _Skyline_Problem .md diff --git a/docs/Leetcode Solutions/219._contains_duplicate_ii.md b/docs/Leetcode_Solutions/219._contains_duplicate_ii.md similarity index 100% rename from docs/Leetcode Solutions/219._contains_duplicate_ii.md rename to docs/Leetcode_Solutions/219._contains_duplicate_ii.md diff --git a/docs/Leetcode Solutions/221._maximal_square.md b/docs/Leetcode_Solutions/221._maximal_square.md similarity index 100% rename from docs/Leetcode Solutions/221._maximal_square.md rename to docs/Leetcode_Solutions/221._maximal_square.md diff --git a/docs/Leetcode Solutions/222._count_complete_tree_nodes.md b/docs/Leetcode_Solutions/222._count_complete_tree_nodes.md similarity index 100% rename from docs/Leetcode Solutions/222._count_complete_tree_nodes.md rename to docs/Leetcode_Solutions/222._count_complete_tree_nodes.md diff --git a/docs/Leetcode Solutions/223._rectangle_area.md b/docs/Leetcode_Solutions/223._rectangle_area.md similarity index 100% rename from docs/Leetcode Solutions/223._rectangle_area.md rename to docs/Leetcode_Solutions/223._rectangle_area.md diff --git a/docs/Leetcode Solutions/224. Basic Calculator .md b/docs/Leetcode_Solutions/224. Basic Calculator .md similarity index 100% rename from docs/Leetcode Solutions/224. Basic Calculator .md rename to docs/Leetcode_Solutions/224. Basic Calculator .md diff --git a/docs/Leetcode Solutions/225._implement_stack_using_queues.md b/docs/Leetcode_Solutions/225._implement_stack_using_queues.md similarity index 100% rename from docs/Leetcode Solutions/225._implement_stack_using_queues.md rename to docs/Leetcode_Solutions/225._implement_stack_using_queues.md diff --git a/docs/Leetcode Solutions/226._invert_binary_tree.md b/docs/Leetcode_Solutions/226._invert_binary_tree.md similarity index 100% rename from docs/Leetcode Solutions/226._invert_binary_tree.md rename to docs/Leetcode_Solutions/226._invert_binary_tree.md diff --git a/docs/Leetcode Solutions/227._basic_calculator_ii.md b/docs/Leetcode_Solutions/227._basic_calculator_ii.md similarity index 100% rename from docs/Leetcode Solutions/227._basic_calculator_ii.md rename to docs/Leetcode_Solutions/227._basic_calculator_ii.md diff --git a/docs/Leetcode Solutions/228._summary_ranges.md b/docs/Leetcode_Solutions/228._summary_ranges.md similarity index 100% rename from docs/Leetcode Solutions/228._summary_ranges.md rename to docs/Leetcode_Solutions/228._summary_ranges.md diff --git a/docs/Leetcode Solutions/229._majority_element_ii.md b/docs/Leetcode_Solutions/229._majority_element_ii.md similarity index 100% rename from docs/Leetcode Solutions/229._majority_element_ii.md rename to docs/Leetcode_Solutions/229._majority_element_ii.md diff --git a/docs/Leetcode Solutions/230._kth_smallest_element_in_a_bst.md b/docs/Leetcode_Solutions/230._kth_smallest_element_in_a_bst.md similarity index 100% rename from docs/Leetcode Solutions/230._kth_smallest_element_in_a_bst.md rename to docs/Leetcode_Solutions/230._kth_smallest_element_in_a_bst.md diff --git a/docs/Leetcode Solutions/231. _Power_of_Two.md b/docs/Leetcode_Solutions/231. _Power_of_Two.md similarity index 100% rename from docs/Leetcode Solutions/231. _Power_of_Two.md rename to docs/Leetcode_Solutions/231. _Power_of_Two.md diff --git a/docs/Leetcode Solutions/232._implement_queue_using_stacks.md b/docs/Leetcode_Solutions/232._implement_queue_using_stacks.md similarity index 100% rename from docs/Leetcode Solutions/232._implement_queue_using_stacks.md rename to docs/Leetcode_Solutions/232._implement_queue_using_stacks.md diff --git a/docs/Leetcode Solutions/234._palindrome_linked_list.md b/docs/Leetcode_Solutions/234._palindrome_linked_list.md similarity index 100% rename from docs/Leetcode Solutions/234._palindrome_linked_list.md rename to docs/Leetcode_Solutions/234._palindrome_linked_list.md diff --git a/docs/Leetcode Solutions/235._lowest_common_ancestor_of_a_binary_search_tree.md b/docs/Leetcode_Solutions/235._lowest_common_ancestor_of_a_binary_search_tree.md similarity index 100% rename from docs/Leetcode Solutions/235._lowest_common_ancestor_of_a_binary_search_tree.md rename to docs/Leetcode_Solutions/235._lowest_common_ancestor_of_a_binary_search_tree.md diff --git a/docs/Leetcode Solutions/236._lowest_common_ancestor_of_a_binary_tree.md b/docs/Leetcode_Solutions/236._lowest_common_ancestor_of_a_binary_tree.md similarity index 100% rename from docs/Leetcode Solutions/236._lowest_common_ancestor_of_a_binary_tree.md rename to docs/Leetcode_Solutions/236._lowest_common_ancestor_of_a_binary_tree.md diff --git a/docs/Leetcode Solutions/237._delete_node_in_a_linked_list.md b/docs/Leetcode_Solutions/237._delete_node_in_a_linked_list.md similarity index 100% rename from docs/Leetcode Solutions/237._delete_node_in_a_linked_list.md rename to docs/Leetcode_Solutions/237._delete_node_in_a_linked_list.md diff --git a/docs/Leetcode Solutions/238._product_of_array_except_self.md b/docs/Leetcode_Solutions/238._product_of_array_except_self.md similarity index 100% rename from docs/Leetcode Solutions/238._product_of_array_except_self.md rename to docs/Leetcode_Solutions/238._product_of_array_except_self.md diff --git a/docs/Leetcode Solutions/240._search_a_2d_matrix_ii.md b/docs/Leetcode_Solutions/240._search_a_2d_matrix_ii.md similarity index 100% rename from docs/Leetcode Solutions/240._search_a_2d_matrix_ii.md rename to docs/Leetcode_Solutions/240._search_a_2d_matrix_ii.md diff --git a/docs/Leetcode Solutions/242._valid_anagram.md b/docs/Leetcode_Solutions/242._valid_anagram.md similarity index 100% rename from docs/Leetcode Solutions/242._valid_anagram.md rename to docs/Leetcode_Solutions/242._valid_anagram.md diff --git a/docs/Leetcode Solutions/252. Meeting Rooms.md b/docs/Leetcode_Solutions/252. Meeting Rooms.md similarity index 100% rename from docs/Leetcode Solutions/252. Meeting Rooms.md rename to docs/Leetcode_Solutions/252. Meeting Rooms.md diff --git a/docs/Leetcode Solutions/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md b/docs/Leetcode_Solutions/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md similarity index 100% rename from docs/Leetcode Solutions/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md rename to docs/Leetcode_Solutions/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md diff --git a/docs/Leetcode Solutions/256. Paint House.md b/docs/Leetcode_Solutions/256. Paint House.md similarity index 100% rename from docs/Leetcode Solutions/256. Paint House.md rename to docs/Leetcode_Solutions/256. Paint House.md diff --git a/docs/Leetcode Solutions/257._binary_tree_paths.md b/docs/Leetcode_Solutions/257._binary_tree_paths.md similarity index 100% rename from docs/Leetcode Solutions/257._binary_tree_paths.md rename to docs/Leetcode_Solutions/257._binary_tree_paths.md diff --git a/docs/Leetcode Solutions/258_ Add_Digits.md b/docs/Leetcode_Solutions/258_ Add_Digits.md similarity index 100% rename from docs/Leetcode Solutions/258_ Add_Digits.md rename to docs/Leetcode_Solutions/258_ Add_Digits.md diff --git a/docs/Leetcode Solutions/261. Graph Valid Tree.md b/docs/Leetcode_Solutions/261. Graph Valid Tree.md similarity index 100% rename from docs/Leetcode Solutions/261. Graph Valid Tree.md rename to docs/Leetcode_Solutions/261. Graph Valid Tree.md diff --git a/docs/Leetcode Solutions/263._ugly_number.md b/docs/Leetcode_Solutions/263._ugly_number.md similarity index 100% rename from docs/Leetcode Solutions/263._ugly_number.md rename to docs/Leetcode_Solutions/263._ugly_number.md diff --git a/docs/Leetcode Solutions/264._ugly_number_ii.md b/docs/Leetcode_Solutions/264._ugly_number_ii.md similarity index 100% rename from docs/Leetcode Solutions/264._ugly_number_ii.md rename to docs/Leetcode_Solutions/264._ugly_number_ii.md diff --git a/docs/Leetcode Solutions/265. Paint House II.md b/docs/Leetcode_Solutions/265. Paint House II.md similarity index 100% rename from docs/Leetcode Solutions/265. Paint House II.md rename to docs/Leetcode_Solutions/265. Paint House II.md diff --git a/docs/Leetcode Solutions/266. Palindrome Permutation.md b/docs/Leetcode_Solutions/266. Palindrome Permutation.md similarity index 100% rename from docs/Leetcode Solutions/266. Palindrome Permutation.md rename to docs/Leetcode_Solutions/266. Palindrome Permutation.md diff --git a/docs/Leetcode Solutions/267. Palindrome Permutation II.md b/docs/Leetcode_Solutions/267. Palindrome Permutation II.md similarity index 100% rename from docs/Leetcode Solutions/267. Palindrome Permutation II.md rename to docs/Leetcode_Solutions/267. Palindrome Permutation II.md diff --git a/docs/Leetcode Solutions/268._missing_number.md b/docs/Leetcode_Solutions/268._missing_number.md similarity index 100% rename from docs/Leetcode Solutions/268._missing_number.md rename to docs/Leetcode_Solutions/268._missing_number.md diff --git a/docs/Leetcode Solutions/270. Closest Binary Search Tree Value.md b/docs/Leetcode_Solutions/270. Closest Binary Search Tree Value.md similarity index 100% rename from docs/Leetcode Solutions/270. Closest Binary Search Tree Value.md rename to docs/Leetcode_Solutions/270. Closest Binary Search Tree Value.md diff --git a/docs/Leetcode Solutions/276. Paint Fence.md b/docs/Leetcode_Solutions/276. Paint Fence.md similarity index 100% rename from docs/Leetcode Solutions/276. Paint Fence.md rename to docs/Leetcode_Solutions/276. Paint Fence.md diff --git a/docs/Leetcode Solutions/277. Find the Celebrity.md b/docs/Leetcode_Solutions/277. Find the Celebrity.md similarity index 100% rename from docs/Leetcode Solutions/277. Find the Celebrity.md rename to docs/Leetcode_Solutions/277. Find the Celebrity.md diff --git a/docs/Leetcode Solutions/278._First_Bad _Version.md b/docs/Leetcode_Solutions/278._First_Bad _Version.md similarity index 100% rename from docs/Leetcode Solutions/278._First_Bad _Version.md rename to docs/Leetcode_Solutions/278._First_Bad _Version.md diff --git a/docs/Leetcode Solutions/279._perfect_squares.md b/docs/Leetcode_Solutions/279._perfect_squares.md similarity index 100% rename from docs/Leetcode Solutions/279._perfect_squares.md rename to docs/Leetcode_Solutions/279._perfect_squares.md diff --git a/docs/Leetcode Solutions/280._Wiggle_Sort.md b/docs/Leetcode_Solutions/280._Wiggle_Sort.md similarity index 100% rename from docs/Leetcode Solutions/280._Wiggle_Sort.md rename to docs/Leetcode_Solutions/280._Wiggle_Sort.md diff --git a/docs/Leetcode Solutions/283._move_zeroes.md b/docs/Leetcode_Solutions/283._move_zeroes.md similarity index 100% rename from docs/Leetcode Solutions/283._move_zeroes.md rename to docs/Leetcode_Solutions/283._move_zeroes.md diff --git a/docs/Leetcode Solutions/285._inorder_successor_in_bst.md b/docs/Leetcode_Solutions/285._inorder_successor_in_bst.md similarity index 100% rename from docs/Leetcode Solutions/285._inorder_successor_in_bst.md rename to docs/Leetcode_Solutions/285._inorder_successor_in_bst.md diff --git a/docs/Leetcode Solutions/286. Walls and Gates.md b/docs/Leetcode_Solutions/286. Walls and Gates.md similarity index 100% rename from docs/Leetcode Solutions/286. Walls and Gates.md rename to docs/Leetcode_Solutions/286. Walls and Gates.md diff --git a/docs/Leetcode Solutions/289._game_of_life.md b/docs/Leetcode_Solutions/289._game_of_life.md similarity index 100% rename from docs/Leetcode Solutions/289._game_of_life.md rename to docs/Leetcode_Solutions/289._game_of_life.md diff --git a/docs/Leetcode Solutions/290._word_pattern.md b/docs/Leetcode_Solutions/290._word_pattern.md similarity index 100% rename from docs/Leetcode Solutions/290._word_pattern.md rename to docs/Leetcode_Solutions/290._word_pattern.md diff --git a/docs/Leetcode Solutions/292._nim_game.md b/docs/Leetcode_Solutions/292._nim_game.md similarity index 100% rename from docs/Leetcode Solutions/292._nim_game.md rename to docs/Leetcode_Solutions/292._nim_game.md diff --git a/docs/Leetcode Solutions/296. Best Meeting Point.md b/docs/Leetcode_Solutions/296. Best Meeting Point.md similarity index 100% rename from docs/Leetcode Solutions/296. Best Meeting Point.md rename to docs/Leetcode_Solutions/296. Best Meeting Point.md diff --git a/docs/Leetcode Solutions/298. Binary Tree Longest Consecutive Sequence.md b/docs/Leetcode_Solutions/298. Binary Tree Longest Consecutive Sequence.md similarity index 100% rename from docs/Leetcode Solutions/298. Binary Tree Longest Consecutive Sequence.md rename to docs/Leetcode_Solutions/298. Binary Tree Longest Consecutive Sequence.md diff --git a/docs/Leetcode Solutions/299._bulls_and_cows.md b/docs/Leetcode_Solutions/299._bulls_and_cows.md similarity index 100% rename from docs/Leetcode Solutions/299._bulls_and_cows.md rename to docs/Leetcode_Solutions/299._bulls_and_cows.md diff --git a/docs/Leetcode Solutions/300._longest_increasing_subsequence.md b/docs/Leetcode_Solutions/300._longest_increasing_subsequence.md similarity index 100% rename from docs/Leetcode Solutions/300._longest_increasing_subsequence.md rename to docs/Leetcode_Solutions/300._longest_increasing_subsequence.md diff --git a/docs/Leetcode Solutions/303._range_sum_query_-_immutable.md b/docs/Leetcode_Solutions/303._range_sum_query_-_immutable.md similarity index 100% rename from docs/Leetcode Solutions/303._range_sum_query_-_immutable.md rename to docs/Leetcode_Solutions/303._range_sum_query_-_immutable.md diff --git a/docs/Leetcode Solutions/316._Remove_Duplicate_Letters.md b/docs/Leetcode_Solutions/316._Remove_Duplicate_Letters.md similarity index 100% rename from docs/Leetcode Solutions/316._Remove_Duplicate_Letters.md rename to docs/Leetcode_Solutions/316._Remove_Duplicate_Letters.md diff --git a/docs/Leetcode Solutions/319._Bulb_Switcher.md b/docs/Leetcode_Solutions/319._Bulb_Switcher.md similarity index 100% rename from docs/Leetcode Solutions/319._Bulb_Switcher.md rename to docs/Leetcode_Solutions/319._Bulb_Switcher.md diff --git a/docs/Leetcode Solutions/322. Coin Change.md b/docs/Leetcode_Solutions/322. Coin Change.md similarity index 100% rename from docs/Leetcode Solutions/322. Coin Change.md rename to docs/Leetcode_Solutions/322. Coin Change.md diff --git a/docs/Leetcode Solutions/323. Number of Connected Components in an Undirected Graph.md b/docs/Leetcode_Solutions/323. Number of Connected Components in an Undirected Graph.md similarity index 100% rename from docs/Leetcode Solutions/323. Number of Connected Components in an Undirected Graph.md rename to docs/Leetcode_Solutions/323. Number of Connected Components in an Undirected Graph.md diff --git a/docs/Leetcode Solutions/324._Wiggle_Sort_II.md b/docs/Leetcode_Solutions/324._Wiggle_Sort_II.md similarity index 100% rename from docs/Leetcode Solutions/324._Wiggle_Sort_II.md rename to docs/Leetcode_Solutions/324._Wiggle_Sort_II.md diff --git a/docs/Leetcode Solutions/326._power_of_three.md b/docs/Leetcode_Solutions/326._power_of_three.md similarity index 100% rename from docs/Leetcode Solutions/326._power_of_three.md rename to docs/Leetcode_Solutions/326._power_of_three.md diff --git a/docs/Leetcode Solutions/328._odd_even_linked_list.md b/docs/Leetcode_Solutions/328._odd_even_linked_list.md similarity index 100% rename from docs/Leetcode Solutions/328._odd_even_linked_list.md rename to docs/Leetcode_Solutions/328._odd_even_linked_list.md diff --git a/docs/Leetcode Solutions/334._increasing_triplet_subsequence.md b/docs/Leetcode_Solutions/334._increasing_triplet_subsequence.md similarity index 100% rename from docs/Leetcode Solutions/334._increasing_triplet_subsequence.md rename to docs/Leetcode_Solutions/334._increasing_triplet_subsequence.md diff --git a/docs/Leetcode Solutions/337._house_robber_iii.md b/docs/Leetcode_Solutions/337._house_robber_iii.md similarity index 100% rename from docs/Leetcode Solutions/337._house_robber_iii.md rename to docs/Leetcode_Solutions/337._house_robber_iii.md diff --git a/docs/Leetcode Solutions/338. Counting Bits.md b/docs/Leetcode_Solutions/338. Counting Bits.md similarity index 100% rename from docs/Leetcode Solutions/338. Counting Bits.md rename to docs/Leetcode_Solutions/338. Counting Bits.md diff --git a/docs/Leetcode Solutions/339. Nested List Weight Sum.md b/docs/Leetcode_Solutions/339. Nested List Weight Sum.md similarity index 100% rename from docs/Leetcode Solutions/339. Nested List Weight Sum.md rename to docs/Leetcode_Solutions/339. Nested List Weight Sum.md diff --git a/docs/Leetcode Solutions/341._Flatten_Nested_List_Iterator.md b/docs/Leetcode_Solutions/341._Flatten_Nested_List_Iterator.md similarity index 100% rename from docs/Leetcode Solutions/341._Flatten_Nested_List_Iterator.md rename to docs/Leetcode_Solutions/341._Flatten_Nested_List_Iterator.md diff --git a/docs/Leetcode Solutions/342._Power_of_Four.md b/docs/Leetcode_Solutions/342._Power_of_Four.md similarity index 100% rename from docs/Leetcode Solutions/342._Power_of_Four.md rename to docs/Leetcode_Solutions/342._Power_of_Four.md diff --git a/docs/Leetcode Solutions/344._reverse_string.md b/docs/Leetcode_Solutions/344._reverse_string.md similarity index 100% rename from docs/Leetcode Solutions/344._reverse_string.md rename to docs/Leetcode_Solutions/344._reverse_string.md diff --git a/docs/Leetcode Solutions/345._Reverse_Vowels_of_a_String.md b/docs/Leetcode_Solutions/345._Reverse_Vowels_of_a_String.md similarity index 100% rename from docs/Leetcode Solutions/345._Reverse_Vowels_of_a_String.md rename to docs/Leetcode_Solutions/345._Reverse_Vowels_of_a_String.md diff --git a/docs/Leetcode Solutions/349._intersection_of_two_arrays.md b/docs/Leetcode_Solutions/349._intersection_of_two_arrays.md similarity index 100% rename from docs/Leetcode Solutions/349._intersection_of_two_arrays.md rename to docs/Leetcode_Solutions/349._intersection_of_two_arrays.md diff --git a/docs/Leetcode Solutions/350._intersection_of_two_arrays_ii.md b/docs/Leetcode_Solutions/350._intersection_of_two_arrays_ii.md similarity index 100% rename from docs/Leetcode Solutions/350._intersection_of_two_arrays_ii.md rename to docs/Leetcode_Solutions/350._intersection_of_two_arrays_ii.md diff --git a/docs/Leetcode Solutions/353. Design Snake Game.md b/docs/Leetcode_Solutions/353. Design Snake Game.md similarity index 100% rename from docs/Leetcode Solutions/353. Design Snake Game.md rename to docs/Leetcode_Solutions/353. Design Snake Game.md diff --git a/docs/Leetcode Solutions/364. Nested List Weight Sum II.md b/docs/Leetcode_Solutions/364. Nested List Weight Sum II.md similarity index 100% rename from docs/Leetcode Solutions/364. Nested List Weight Sum II.md rename to docs/Leetcode_Solutions/364. Nested List Weight Sum II.md diff --git a/docs/Leetcode Solutions/366. Find Leaves of Binary Tree.md b/docs/Leetcode_Solutions/366. Find Leaves of Binary Tree.md similarity index 100% rename from docs/Leetcode Solutions/366. Find Leaves of Binary Tree.md rename to docs/Leetcode_Solutions/366. Find Leaves of Binary Tree.md diff --git a/docs/Leetcode Solutions/367._valid_perfect_square.md b/docs/Leetcode_Solutions/367._valid_perfect_square.md similarity index 100% rename from docs/Leetcode Solutions/367._valid_perfect_square.md rename to docs/Leetcode_Solutions/367._valid_perfect_square.md diff --git a/docs/Leetcode Solutions/369.Plus One Linked List.md b/docs/Leetcode_Solutions/369.Plus One Linked List.md similarity index 100% rename from docs/Leetcode Solutions/369.Plus One Linked List.md rename to docs/Leetcode_Solutions/369.Plus One Linked List.md diff --git a/docs/Leetcode Solutions/371._sum_of_two_integers.md b/docs/Leetcode_Solutions/371._sum_of_two_integers.md similarity index 100% rename from docs/Leetcode Solutions/371._sum_of_two_integers.md rename to docs/Leetcode_Solutions/371._sum_of_two_integers.md diff --git a/docs/Leetcode Solutions/374._Guess_Number_Higher_or_Lower.md b/docs/Leetcode_Solutions/374._Guess_Number_Higher_or_Lower.md similarity index 100% rename from docs/Leetcode Solutions/374._Guess_Number_Higher_or_Lower.md rename to docs/Leetcode_Solutions/374._Guess_Number_Higher_or_Lower.md diff --git a/docs/Leetcode Solutions/377._combination_sum_iv.md b/docs/Leetcode_Solutions/377._combination_sum_iv.md similarity index 100% rename from docs/Leetcode Solutions/377._combination_sum_iv.md rename to docs/Leetcode_Solutions/377._combination_sum_iv.md diff --git a/docs/Leetcode Solutions/378._kth_smallest_element_in_a_sorted_matrix.md b/docs/Leetcode_Solutions/378._kth_smallest_element_in_a_sorted_matrix.md similarity index 100% rename from docs/Leetcode Solutions/378._kth_smallest_element_in_a_sorted_matrix.md rename to docs/Leetcode_Solutions/378._kth_smallest_element_in_a_sorted_matrix.md diff --git a/docs/Leetcode Solutions/380. Insert Delete GetRandom O(1).md b/docs/Leetcode_Solutions/380. Insert Delete GetRandom O(1).md similarity index 100% rename from docs/Leetcode Solutions/380. Insert Delete GetRandom O(1).md rename to docs/Leetcode_Solutions/380. Insert Delete GetRandom O(1).md diff --git a/docs/Leetcode Solutions/381. Insert Delete GetRandom O(1) - Duplicates allowed.md b/docs/Leetcode_Solutions/381. Insert Delete GetRandom O(1) - Duplicates allowed.md similarity index 100% rename from docs/Leetcode Solutions/381. Insert Delete GetRandom O(1) - Duplicates allowed.md rename to docs/Leetcode_Solutions/381. Insert Delete GetRandom O(1) - Duplicates allowed.md diff --git a/docs/Leetcode Solutions/382._linked_list_random_node.md b/docs/Leetcode_Solutions/382._linked_list_random_node.md similarity index 100% rename from docs/Leetcode Solutions/382._linked_list_random_node.md rename to docs/Leetcode_Solutions/382._linked_list_random_node.md diff --git a/docs/Leetcode Solutions/383._ransom_note.md b/docs/Leetcode_Solutions/383._ransom_note.md similarity index 100% rename from docs/Leetcode Solutions/383._ransom_note.md rename to docs/Leetcode_Solutions/383._ransom_note.md diff --git a/docs/Leetcode Solutions/384. Shuffle an Array.md b/docs/Leetcode_Solutions/384. Shuffle an Array.md similarity index 100% rename from docs/Leetcode Solutions/384. Shuffle an Array.md rename to docs/Leetcode_Solutions/384. Shuffle an Array.md diff --git a/docs/Leetcode Solutions/387._first_unique_character_in_a_string.md b/docs/Leetcode_Solutions/387._first_unique_character_in_a_string.md similarity index 100% rename from docs/Leetcode Solutions/387._first_unique_character_in_a_string.md rename to docs/Leetcode_Solutions/387._first_unique_character_in_a_string.md diff --git a/docs/Leetcode Solutions/388._Longest_Absolute_File_Path.md b/docs/Leetcode_Solutions/388._Longest_Absolute_File_Path.md similarity index 100% rename from docs/Leetcode Solutions/388._Longest_Absolute_File_Path.md rename to docs/Leetcode_Solutions/388._Longest_Absolute_File_Path.md diff --git a/docs/Leetcode Solutions/389._find_the_difference.md b/docs/Leetcode_Solutions/389._find_the_difference.md similarity index 100% rename from docs/Leetcode Solutions/389._find_the_difference.md rename to docs/Leetcode_Solutions/389._find_the_difference.md diff --git a/docs/Leetcode Solutions/392._is_subsequence.md b/docs/Leetcode_Solutions/392._is_subsequence.md similarity index 100% rename from docs/Leetcode Solutions/392._is_subsequence.md rename to docs/Leetcode_Solutions/392._is_subsequence.md diff --git a/docs/Leetcode Solutions/394._decode_string.md b/docs/Leetcode_Solutions/394._decode_string.md similarity index 100% rename from docs/Leetcode Solutions/394._decode_string.md rename to docs/Leetcode_Solutions/394._decode_string.md diff --git a/docs/Leetcode Solutions/400. Nth Digit.md b/docs/Leetcode_Solutions/400. Nth Digit.md similarity index 100% rename from docs/Leetcode Solutions/400. Nth Digit.md rename to docs/Leetcode_Solutions/400. Nth Digit.md diff --git a/docs/Leetcode Solutions/401._binary_watch.md b/docs/Leetcode_Solutions/401._binary_watch.md similarity index 100% rename from docs/Leetcode Solutions/401._binary_watch.md rename to docs/Leetcode_Solutions/401._binary_watch.md diff --git a/docs/Leetcode Solutions/404._sum_of_left_leaves.md b/docs/Leetcode_Solutions/404._sum_of_left_leaves.md similarity index 100% rename from docs/Leetcode Solutions/404._sum_of_left_leaves.md rename to docs/Leetcode_Solutions/404._sum_of_left_leaves.md diff --git a/docs/Leetcode Solutions/405. Convert a Number to Hexadecimal.md b/docs/Leetcode_Solutions/405. Convert a Number to Hexadecimal.md similarity index 100% rename from docs/Leetcode Solutions/405. Convert a Number to Hexadecimal.md rename to docs/Leetcode_Solutions/405. Convert a Number to Hexadecimal.md diff --git a/docs/Leetcode Solutions/406._Queue_Reconstruction_by_Height.md b/docs/Leetcode_Solutions/406._Queue_Reconstruction_by_Height.md similarity index 100% rename from docs/Leetcode Solutions/406._Queue_Reconstruction_by_Height.md rename to docs/Leetcode_Solutions/406._Queue_Reconstruction_by_Height.md diff --git a/docs/Leetcode Solutions/412._fizz_buzz.md b/docs/Leetcode_Solutions/412._fizz_buzz.md similarity index 100% rename from docs/Leetcode Solutions/412._fizz_buzz.md rename to docs/Leetcode_Solutions/412._fizz_buzz.md diff --git a/docs/Leetcode Solutions/413. Arithmetic Slices.md b/docs/Leetcode_Solutions/413. Arithmetic Slices.md similarity index 100% rename from docs/Leetcode Solutions/413. Arithmetic Slices.md rename to docs/Leetcode_Solutions/413. Arithmetic Slices.md diff --git a/docs/Leetcode Solutions/414._third_maximum_number.md b/docs/Leetcode_Solutions/414._third_maximum_number.md similarity index 100% rename from docs/Leetcode Solutions/414._third_maximum_number.md rename to docs/Leetcode_Solutions/414._third_maximum_number.md diff --git a/docs/Leetcode Solutions/415._add_strings.md b/docs/Leetcode_Solutions/415._add_strings.md similarity index 100% rename from docs/Leetcode Solutions/415._add_strings.md rename to docs/Leetcode_Solutions/415._add_strings.md diff --git a/docs/Leetcode Solutions/416. Partition Equal Subset Sum.md b/docs/Leetcode_Solutions/416. Partition Equal Subset Sum.md similarity index 100% rename from docs/Leetcode Solutions/416. Partition Equal Subset Sum.md rename to docs/Leetcode_Solutions/416. Partition Equal Subset Sum.md diff --git a/docs/Leetcode Solutions/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md b/docs/Leetcode_Solutions/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md similarity index 100% rename from docs/Leetcode Solutions/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md rename to docs/Leetcode_Solutions/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md diff --git a/docs/Leetcode Solutions/422. Valid Word Square.md b/docs/Leetcode_Solutions/422. Valid Word Square.md similarity index 100% rename from docs/Leetcode Solutions/422. Valid Word Square.md rename to docs/Leetcode_Solutions/422. Valid Word Square.md diff --git a/docs/Leetcode Solutions/434._number_of_segments_in_a_string.md b/docs/Leetcode_Solutions/434._number_of_segments_in_a_string.md similarity index 100% rename from docs/Leetcode Solutions/434._number_of_segments_in_a_string.md rename to docs/Leetcode_Solutions/434._number_of_segments_in_a_string.md diff --git a/docs/Leetcode Solutions/437._path_sum_iii.md b/docs/Leetcode_Solutions/437._path_sum_iii.md similarity index 100% rename from docs/Leetcode Solutions/437._path_sum_iii.md rename to docs/Leetcode_Solutions/437._path_sum_iii.md diff --git a/docs/Leetcode Solutions/438._Find_All_Anagrams_in_a_String.md b/docs/Leetcode_Solutions/438._Find_All_Anagrams_in_a_String.md similarity index 100% rename from docs/Leetcode Solutions/438._Find_All_Anagrams_in_a_String.md rename to docs/Leetcode_Solutions/438._Find_All_Anagrams_in_a_String.md diff --git a/docs/Leetcode Solutions/439. Ternary Expression Parser.md b/docs/Leetcode_Solutions/439. Ternary Expression Parser.md similarity index 100% rename from docs/Leetcode Solutions/439. Ternary Expression Parser.md rename to docs/Leetcode_Solutions/439. Ternary Expression Parser.md diff --git a/docs/Leetcode Solutions/441._arranging_coins.md b/docs/Leetcode_Solutions/441._arranging_coins.md similarity index 100% rename from docs/Leetcode Solutions/441._arranging_coins.md rename to docs/Leetcode_Solutions/441._arranging_coins.md diff --git a/docs/Leetcode Solutions/448._Find_All_Numbers_Disappeared_in_an_Array.md b/docs/Leetcode_Solutions/448._Find_All_Numbers_Disappeared_in_an_Array.md similarity index 100% rename from docs/Leetcode Solutions/448._Find_All_Numbers_Disappeared_in_an_Array.md rename to docs/Leetcode_Solutions/448._Find_All_Numbers_Disappeared_in_an_Array.md diff --git a/docs/Leetcode Solutions/450. Delete Node in a BST.md b/docs/Leetcode_Solutions/450. Delete Node in a BST.md similarity index 100% rename from docs/Leetcode Solutions/450. Delete Node in a BST.md rename to docs/Leetcode_Solutions/450. Delete Node in a BST.md diff --git a/docs/Leetcode Solutions/453._Minimum_Moves_to_Equal_Array_Elements.md b/docs/Leetcode_Solutions/453._Minimum_Moves_to_Equal_Array_Elements.md similarity index 100% rename from docs/Leetcode Solutions/453._Minimum_Moves_to_Equal_Array_Elements.md rename to docs/Leetcode_Solutions/453._Minimum_Moves_to_Equal_Array_Elements.md diff --git a/docs/Leetcode Solutions/459._Repeated_Substring_Pattern.md b/docs/Leetcode_Solutions/459._Repeated_Substring_Pattern.md similarity index 100% rename from docs/Leetcode Solutions/459._Repeated_Substring_Pattern.md rename to docs/Leetcode_Solutions/459._Repeated_Substring_Pattern.md diff --git a/docs/Leetcode Solutions/461._Hamming Distance.md b/docs/Leetcode_Solutions/461._Hamming Distance.md similarity index 100% rename from docs/Leetcode Solutions/461._Hamming Distance.md rename to docs/Leetcode_Solutions/461._Hamming Distance.md diff --git a/docs/Leetcode Solutions/463._Island_Perimeter.md b/docs/Leetcode_Solutions/463._Island_Perimeter.md similarity index 100% rename from docs/Leetcode Solutions/463._Island_Perimeter.md rename to docs/Leetcode_Solutions/463._Island_Perimeter.md diff --git a/docs/Leetcode Solutions/467._Unique_Substrings_in_Wraparound_String.md b/docs/Leetcode_Solutions/467._Unique_Substrings_in_Wraparound_String.md similarity index 100% rename from docs/Leetcode Solutions/467._Unique_Substrings_in_Wraparound_String.md rename to docs/Leetcode_Solutions/467._Unique_Substrings_in_Wraparound_String.md diff --git a/docs/Leetcode Solutions/469. Convex Polygon.md b/docs/Leetcode_Solutions/469. Convex Polygon.md similarity index 100% rename from docs/Leetcode Solutions/469. Convex Polygon.md rename to docs/Leetcode_Solutions/469. Convex Polygon.md diff --git a/docs/Leetcode Solutions/476._Number_Complement.md b/docs/Leetcode_Solutions/476._Number_Complement.md similarity index 100% rename from docs/Leetcode Solutions/476._Number_Complement.md rename to docs/Leetcode_Solutions/476._Number_Complement.md diff --git a/docs/Leetcode Solutions/477._Total_Hamming_Distance.md b/docs/Leetcode_Solutions/477._Total_Hamming_Distance.md similarity index 100% rename from docs/Leetcode Solutions/477._Total_Hamming_Distance.md rename to docs/Leetcode_Solutions/477._Total_Hamming_Distance.md diff --git a/docs/Leetcode Solutions/485._Max_Consecutive_Ones.md b/docs/Leetcode_Solutions/485._Max_Consecutive_Ones.md similarity index 100% rename from docs/Leetcode Solutions/485._Max_Consecutive_Ones.md rename to docs/Leetcode_Solutions/485._Max_Consecutive_Ones.md diff --git a/docs/Leetcode Solutions/587._Erect_the_Fence .md b/docs/Leetcode_Solutions/587._Erect_the_Fence .md similarity index 100% rename from docs/Leetcode Solutions/587._Erect_the_Fence .md rename to docs/Leetcode_Solutions/587._Erect_the_Fence .md diff --git a/docs/Leetcode Solutions/599._Minimum_Index_Sum_of_Two_Lists.md b/docs/Leetcode_Solutions/599._Minimum_Index_Sum_of_Two_Lists.md similarity index 100% rename from docs/Leetcode Solutions/599._Minimum_Index_Sum_of_Two_Lists.md rename to docs/Leetcode_Solutions/599._Minimum_Index_Sum_of_Two_Lists.md diff --git a/docs/Leetcode Solutions/647._Palindromic_Substrings.md b/docs/Leetcode_Solutions/647._Palindromic_Substrings.md similarity index 100% rename from docs/Leetcode Solutions/647._Palindromic_Substrings.md rename to docs/Leetcode_Solutions/647._Palindromic_Substrings.md diff --git a/docs/Leetcode Solutions/657._Judge_Route_Circle.md b/docs/Leetcode_Solutions/657._Judge_Route_Circle.md similarity index 100% rename from docs/Leetcode Solutions/657._Judge_Route_Circle.md rename to docs/Leetcode_Solutions/657._Judge_Route_Circle.md diff --git a/docs/Leetcode Solutions/665._Non-decreasing_Array.md b/docs/Leetcode_Solutions/665._Non-decreasing_Array.md similarity index 100% rename from docs/Leetcode Solutions/665._Non-decreasing_Array.md rename to docs/Leetcode_Solutions/665._Non-decreasing_Array.md diff --git a/docs/Leetcode Solutions/672._Bulb_Switcher_II.md b/docs/Leetcode_Solutions/672._Bulb_Switcher_II.md similarity index 100% rename from docs/Leetcode Solutions/672._Bulb_Switcher_II.md rename to docs/Leetcode_Solutions/672._Bulb_Switcher_II.md diff --git a/docs/Leetcode Solutions/681._Next_Closest_Time.md b/docs/Leetcode_Solutions/681._Next_Closest_Time.md similarity index 100% rename from docs/Leetcode Solutions/681._Next_Closest_Time.md rename to docs/Leetcode_Solutions/681._Next_Closest_Time.md diff --git a/docs/Leetcode Solutions/682._Baseball_Game.md b/docs/Leetcode_Solutions/682._Baseball_Game.md similarity index 100% rename from docs/Leetcode Solutions/682._Baseball_Game.md rename to docs/Leetcode_Solutions/682._Baseball_Game.md diff --git a/docs/Leetcode Solutions/687._Longest_Univalue_Path.md b/docs/Leetcode_Solutions/687._Longest_Univalue_Path.md similarity index 100% rename from docs/Leetcode Solutions/687._Longest_Univalue_Path.md rename to docs/Leetcode_Solutions/687._Longest_Univalue_Path.md diff --git a/docs/Leetcode Solutions/740._delete_and_earn.md b/docs/Leetcode_Solutions/740._delete_and_earn.md similarity index 100% rename from docs/Leetcode Solutions/740._delete_and_earn.md rename to docs/Leetcode_Solutions/740._delete_and_earn.md diff --git a/docs/Leetcode Solutions/760._Find_Anagram_Mappings.md b/docs/Leetcode_Solutions/760._Find_Anagram_Mappings.md similarity index 100% rename from docs/Leetcode Solutions/760._Find_Anagram_Mappings.md rename to docs/Leetcode_Solutions/760._Find_Anagram_Mappings.md diff --git a/docs/Leetcode Solutions/README.md b/docs/Leetcode_Solutions/README.md similarity index 100% rename from docs/Leetcode Solutions/README.md rename to docs/Leetcode_Solutions/README.md diff --git "a/docs/Leetcode Solutions/Summarization/Binary Search \344\270\215\346\230\223\345\206\231.md" "b/docs/Leetcode_Solutions/Summarization/Binary Search \344\270\215\346\230\223\345\206\231.md" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/Binary Search \344\270\215\346\230\223\345\206\231.md" rename to "docs/Leetcode_Solutions/Summarization/Binary Search \344\270\215\346\230\223\345\206\231.md" diff --git a/docs/Leetcode Solutions/Summarization/Data Structure and Algorthim Review.md b/docs/Leetcode_Solutions/Summarization/Data Structure and Algorthim Review.md similarity index 100% rename from docs/Leetcode Solutions/Summarization/Data Structure and Algorthim Review.md rename to docs/Leetcode_Solutions/Summarization/Data Structure and Algorthim Review.md diff --git a/docs/Leetcode Solutions/Summarization/Dynamic Programming.md b/docs/Leetcode_Solutions/Summarization/Dynamic Programming.md similarity index 100% rename from docs/Leetcode Solutions/Summarization/Dynamic Programming.md rename to docs/Leetcode_Solutions/Summarization/Dynamic Programming.md diff --git "a/docs/Leetcode Solutions/Summarization/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" "b/docs/Leetcode_Solutions/Summarization/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" rename to "docs/Leetcode_Solutions/Summarization/Introduction to String Searching Algorithms \342\200\223 topcoder.pdf" diff --git "a/docs/Leetcode Solutions/Summarization/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" "b/docs/Leetcode_Solutions/Summarization/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" rename to "docs/Leetcode_Solutions/Summarization/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" diff --git "a/docs/Leetcode Solutions/Summarization/LinkedList\346\212\200\345\267\247.md" "b/docs/Leetcode_Solutions/Summarization/LinkedList\346\212\200\345\267\247.md" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/LinkedList\346\212\200\345\267\247.md" rename to "docs/Leetcode_Solutions/Summarization/LinkedList\346\212\200\345\267\247.md" diff --git a/docs/Leetcode Solutions/Summarization/Maximal Square.pdf b/docs/Leetcode_Solutions/Summarization/Maximal Square.pdf similarity index 100% rename from docs/Leetcode Solutions/Summarization/Maximal Square.pdf rename to docs/Leetcode_Solutions/Summarization/Maximal Square.pdf diff --git "a/docs/Leetcode Solutions/Summarization/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" "b/docs/Leetcode_Solutions/Summarization/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" rename to "docs/Leetcode_Solutions/Summarization/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" diff --git a/docs/Leetcode Solutions/Summarization/Range Sum Query 2D - Immutable.pdf b/docs/Leetcode_Solutions/Summarization/Range Sum Query 2D - Immutable.pdf similarity index 100% rename from docs/Leetcode Solutions/Summarization/Range Sum Query 2D - Immutable.pdf rename to docs/Leetcode_Solutions/Summarization/Range Sum Query 2D - Immutable.pdf diff --git a/docs/Leetcode Solutions/Summarization/Recusrion & BackTracking.md b/docs/Leetcode_Solutions/Summarization/Recusrion & BackTracking.md similarity index 100% rename from docs/Leetcode Solutions/Summarization/Recusrion & BackTracking.md rename to docs/Leetcode_Solutions/Summarization/Recusrion & BackTracking.md diff --git "a/docs/Leetcode Solutions/Summarization/backtracking\346\200\235\350\267\257.md" "b/docs/Leetcode_Solutions/Summarization/backtracking\346\200\235\350\267\257.md" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/backtracking\346\200\235\350\267\257.md" rename to "docs/Leetcode_Solutions/Summarization/backtracking\346\200\235\350\267\257.md" diff --git "a/docs/Leetcode Solutions/Summarization/delete_node_in_a_linked_list\351\227\256\351\242\230.md" "b/docs/Leetcode_Solutions/Summarization/delete_node_in_a_linked_list\351\227\256\351\242\230.md" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/delete_node_in_a_linked_list\351\227\256\351\242\230.md" rename to "docs/Leetcode_Solutions/Summarization/delete_node_in_a_linked_list\351\227\256\351\242\230.md" diff --git "a/docs/Leetcode Solutions/Summarization/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" "b/docs/Leetcode_Solutions/Summarization/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" rename to "docs/Leetcode_Solutions/Summarization/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" diff --git "a/docs/Leetcode Solutions/Summarization/python\347\232\204\345\220\204\347\247\215pass.md" "b/docs/Leetcode_Solutions/Summarization/python\347\232\204\345\220\204\347\247\215pass.md" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/python\347\232\204\345\220\204\347\247\215pass.md" rename to "docs/Leetcode_Solutions/Summarization/python\347\232\204\345\220\204\347\247\215pass.md" diff --git a/docs/Leetcode Solutions/Summarization/slide_windows_template.md b/docs/Leetcode_Solutions/Summarization/slide_windows_template.md similarity index 100% rename from docs/Leetcode Solutions/Summarization/slide_windows_template.md rename to docs/Leetcode_Solutions/Summarization/slide_windows_template.md diff --git "a/docs/Leetcode Solutions/Summarization/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" "b/docs/Leetcode_Solutions/Summarization/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" rename to "docs/Leetcode_Solutions/Summarization/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" diff --git "a/docs/Leetcode Solutions/Summarization/\344\275\215\350\277\220\347\256\227.md" "b/docs/Leetcode_Solutions/Summarization/\344\275\215\350\277\220\347\256\227.md" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/\344\275\215\350\277\220\347\256\227.md" rename to "docs/Leetcode_Solutions/Summarization/\344\275\215\350\277\220\347\256\227.md" diff --git "a/docs/Leetcode Solutions/Summarization/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" "b/docs/Leetcode_Solutions/Summarization/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" rename to "docs/Leetcode_Solutions/Summarization/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" diff --git "a/docs/Leetcode Solutions/Summarization/\345\205\253\346\216\222\345\272\217.md" "b/docs/Leetcode_Solutions/Summarization/\345\205\253\346\216\222\345\272\217.md" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/\345\205\253\346\216\222\345\272\217.md" rename to "docs/Leetcode_Solutions/Summarization/\345\205\253\346\216\222\345\272\217.md" diff --git "a/docs/Leetcode Solutions/Summarization/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" "b/docs/Leetcode_Solutions/Summarization/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" rename to "docs/Leetcode_Solutions/Summarization/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" diff --git "a/docs/Leetcode Solutions/Summarization/\346\200\273\347\273\223.md" "b/docs/Leetcode_Solutions/Summarization/\346\200\273\347\273\223.md" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/\346\200\273\347\273\223.md" rename to "docs/Leetcode_Solutions/Summarization/\346\200\273\347\273\223.md" diff --git "a/docs/Leetcode Solutions/Summarization/\347\273\204\345\220\210\351\227\256\351\242\230.md" "b/docs/Leetcode_Solutions/Summarization/\347\273\204\345\220\210\351\227\256\351\242\230.md" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/\347\273\204\345\220\210\351\227\256\351\242\230.md" rename to "docs/Leetcode_Solutions/Summarization/\347\273\204\345\220\210\351\227\256\351\242\230.md" diff --git "a/docs/Leetcode Solutions/Summarization/\351\200\222\345\275\222_recursion.md" "b/docs/Leetcode_Solutions/Summarization/\351\200\222\345\275\222_recursion.md" similarity index 100% rename from "docs/Leetcode Solutions/Summarization/\351\200\222\345\275\222_recursion.md" rename to "docs/Leetcode_Solutions/Summarization/\351\200\222\345\275\222_recursion.md" From 2aa2eb053b4eb94a7643a5ad2a4bc694a0a11a4b Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:50:10 -0500 Subject: [PATCH 461/473] Update README.md --- README.md | 281 +----------------------------------------------------- 1 file changed, 5 insertions(+), 276 deletions(-) diff --git a/README.md b/README.md index 2e0d34398..07e3c4483 100644 --- a/README.md +++ b/README.md @@ -1,287 +1,16 @@ # Algorithms +## 1. [LeetCode 题解和总结](/docs/Leetcode_Solutions/) +## 2. [面试问答]() -## 面试问答 - -* [Google面试题](/docs/interview/Google/Google.md) +* [Google 面试题](/docs/interview/Google/Google.md) * [pocketgems 面试题](/docs/interview/pocketgems/pocketgems.md) * [WePay 面试题](/docs/interview/WePay/WePay.md) +* [拍拍贷面试题](/docs/interview/拍拍贷/paipaidai.md) -## LeetCode Solutions and Summarizations +## 3. [算法模版](/docs/Algorithm_Templates) -* [](docs/某类别/001._two_sum.md) -* [](/docs/某类别/002._add_two_numbers.md) -* [](/docs/某类别/003._longest_substring_without_repeating_characters.md) -* [](/docs/某类别/004._median_of_two_sorted_arrays.md) -* [](/docs/某类别/005._longest_palindromic_substring.md) -* [](/docs/某类别/007._Reverse_Integer.md) -* [](/docs/某类别/008._string_to_integer_(atoi).md) -* [](/docs/某类别/010._regular_expression_matching.md) -* [](/docs/某类别/011._container_with_most_water.md) -* [](/docs/某类别/012._Integer_to_Roman.md) -* [](/docs/某类别/013._Roman_to_Integer.md) -* [](/docs/某类别/014._longest_common_prefix.md) -* [](/docs/某类别/015._3sum.md) -* [](/docs/某类别/016._3sum_closest.md) -* [](/docs/某类别/017._letter_combinations_of_a_phone_number.md) -* [](/docs/某类别/018._4sum.md) -* [](/docs/某类别/019._remove_nth_node_from_end_of_list.md) -* [](/docs/某类别/020._valid_parentheses.md) -* [](/docs/某类别/021._merge_two_sorted_lists.md) -* [](/docs/某类别/022._generate_parentheses.md) -* [](/docs/某类别/023._merge_k_sorted_lists.md) -* [](/docs/某类别/024._swap_nodes_in_pairs.md) -* [](/docs/某类别/026._Remove_Duplicates_from_Sorted_Array.md) -* [](/docs/某类别/027._Remove_Element.md) -* [](/docs/某类别/028._implement_strstr().md) -* [](/docs/某类别/030._Substring_with_Concatenation_of_All_Words.md) -* [](/docs/某类别/031._next_permutation.md) -* [](/docs/某类别/033._search_in_rotated_sorted_array.md) -* [](/docs/某类别/034._SearchforaRange.md) -* [](/docs/某类别/035._search_insert_position.md) -* [](/docs/某类别/038._Count_and_Say.md) -* [](/docs/某类别/039._combination_sum.md) -* [](/docs/某类别/040._combination_sum_ii.md) -* [](/docs/某类别/042._trapping_rain_water.md) -* [](/docs/某类别/043._multiply_strings.md) -* [](/docs/某类别/044._wildcard_matching.md) -* [](/docs/某类别/045._Jump_Game_II.md) -* [](/docs/某类别/046._permutations.md) -* [](/docs/某类别/047._permutations_ii.md) -* [](/docs/某类别/048._rotate_image.md) -* [](/docs/某类别/049._group_anagrams_python.md) -* [](/docs/某类别/050._pow(x,_n).md) -* [](/docs/某类别/051._n-queens.md) -* [](/docs/某类别/052._n-queens_ii.md) -* [](/docs/某类别/053._maximum_subarray.md) -* [](/docs/某类别/054._spiral_matrix.md) -* [](/docs/某类别/055._jump_game.md) -* [](/docs/某类别/056._Merge_Intervals.md) -* [](/docs/某类别/058._length_of_last_word.md) -* [](/docs/某类别/059._spiral_matrix_ii.md) -* [](/docs/某类别/060._permutation_sequence.md) -* [](/docs/某类别/061._rotate_list.md) -* [](/docs/某类别/064._minimum_path_sum.md) -* [](/docs/某类别/065.unique_paths_ii.md) -* [](/docs/某类别/066._plus_one.md) -* [](/docs/某类别/067._add_binary.md) -* [](/docs/某类别/069._sqrt(x).md) -* [](/docs/某类别/070.ClimbingStairs.md) -* [](/docs/某类别/072._edit_distance.md) -* [](/docs/某类别/073.SetMatrixZeroes.md) -* [](/docs/某类别/074._search_a_2d_matrix.md) -* [](/docs/某类别/075._sort_colors.md) -* [](/docs/某类别/076._Minimum_Window_Substring.md) -* [](/docs/某类别/077._combinations.md) -* [](/docs/某类别/078.Subsets.md) -* [](/docs/某类别/079._word_search.md) -* [](/docs/某类别/082._remove_duplicates_from_sorted_list_ii.md) -* [](/docs/某类别/083._remove_duplicates_from_sorted_list.md) -* [](/docs/某类别/086._partition_list.md) -* [](/docs/某类别/088._merge_sorted_array.md) -* [](/docs/某类别/089._gray_code.md) -* [](/docs/某类别/090._subsets_ii.md) -* [](/docs/某类别/091._decode_ways.md) -* [](/docs/某类别/092._reverse_linked_list_ii.md) -* [](/docs/某类别/093._restore_ip_addresses.md) -* [](/docs/某类别/094._binary_tree_inorder_traversal.md) -* [](/docs/某类别/096._unique_binary_search_trees.md) -* [](/docs/某类别/098._validate_binary_search_tree.md) -* [](/docs/某类别/100._same_tree.md) -* [](/docs/某类别/101._symmetric_tree.md) -* [](/docs/某类别/102._binary_tree_level_order_traversal.md) -* [](/docs/某类别/103._binary_tree_zigzag_level_order_traversal.md) -* [](/docs/某类别/104._maximum_depth_of_binary_tree.md) -* [](/docs/某类别/105._construct_binary_tree_from_preorder_and_inorder_traversal.md) -* [](/docs/某类别/106._construct_binary_tree_from_inorder_and_postorder_traversal.md) -* [](/docs/某类别/107._binary_tree_level_order_traversal_ii.md) -* [](/docs/某类别/108._convert_sorted_array_to_binary_search_tree.md) -* [](/docs/某类别/109._convert_sorted_list_to_binary_search_tree.md) -* [](/docs/某类别/110._balanced_binary_tree.md) -* [](/docs/某类别/111._minimum_depth_of_binary_tree.md) -* [](/docs/某类别/112._path_sum.md) -* [](/docs/某类别/113._path_sum_ii.md) -* [](/docs/某类别/114._flatten_binary_tree_to_linked_list.md) -* [](/docs/某类别/116._populating_next_right_pointers_in_each_node.md) -* [](/docs/某类别/118._pascal's_triangle.md) -* [](/docs/某类别/119.Pascal'sTriangleII.md) -* [](/docs/某类别/120.Triangle.md) -* [](/docs/某类别/121._Best_Time_to_Buy_and_Sell_Stock.md) -* [](/docs/某类别/125._valid_palindrome.md) -* [](/docs/某类别/126.WordLadderII.md) -* [](/docs/某类别/127._word_ladder.md) -* [](/docs/某类别/128._Longest_Consecutive_Sequence.md) -* [](/docs/某类别/129._sum_root_to_leaf_numbers.md) -* [](/docs/某类别/130._surrounded_regions.md) -* [](/docs/某类别/131._palindrome_partitioning.md) -* [](/docs/某类别/133._clone_graph.md) -* [](/docs/某类别/136._single_number.md) -* [](/docs/某类别/139._word_break.md) -* [](/docs/某类别/140._word_break_ii.md) -* [](/docs/某类别/141._linked_list_cycle.md) -* [](/docs/某类别/142_Linked_List_Cycle_II.md) -* [](/docs/某类别/143._reorder_list.md) -* [](/docs/某类别/144._binary_tree_preorder_traversal.md) -* [](/docs/某类别/145._binary_tree_postorder_traversal.md) -* [](/docs/某类别/147._insertion_sort_list.md) -* [](/docs/某类别/148._sort_list.md) -* [](/docs/某类别/150._evaluate_reverse_polish_notation.md) -* [](/docs/某类别/151._reverse_words_in_a_string.md) -* [](/docs/某类别/152._maximum_product_subarray.md) -* [](/docs/某类别/153._find_minimum_in_rotated_sorted_array.md) -* [](/docs/某类别/155._min_stack.md) -* [](/docs/某类别/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md) -* [](/docs/某类别/160._intersection_of_two_linked_lists.md) -* [](/docs/某类别/162._find_peak_element.md) -* [](/docs/某类别/165._compare_version_numbers.md) -* [](/docs/某类别/166._Fraction_to_Recurring_Decimal.md) -* [](/docs/某类别/167._two_sum_ii_-_input_array_is_sorted.md) -* [](/docs/某类别/168._excel_sheet_column_title.md) -* [](/docs/某类别/169._majority_element.md) -* [](/docs/某类别/171._excel_sheet_column_number.md) -* [](/docs/某类别/173._binary_search_tree_iterator.md) -* [](/docs/某类别/189._rotate_array.md) -* [](/docs/某类别/191._number_of_1_bits.md) -* [](/docs/某类别/198._house_robber.md) -* [](/docs/某类别/199._binary_tree_right_side_view.md) -* [](/docs/某类别/200._number_of_islands.md) -* [](/docs/某类别/203._remove_linked_list_elements.md) -* [](/docs/某类别/204._count_primes.md) -* [](/docs/某类别/205._isomorphic_strings.md) -* [](/docs/某类别/206._reverse_linked_list.md) -* [](/docs/某类别/207._course_schedule.md) -* [](/docs/某类别/208._implement_trie_(prefix_tree).md) -* [](/docs/某类别/210._course_schedule_ii.md) -* [](/docs/某类别/211.AddandSearchWord-Datastructuredesign.md) -* [](/docs/某类别/213._house_robber_ii.md) -* [](/docs/某类别/216._combination_sum_iii.md) -* [](/docs/某类别/217._contains_duplicate.md) -* [](/docs/某类别/218._The_Skyline_Problem.md) -* [](/docs/某类别/219._contains_duplicate_ii.md) -* [](/docs/某类别/221._maximal_square.md) -* [](/docs/某类别/222._count_complete_tree_nodes.md) -* [](/docs/某类别/223._rectangle_area.md) -* [](/docs/某类别/224.BasicCalculator.md) -* [](/docs/某类别/225._implement_stack_using_queues.md) -* [](/docs/某类别/226._invert_binary_tree.md) -* [](/docs/某类别/227._basic_calculator_ii.md) -* [](/docs/某类别/228._summary_ranges.md) -* [](/docs/某类别/229._majority_element_ii.md) -* [](/docs/某类别/230._kth_smallest_element_in_a_bst.md) -* [](/docs/某类别/231._Power_of_Two.md) -* [](/docs/某类别/232._implement_queue_using_stacks.md) -* [](/docs/某类别/234._palindrome_linked_list.md) -* [](/docs/某类别/235._lowest_common_ancestor_of_a_binary_search_tree.md) -* [](/docs/某类别/236._lowest_common_ancestor_of_a_binary_tree.md) -* [](/docs/某类别/237._delete_node_in_a_linked_list.md) -* [](/docs/某类别/238._product_of_array_except_self.md) -* [](/docs/某类别/240._search_a_2d_matrix_ii.md) -* [](/docs/某类别/242._valid_anagram.md) -* [](/docs/某类别/252.MeetingRooms.md) -* [](/docs/某类别/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md) -* [](/docs/某类别/256.PaintHouse.md) -* [](/docs/某类别/257._binary_tree_paths.md) -* [](/docs/某类别/258_Add_Digits.md) -* [](/docs/某类别/261.GraphValidTree.md) -* [](/docs/某类别/263._ugly_number.md) -* [](/docs/某类别/264._ugly_number_ii.md) -* [](/docs/某类别/265.PaintHouseII.md) -* [](/docs/某类别/266.PalindromePermutation.md) -* [](/docs/某类别/267.PalindromePermutationII.md) -* [](/docs/某类别/268._missing_number.md) -* [](/docs/某类别/270.ClosestBinarySearchTreeValue.md) -* [](/docs/某类别/276.PaintFence.md) -* [](/docs/某类别/277.FindtheCelebrity.md) -* [](/docs/某类别/278._First_Bad_Version.md) -* [](/docs/某类别/279._perfect_squares.md) -* [](/docs/某类别/280._Wiggle_Sort.md) -* [](/docs/某类别/283._move_zeroes.md) -* [](/docs/某类别/285._inorder_successor_in_bst.md) -* [](/docs/某类别/286.WallsandGates.md) -* [](/docs/某类别/289._game_of_life.md) -* [](/docs/某类别/290._word_pattern.md) -* [](/docs/某类别/292._nim_game.md) -* [](/docs/某类别/296.BestMeetingPoint.md) -* [](/docs/某类别/298.BinaryTreeLongestConsecutiveSequence.md) -* [](/docs/某类别/299._bulls_and_cows.md) -* [](/docs/某类别/300._longest_increasing_subsequence.md) -* [](/docs/某类别/303._range_sum_query_-_immutable.md) -* [](/docs/某类别/316._Remove_Duplicate_Letters.md) -* [](/docs/某类别/319._Bulb_Switcher.md) -* [](/docs/某类别/322.CoinChange.md) -* [](/docs/某类别/323.NumberofConnectedComponentsinanUndirectedGraph.md) -* [](/docs/某类别/324._Wiggle_Sort_II.md) -* [](/docs/某类别/326._power_of_three.md) -* [](/docs/某类别/328._odd_even_linked_list.md) -* [](/docs/某类别/334._increasing_triplet_subsequence.md) -* [](/docs/某类别/337._house_robber_iii.md) -* [](/docs/某类别/338.CountingBits.md) -* [](/docs/某类别/339.NestedListWeightSum.md) -* [](/docs/某类别/341._Flatten_Nested_List_Iterator.md) -* [](/docs/某类别/342._Power_of_Four.md) -* [](/docs/某类别/344._reverse_string.md) -* [](/docs/某类别/345._Reverse_Vowels_of_a_String.md) -* [](/docs/某类别/349._intersection_of_two_arrays.md) -* [](/docs/某类别/350._intersection_of_two_arrays_ii.md) -* [](/docs/某类别/353.DesignSnakeGame.md) -* [](/docs/某类别/364.NestedListWeightSumII.md) -* [](/docs/某类别/366.FindLeavesofBinaryTree.md) -* [](/docs/某类别/367._valid_perfect_square.md) -* [](/docs/某类别/369.PlusOneLinkedList.md) -* [](/docs/某类别/371._sum_of_two_integers.md) -* [](/docs/某类别/374._Guess_Number_Higher_or_Lower.md) -* [](/docs/某类别/377._combination_sum_iv.md) -* [](/docs/某类别/378._kth_smallest_element_in_a_sorted_matrix.md) -* [](/docs/某类别/380.InsertDeleteGetRandomO(1).md) -* [](/docs/某类别/381.InsertDeleteGetRandomO(1)-Duplicatesallowed.md) -* [](/docs/某类别/382._linked_list_random_node.md) -* [](/docs/某类别/383._ransom_note.md) -* [](/docs/某类别/384.ShuffleanArray.md) -* [](/docs/某类别/387._first_unique_character_in_a_string.md) -* [](/docs/某类别/388._Longest_Absolute_File_Path.md) -* [](/docs/某类别/389._find_the_difference.md) -* [](/docs/某类别/392._is_subsequence.md) -* [](/docs/某类别/394._decode_string.md) -* [](/docs/某类别/400.NthDigit.md) -* [](/docs/某类别/401._binary_watch.md) -* [](/docs/某类别/404._sum_of_left_leaves.md) -* [](/docs/某类别/405.ConvertaNumbertoHexadecimal.md) -* [](/docs/某类别/406._Queue_Reconstruction_by_Height.md) -* [](/docs/某类别/412._fizz_buzz.md) -* [](/docs/某类别/413.ArithmeticSlices.md) -* [](/docs/某类别/414._third_maximum_number.md) -* [](/docs/某类别/415._add_strings.md) -* [](/docs/某类别/416.PartitionEqualSubsetSum.md) -* [](/docs/某类别/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md) -* [](/docs/某类别/422.ValidWordSquare.md) -* [](/docs/某类别/434._number_of_segments_in_a_string.md) -* [](/docs/某类别/437._path_sum_iii.md) -* [](/docs/某类别/438._Find_All_Anagrams_in_a_String.md) -* [](/docs/某类别/439.TernaryExpressionParser.md) -* [](/docs/某类别/441._arranging_coins.md) -* [](/docs/某类别/448._Find_All_Numbers_Disappeared_in_an_Array.md) -* [](/docs/某类别/450.DeleteNodeinaBST.md) -* [](/docs/某类别/453._Minimum_Moves_to_Equal_Array_Elements.md) -* [](/docs/某类别/459._Repeated_Substring_Pattern.md) -* [](/docs/某类别/461._HammingDistance.md) -* [](/docs/某类别/463._Island_Perimeter.md) -* [](/docs/某类别/467._Unique_Substrings_in_Wraparound_String.md) -* [](/docs/某类别/469.ConvexPolygon.md) -* [](/docs/某类别/476._Number_Complement.md) -* [](/docs/某类别/477._Total_Hamming_Distance.md) -* [](/docs/某类别/485._Max_Consecutive_Ones.md) -* [](/docs/某类别/587._Erect_the_Fence.md) -* [](/docs/某类别/599._Minimum_Index_Sum_of_Two_Lists.md) -* [](/docs/某类别/647._Palindromic_Substrings.md) -* [](/docs/某类别/657._Judge_Route_Circle.md) -* [](/docs/某类别/665._Non-decreasing_Array.md) -* [](/docs/某类别/672._Bulb_Switcher_II.md) -* [](/docs/某类别/681._Next_Closest_Time.md) -* [](/docs/某类别/682._Baseball_Game.md) -* [](/docs/某类别/687._Longest_Univalue_Path.md) -* [](/docs/某类别/740._delete_and_earn.md) -* [](/docs/某类别/760._Find_Anagram_Mappings.md) ## 推荐的一些LeetCode网站 From 071adfe8b7a5ddb1fc0695e9249695abf09f9f1e Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:51:12 -0500 Subject: [PATCH 462/473] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 07e3c4483..7915cffa6 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ # Algorithms -## 1. [LeetCode 题解和总结](/docs/Leetcode_Solutions/) +## [LeetCode 题解和总结](/docs/Leetcode_Solutions/) -## 2. [面试问答]() +## [面试问答](/docs/Interview/) * [Google 面试题](/docs/interview/Google/Google.md) * [pocketgems 面试题](/docs/interview/pocketgems/pocketgems.md) * [WePay 面试题](/docs/interview/WePay/WePay.md) * [拍拍贷面试题](/docs/interview/拍拍贷/paipaidai.md) -## 3. [算法模版](/docs/Algorithm_Templates) +## [算法模版](/docs/Algorithm_Templates/) ## 推荐的一些LeetCode网站 From 2398f5e8b660af885740d678f9c09ea4a4f977a0 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:52:42 -0500 Subject: [PATCH 463/473] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7915cffa6..54c60e39d 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ # Algorithms -## [LeetCode 题解和总结](/docs/Leetcode_Solutions/) +## 1. [LeetCode 题解和总结](/docs/Leetcode_Solutions/) -## [面试问答](/docs/Interview/) +## 2. [面试问答](/docs/Interview/) * [Google 面试题](/docs/interview/Google/Google.md) * [pocketgems 面试题](/docs/interview/pocketgems/pocketgems.md) * [WePay 面试题](/docs/interview/WePay/WePay.md) * [拍拍贷面试题](/docs/interview/拍拍贷/paipaidai.md) -## [算法模版](/docs/Algorithm_Templates/) +## 3. [算法模版](/docs/Algorithm_Templates/) ## 推荐的一些LeetCode网站 From c1f2f98f732700ba1225b158777b4521c9761a92 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:53:19 -0500 Subject: [PATCH 464/473] Update README.md --- docs/Algorithm_Templates/Compression/README.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/docs/Algorithm_Templates/Compression/README.md b/docs/Algorithm_Templates/Compression/README.md index fe9c7bbf3..8b1378917 100644 --- a/docs/Algorithm_Templates/Compression/README.md +++ b/docs/Algorithm_Templates/Compression/README.md @@ -1,15 +1 @@ -# Some algorithm templates for better understanding! -## 八大排序算法 - -![](/images/SortingAlgorithm/八大排序算法性能.png) - -| 名称 | 动图 | 代码 | -| --- | --- | --- | -| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | -| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | -| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | -| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | -| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | -| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | -| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | From ceeed809e0b2f65ba248eae8de630c697e476101 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:53:38 -0500 Subject: [PATCH 465/473] Update README.md --- docs/Algorithm_Templates/Data_Structure/README.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/docs/Algorithm_Templates/Data_Structure/README.md b/docs/Algorithm_Templates/Data_Structure/README.md index fe9c7bbf3..8b1378917 100644 --- a/docs/Algorithm_Templates/Data_Structure/README.md +++ b/docs/Algorithm_Templates/Data_Structure/README.md @@ -1,15 +1 @@ -# Some algorithm templates for better understanding! -## 八大排序算法 - -![](/images/SortingAlgorithm/八大排序算法性能.png) - -| 名称 | 动图 | 代码 | -| --- | --- | --- | -| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | -| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | -| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | -| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | -| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | -| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | -| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | From 9265752ef1f5ae9ead5ed65de4e81e22a477c2cc Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:55:50 -0500 Subject: [PATCH 466/473] Update README.md --- docs/Algorithm_Templates/Sort/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/Algorithm_Templates/Sort/README.md b/docs/Algorithm_Templates/Sort/README.md index fe9c7bbf3..3a43278fd 100644 --- a/docs/Algorithm_Templates/Sort/README.md +++ b/docs/Algorithm_Templates/Sort/README.md @@ -6,10 +6,10 @@ | 名称 | 动图 | 代码 | | --- | --- | --- | -| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | -| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | -| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | -| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | -| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | -| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm_Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/Algorithm_Templates/Sort/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/Algorithm_Templates/Sort/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/Algorithm_Templates/Sort/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/Algorithm_Templates/Sort/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/Algorithm_Templates/Sort/MergeSort.py) | | 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | From 5b422b2b117e4ef05e9c15139ccca132206f0259 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:59:27 -0500 Subject: [PATCH 467/473] Update README.md --- docs/Algorithm_Templates/Sort/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/Algorithm_Templates/Sort/README.md b/docs/Algorithm_Templates/Sort/README.md index 3a43278fd..4237c9827 100644 --- a/docs/Algorithm_Templates/Sort/README.md +++ b/docs/Algorithm_Templates/Sort/README.md @@ -6,10 +6,10 @@ | 名称 | 动图 | 代码 | | --- | --- | --- | -| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm_Templates/Sort/BubbleSort.py) | -| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/Algorithm_Templates/Sort/InsertSort.py) | -| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/Algorithm_Templates/Sort/SelectionSort.py) | -| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/Algorithm_Templates/Sort/QuickSort.py) | -| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/Algorithm_Templates/Sort/ShellSort.py) | -| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/Algorithm_Templates/Sort/MergeSort.py) | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/MergeSort.py) | | 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | From 117d17a4035c1eb8074237257e1f0f8c11139cf9 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 13:59:51 -0500 Subject: [PATCH 468/473] Update README.md --- docs/Algorithm_Templates/README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/Algorithm_Templates/README.md b/docs/Algorithm_Templates/README.md index fe9c7bbf3..3dbd4dbd6 100644 --- a/docs/Algorithm_Templates/README.md +++ b/docs/Algorithm_Templates/README.md @@ -6,10 +6,11 @@ | 名称 | 动图 | 代码 | | --- | --- | --- | -| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](/opt/git/LeetCode/docs/Algorithm\ Templates/Sort/BubbleSort.py) | -| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/InsertSort.py) | -| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/SelectionSort.py) | -| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/QuickSort.py) | -| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/ShellSort.py) | -| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](/opt/git/LeetCode/docs/src/py2.x/SortingAlgorithm/MergeSort.py) | +| 冒泡排序 | ![](/images/SortingAlgorithm/冒泡排序.gif) | [BubbleSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/BubbleSort.py) | +| 插入排序 | ![](/images/SortingAlgorithm/直接插入排序.gif) | [InsertSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/InsertSort.py) | +| 选择排序 | ![](/images/SortingAlgorithm/简单选择排序.gif) | [SelectionSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/SelectionSort.py) | +| 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/QuickSort.py) | +| 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/ShellSort.py) | +| 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/MergeSort.py) | | 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | + From 3f745078da810eb44dbc01aee40811db9150a45b Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 14:01:08 -0500 Subject: [PATCH 469/473] Create RadixSort.py --- docs/Algorithm_Templates/Sort/RadixSort.py | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 docs/Algorithm_Templates/Sort/RadixSort.py diff --git a/docs/Algorithm_Templates/Sort/RadixSort.py b/docs/Algorithm_Templates/Sort/RadixSort.py new file mode 100644 index 000000000..e5fc2aba3 --- /dev/null +++ b/docs/Algorithm_Templates/Sort/RadixSort.py @@ -0,0 +1,46 @@ +#************************基数排序**************************** +#确定排序的次数 +#排序的顺序跟序列中最大数的位数相关 +def radix_sort_nums(L): + maxNum = L[0] +#寻找序列中的最大数 + for x in L: + if maxNum < x: + maxNum = x +#确定序列中的最大元素的位数 + times = 0 + while (maxNum > 0): + maxNum = int((maxNum/10)) + times += 1 + return times +#找到num从低到高第pos位的数据 +def get_num_pos(num, pos): + return (int((num/(10**(pos-1))))) % 10 +#基数排序 +def radix_sort(L): + count = 10 * [None] #存放各个桶的数据统计个数 + bucket = len(L) * [None] #暂时存放排序结果 +#从低位到高位依次执行循环 + for pos in range(1, radix_sort_nums(L)+1): + #置空各个桶的数据统计 + for x in range(0, 10): + count[x] = 0 + #统计当前该位(个位,十位,百位....)的元素数目 + for x in range(0, len(L)): + #统计各个桶将要装进去的元素个数 + j = get_num_pos(int(L[x]), pos) + count[j] += 1 + #count[i]表示第i个桶的右边界索引 + for x in range(1,10): + count[x] += count[x-1] + #将数据依次装入桶中 + for x in range(len(L)-1, -1, -1): + #求出元素第K位的数字 + j = get_num_pos(L[x], pos) + #放入对应的桶中,count[j]-1是第j个桶的右边界索引 + bucket[count[j]-1] = L[x] + #对应桶的装入数据索引-1 + count[j] -= 1 + # 将已分配好的桶中数据再倒出来,此时已是对应当前位数有序的表 + for x in range(0, len(L)): + L[x] = bucket[x] From 400d946820392e92a7ded500d588de0cc5f0297b Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 14:02:22 -0500 Subject: [PATCH 470/473] Update README.md --- docs/Algorithm_Templates/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Algorithm_Templates/README.md b/docs/Algorithm_Templates/README.md index 3dbd4dbd6..8e0b4dd33 100644 --- a/docs/Algorithm_Templates/README.md +++ b/docs/Algorithm_Templates/README.md @@ -12,5 +12,5 @@ | 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/QuickSort.py) | | 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/ShellSort.py) | | 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/MergeSort.py) | -| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | [RadixSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/RadixSort.py) | From 05103037884a8433a7ce5653ba3467cadd978803 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Sat, 7 Apr 2018 14:02:49 -0500 Subject: [PATCH 471/473] Update README.md --- docs/Algorithm_Templates/Sort/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/Algorithm_Templates/Sort/README.md b/docs/Algorithm_Templates/Sort/README.md index 4237c9827..8e0b4dd33 100644 --- a/docs/Algorithm_Templates/Sort/README.md +++ b/docs/Algorithm_Templates/Sort/README.md @@ -12,4 +12,5 @@ | 快速排序 | ![](/images/SortingAlgorithm/快速排序.gif) | [QuickSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/QuickSort.py) | | 希尔排序 | ![](/images/SortingAlgorithm/希尔排序.png) | [ShellSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/ShellSort.py) | | 归并排序 | ![](/images/SortingAlgorithm/归并排序.gif) | [MergeSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/MergeSort.py) | -| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | | +| 基数排序 | ![](/images/SortingAlgorithm/基数排序.gif) | [RadixSort.py](https://github.com/apachecn/LeetCode/blob/master/docs/Algorithm_Templates/Sort/RadixSort.py) | + From 4372fa55f1be969c67520efd3165115cb3d5d098 Mon Sep 17 00:00:00 2001 From: cclauss Date: Sun, 8 Apr 2018 10:21:15 +0200 Subject: [PATCH 472/473] Illegal character in variable name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaced the invisible characters with space characters. flake8 testing of https://github.com/Upgrade-to-Python3/LeetCode on Python 2.7.6 $ __python2 -m flake8 . --count --select=E901,E999,F821,F822,F823 --show-source --statistics__ ``` ./docs/Leetcode_Solutions/Summarization/Python刷题技巧笔记.py:10:4: E999 SyntaxError: invalid syntax row = len(matrix) ^ 1 E999 SyntaxError: invalid syntax 1 ``` --- ...00\345\267\247\347\254\224\350\256\260.py" | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git "a/docs/Leetcode_Solutions/Summarization/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" "b/docs/Leetcode_Solutions/Summarization/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" index b0a0a8b93..69fed8912 100644 --- "a/docs/Leetcode_Solutions/Summarization/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" +++ "b/docs/Leetcode_Solutions/Summarization/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.py" @@ -7,13 +7,13 @@ # range会产生list存在memory中,xrange更像是生成器,generate on demand所以有的时候xrange会更快 # 3. python处理矩阵 -row  = len(matrix) -col = len(matrix[0]) if row else 0  -# 这样写通用的原因是, 当matrix = [], row = 0, col =0 +row = len(matrix) +col = len(matrix[0]) if row else 0 +# 这样写通用的原因是, 当matrix = [], row = 0, col = 0 # 4. python列表生成式 lst = [0 for i in range(3)] # lst = [0,0,0] -lst  = [[0 for i in range(3)] for j in range(2)]  # lst =  [[0, 0, 0], [0, 0, 0]] +lst = [[0 for i in range(3)] for j in range(2)] # lst =  [[0, 0, 0], [0, 0, 0]] # 下面这种写法危险: # lst1 = [ 0, 0, 0 ] # lst2  = [lst1] * 2  # lst2 = [ [0,0,0] , [0,0,0] ] @@ -24,18 +24,18 @@ # 如果这个key 没有在dict里面,给它一个默认值: D = {} if 1 in D: -  val = D[1] + val = D[1] else : -  val = 0 + val = 0 # 等同于这样写: val = D.get(1, 0) # 6. 字典赋值 if key in D: -  D[key].append(1) + D[key].append(1) else : -  D[key] = [] - + D[key] = [] + # 7. 字符串反转 # python字符串没有reverse函数,只能str[::-1] string[::-1] @@ -86,6 +86,6 @@ print('\r%s' % ''.join(fancy_loading)) fancy_loading.rotate(1) sys.stdout.flush() - time.sleep(0.08) + time.sleep(0.08) # 11. 用yield 不用return,可以返回一个generator From a3db90ea52894c6f8d36592fcfe102965382aea0 Mon Sep 17 00:00:00 2001 From: cclauss Date: Sun, 8 Apr 2018 10:23:10 +0200 Subject: [PATCH 473/473] Illegal characters in variable name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaced the invisible characters with space characters. flake8 testing of https://github.com/Upgrade-to-Python3/LeetCode on Python 2.7.6 $ __python2 -m flake8 . --count --select=E901,E999,F821,F822,F823 --show-source --statistics__ ``` ./docs/Leetcode_Solutions/Summarization/Python刷题技巧笔记.py:10:4: E999 SyntaxError: invalid syntax row = len(matrix) ^ 1 E999 SyntaxError: invalid syntax 1 ```

    %l6IX6ug0wb@mdSBdKnQ{+CYVB2T`k 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�w~~A4?|M_*FRp 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

    IC!5d5@1%~7+z6U}9w0MC}0{6`fU0`yOp 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 z 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

y&B`PeXKeQE9zPYAF!+)Lg=x*9vJS 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 literal 0 HcmV?d00001 diff --git "a/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.md" "b/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.md" new file mode 100644 index 000000000..bf50419f3 --- /dev/null +++ "b/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.md" @@ -0,0 +1,227 @@ +### Python刷题技巧笔记 + +备份自己的帖子 + +有的时候 + + +**用Python解题经常可以作弊,Python 处理string非常方便, python内置模块非常多,比如排列组合啥的各种....** + + +有的时候 + + +**Python大法好,就是偶尔慢** + + + + +Python也是可以追求运行速度的,除了算法方面的提升,也有些常见函数之间的区别 + + +还有我刷的Python 2 和 3 已经迷茫了,如果有说错的地方敬请指出 + + + + +===========初级技巧================= + + + + +-  排序 + + +用lst.sort() 而不是nlst = sorted(lst) + + +区别在于lst.sort()是 in-place sort,改变lst, sorted会创建新list,成本比较高。 + + + + +- 用xrange  + + +xrangge 和 range的区别是在于 range会产生list存在memory中,xrange更像是生成器,generate on demand + + +所以有的时候xrange会更快 + + +-  三目运算符 + + +python 的三目运算符是这么写的 x if y else z + + +考虑这种list of list: matrix = [ [1,2,3] , [4,5,6] ] + + +row  = len(matrix) +col = len(matrix[0]) if row else 0  + + +这样写通用的原因是, 当matrix = [], row = 0, col =0 + + +- list 填 0 + + +lst = [0 for i in range(3)] # lst = [0,0,0] + + +lst  = [[0 for i in range(3)] for j in range(2)]  # lst =  [[0, 0, 0], [0, 0, 0]] + + + + +下面这种写法危险: + + +lst1 = [ 0, 0, 0 ] +lst2  = [lst1] * 2  # lst2 = [ [0,0,0] , [0,0,0] ] +lst2\[0]\[0] = 1  # lst2 = [ [1,0,0], [1,0,0]] + + +因为lst1是object,这样写会踩坑 + + + + +- D.get(key, default) + + +如果这个key 没有在dict里面,给它一个默认值: + + +D = {} +if 1 in D: +  val = D[1] +else : +  val = 0 + + +等同于这样写: + + +val = D.get(1, 0) + + + + +- reverse list + + +lst = [1,2,3] + + +print lst[::-1] #[3,2,1] + + +lst 也有reverse函数 + + +这也也适用于str, str可是没有reverse 函数的,str[::-1] 可用 √ + + + + +=================进阶一下===================== + + +Python 也是有自己的数据结构的!!!! + + +- deque +   还在用list来做queue么? deque,当求快queue的时候,你值得拥有 + + +- Counter +   Counter做啥就顾名思义了 + + +- yield +   用yield不用return ( 我也还在学习阶段 + + + + + + + + +import collections就可以用了,参见  [collections — High-performance container datatypes](https://docs.python.org/2/library/collections.html) + + + + + + +===============举个当时我就震惊了的例子=============== + + + + +看到在stackoverflow上看到有人求这样一个数据结构: + + +[Anyone know this Python data structure?](http://stackoverflow.com/questions/4098179/anyone-know-this-python-data-structure) + + + + + +Close to **O(1) performance** for as many of the following four operations. +Maintaining **sorted order while inserting** an object into the container. +Ability to **peek at last value** (the largest value) contained in the object. +Allowing for **pops on both sides** (getting the smallest or largest values). +Capability of **getting the total size** or number of objects being stored. +Being a **ready made solution** like the code in Python's standard library. + + + + + +然后真的可以implement出来 + +import collections +import bisect + +class FastTable: + +    def __init__(self): +        self.__deque = collections.deque() + +    def __len__(self): +        return len(self.__deque) + +    def head(self): +        return self.__deque.popleft() + +    def tail(self): +        return self.__deque.pop() + +    def peek(self): +        return self.__deque[-1] + +    def insert(self, obj): +        index = bisect.bisect_left(self.__deque, obj) +        self.__deque.rotate(-index) +        self.__deque.appendleft(obj) +        self.__deque.rotate(index) + +复制代码 +对此我只想表示牛,并且我硬生生的用它来解过人家不是要这种思路的题目。 + + + + +**补充内容 (2016-10-28 00:40):** +Python有built-inheap,是min heap.  heapq,如何来用它实现max heap呢,看到过一个有意思的方法是把key取负,比如把100变成-100,5变成-5。 + + + + + + diff --git a/Range Sum Query 2D - Immutable.pdf b/Range Sum Query 2D - Immutable.pdf new file mode 100644 index 0000000000000000000000000000000000000000..09410e209c3adc3ad41ebbdfdf0de177bb229e9e GIT binary patch literal 167781 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 z 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 literal 0 HcmV?d00001 diff --git a/Readme.md b/Readme.md new file mode 100644 index 000000000..859d89797 --- /dev/null +++ b/Readme.md @@ -0,0 +1,16 @@ +### LeetCode × Python × CLRS + + +Finally, going to take LeetCode, Python can make you focus on the ideas, while CLRS is really kind of tedious, so whenever you finished some reading, you just, just would feel so happy that you can do LeetCode. + + - 📚📖✏️📓 + - 🍔🍝🍛🍣 + - 😕😐😮😏 + - 🙌👎👍💪 + + + + + + + diff --git a/Recusrion & BackTracking.md b/Recusrion & BackTracking.md new file mode 100644 index 000000000..16e0f9279 --- /dev/null +++ b/Recusrion & BackTracking.md @@ -0,0 +1,237 @@ +#Recusrion & BackTracking + +##Recusrion + +### DrawFractal + +``` +void DrawFractal(double x, double y, double w, double h) +{ + DrawTriangel(x, y, w, h); + if(w < .2 || h < .2) return ; + double halfH = h/2; + double halfw = w/2; + DrawFractal(x, y, halfW, halfH); + DrawFractal(x + halfW/2, y + halfH, halfW, halfH); + DrawFractal(x + halfW, y, halfW, halfH); +} +``` + + +Sierpinski triangle更伪码的写法: + +``` +void DrawFractal (x, y, w, h){ + if (too small) return ; + DrawTriangle(x, y, w, h); + DrawFractal(.left); + DrawFractal(.top); + DrawFractal(.right); +} +``` + +实际上老师故意调了里面几句代码的顺序,让来看到虽然结果相同,但是画的过程是不一样的。 + +然后老师还在黑板上画了过程树,分枝是怎样的,实际上当学到DFS的preOrder, inOrder 和 postOrder的时候会更印象深刻。 + +一个分支走完之后再回去走另一些。 + + +### DrawMondrian + + + +``` +void DrawMondrian(double x, double y, double w, double h){ + + if(w < 1 || h < 1) return ;// base case + + FillRectangle(x,y,w,h,RandomColor()); // fill background + + switch(RandomInteger(0, 2)){ + case 0: // do nothing + break; + case 1: // bisect vertically + double midX = RandomReal(0,w); + DrawBlackLine( x + midX, y, h); + DrawMondrian(x, y, midX, h); + DrawMondrian(x + midx, y, w- midX, h); + break; + case 2: // bisect horizontally + double midY = RandomReal(0,h); + DrawBlackLine( x, y+ midY, h); + DrawMondrian(x, y, w, midY); + DrawMondrian(x, y+midY,w, midY); + break; + } +} +``` + + +### The tower of Hanoi + + +``` +void MoveTower(int n, char src, char dst, char tmp){ + if (n > 0){ + MoveTower(n - 1, src, tmp, dst ); + MoveSingleDisk(src, dst); + MoveTower(n -1, tmp, dst, src); + } +} + +``` + + +### Permutation + +老师说permutation 和 subset 是 mother problems of all recursion. + + +given a string, print out its all permutations + +思路如下: + +- 使用了的string sofar,以及还未使用的string rest +- 一开始rest就是给的string本身,然后sofar是空 +- 每次挑一个rest里面的char,然后递归的再把rest剩下的拿来permutation,这样每次都会有一个char从rest shuffle到sofar +- n 次之后 rest为空,制造了一个permutation + + +``` +void RecPermute(string sofar, string rest){ + if(rest = ""){ + cout << soFar << endl; + } else { + for(int i = 0 ; i < rest.length(); i++){ + string next = soFar + rest[i]; + string remaining = rest.substr(0,i) + rest.substr(i+1); + RecPermute(next, remaining); + } + } +} + + +// "wrapper" function +void ListPermutations(string s) +{ + RecPermute("",s); +} +``` + + +老师的黑板图真的是击中要害。 + +因为老师强调的是,也要用mind来trace它是如何操作的。 + + + +### Subsets + + +``` +void RecSubsets(string soFar, string rest) +{ + if(rest = "") + cout << soFar << endl; + else { + // add to subset, remove from rest, recur + RecSubsets(soFar + rest[0],rest.substr(1)); + //don't add to substr, remove from rest, recur + RecSubsets(soFar, rest.substr(1)); + } +} + + +void ListSubsets(string str) +{ + RecSubsets("",str); +} + +``` + +代码非常容易理解 + + +比较一下:两个都是有关选择,permutation是每次选哪一个char,而subsets是选择这个char 是否in. + +两个recursion tree都是有branching 和 depth的, depth都是n,每次选一个,知道n个选完. + +branching是how many recusive calls 每次made,subset每次都是两个,in/out,而permutation则是n,n-1.......grows very quickly. + +因为permutation是n!,subsets是2^n,跟树对应。这些都是比较intractable的问题,并不是因为recursion,而是问题本身的复杂度。 + + +这两个问题都是exhaustive的,然而,我们会更多碰到一些问题,有着 + +similar exhaustive structure,但是遇到'satisfactory' outcome就会stop的 -> 也就是backtracking了. + +##BackTracking + + + +### pseudocode + +把问题转成decision problem,然后开始make choice. + +``` +bool Solve(configuration conf) +{ + if (no more choices) // BASE CASE + return (conf is goal state); + + for (all available choices){ + try one choice c; + // sove from here, it works out. you're done. + if (Solve(conf with choice c made)) return true; + unmake choice c; + } + return false; //tried all choices, no soln found +} +``` + + +###IsAnagram + + +``` +bool IsAnagram(string soFar, string rest, Lexicon & lex) +{ + if(rest == ""){ + if(lex.contains(soFar)){ + cout << soFar << endl; + return true; + } + } else { + for(int i = 0; i < rest.length() ; i++ ){ + string next = soFar + rest[i]; + string remaining = rest.substr(0,i) + rest.substr(i+1); + if(IsAnagram(next, remaining, lex)) return true; + } + } + return false; +} +``` + + +### 8 Queens + + +``` + +bool Solve(Grid &board, int col) +{ + if(col > = board.numCols()) return true; + + for(int rowToTry = 0; rowToTry < board.numRows(); rowToTry++){ + if (IsSafe(board,rowToTry, col)){ + PlaceQueen(board,rowToTry,col); + if (Solve(board,col+1)) return true; + RemoveQueen(board,rowToTry, col); + } + } + return false; +} + +``` + diff --git "a/backtracking\346\200\235\350\267\257.md" "b/backtracking\346\200\235\350\267\257.md" new file mode 100644 index 000000000..27e61d352 --- /dev/null +++ "b/backtracking\346\200\235\350\267\257.md" @@ -0,0 +1,68 @@ +##以Generate Parentheses为例,backtrack的题到底该怎么去思考? + + +所谓Backtracking都是这样的思路:在当前局面下,你有若干种选择。那么尝试每一种选择。如果已经发现某种选择肯定不行(因为违反了某些限定条件),就返回;如果某种选择试到最后发现是正确解,就将其加入解集 + +所以你思考递归题时,只要明确三点就行:选择 (Options),限制 (Restraints),结束条件 (Termination)。即“ORT原则”(这个是我自己编的) + + + + +对于这道题,在任何时刻,你都有两种选择: +1. 加左括号。 +2. 加右括号。 + +同时有以下限制: +1. 如果左括号已经用完了,则不能再加左括号了。 +2. 如果已经出现的右括号和左括号一样多,则不能再加右括号了。因为那样的话新加入的右括号一定无法匹配。 + +结束条件是: +左右括号都已经用完。 + +结束后的正确性: +左右括号用完以后,一定是正确解。因为1. 左右括号一样多,2. 每个右括号都一定有与之配对的左括号。因此一旦结束就可以加入解集(有时也可能出现结束以后不一定是正确解的情况,这时要多一步判断)。 + +递归函数传入参数: +限制和结束条件中有“用完”和“一样多”字样,因此你需要知道左右括号的数目。 +当然你还需要知道当前局面sublist和解集res。 + +因此,把上面的思路拼起来就是代码: + + if (左右括号都已用完) { + 加入解集,返回 + } + //否则开始试各种选择 + if (还有左括号可以用) { + 加一个左括号,继续递归 + } + if (右括号小于左括号) { + 加一个右括号,继续递归 + } + + + +你帖的那段代码逻辑中加了一条限制:“3. 是否还有右括号剩余。如有才加右括号”。这是合理的。不过对于这道题,如果满足限制1、2时,3一定自动满足,所以可以不判断3。 + +这题其实是最好的backtracking初学练习之一,因为ORT三者都非常简单明显。你不妨按上述思路再梳理一遍,还有问题的话再说。 + + + +以上文字来自 1point3arces的牛人解答 + + + +Backtracking 伪码 + + +``` +Pick a starting point. +while(Problem is not solved) + For each path from the starting point. + check if selected path is safe, if yes select it + and make recursive call to rest of the problem + If recursive calls returns true, then return true. + else undo the current move and return false. + End For + If none of the move works out, return false, NO SOLUTON. + +``` \ No newline at end of file diff --git "a/delete_node_in_a_linked_list\351\227\256\351\242\230.md" "b/delete_node_in_a_linked_list\351\227\256\351\242\230.md" new file mode 100644 index 000000000..e148bb218 --- /dev/null +++ "b/delete_node_in_a_linked_list\351\227\256\351\242\230.md" @@ -0,0 +1,69 @@ +##Delete Node in a Linked List问题 + + +This is a LeetCode question, I knew its solution, but wondering about why my code not work. + + +>Write a function to delete a node (except the tail) in a singly linked list, given only access to that node. + +>Supposed the linked list is 1 -> 2 -> 3 -> 4 and you are given the third node with value 3, the linked list should become 1 -> 2 -> 4 after calling your function + + +At first glance, my intution is delete like an array: + +shift all the node values one front, then delete the tail, here's my implementation and test case: + + + + class ListNode(object): + def __init__(self, x): + self.val = x + self.next = None + + node1 = ListNode(1) + node2 = ListNode(2) + node3 = ListNode(3) + node4 = ListNode(4) + node5 = ListNode(5) + + node1.next = node2 + node2.next = node3 + node3.next = node4 + node4.next = node5 + + + + def deleteNode(node): + """ + :type node: ListNode + :rtype: void Do not return anything, modify node in-place instead. + """ + while node.next: + node.val = node.next.val + node = node.next + node = None + + + deleteNode(node4) + +But After deletion, it has two 5 value nodes, the tail was still kept, can anyone please explain to me what's wrong here? + + deleteNode(node4) + + node1.val + Out[162]: 1 + + node1.next.val + Out[163]: 2 + + node1.next.next.val + Out[164]: 3 + + node1.next.next.next.val + Out[165]: 5 + + node1.next.next.next.next.val + Out[166]: 5 + + +Really appreciate any help. \ No newline at end of file diff --git "a/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" "b/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" new file mode 100644 index 000000000..864326ec7 --- /dev/null +++ "b/local_search\357\274\214_\344\270\200\344\272\233\346\226\260\347\232\204\346\200\235\350\267\257.md" @@ -0,0 +1,14 @@ +# Local Search, 一些新的思路 + +当一个问题我们只关心解法,而不是其达到解的顺序,那么考虑使用local search,比如八皇后问题,我们只关心哪个皇后放哪,根本不关心加入皇后的顺序。 + +local search还能用来解一类问题,求最优。 + + + +> A complete local search algorithm always finds a goal if one exists; an optimal algorithm always finds a global minimum/maximum. + + +一个解八皇后的新思路是我们根本就random来放皇后,然后如果state 合法,就get解答一枚,否则可以Move only to neighboring states,当然,选之剑attack数量最少的state. + +这种方法叫 hill - climbing,很多问题,可能被卡,然后random restart \ No newline at end of file diff --git "a/python\347\232\204\345\220\204\347\247\215pass.md" "b/python\347\232\204\345\220\204\347\247\215pass.md" new file mode 100644 index 000000000..c1ac085a8 --- /dev/null +++ "b/python\347\232\204\345\220\204\347\247\215pass.md" @@ -0,0 +1,123 @@ +#Python的各种Pass + +感觉最近对于pass by reference 和 pass by value又有了一点/一些认识 + + +1. python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象——相当于通过“传值'来传递对象。 +2. 当人们复制列表或字典时,就复制了对象列表的引用同,如果改变引用的值,则修改了原始的参数。 +3. 为了简化内存管理,Python通过引用计数机制实现自动垃圾回收功能,Python中的每个对象都有一个引用计数,用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象。 + + +##### Linked List的例子 + + + +``` +class ListNode(object): + def __init__(self, x): + self.val = x + self.next = None + +node1 = ListNode(1) +node2 = ListNode(2) +node3 = ListNode(3) +node4 = ListNode(4) +node5 = ListNode(5) + +node1.next = node2 +node2.next = node3 +node3.next = node4 +node4.next = node5 + +``` + + + +来改变head + +``` +def testWithPointers1(head): + head.next = None +``` + + + +运行 testWithPointers1(node1) + +然后node1.next 为None了 + +// 可以理解,因为传进去的是head这个可变对象。 + + + +``` +def testWithPointers2(head): + cur = head + cur.next = None +``` + + + +运行 testWithPointers2(node1) +// node1.next 同样为None了 + +Python的object,list都是pass by reference,所以是改变的 + +看另外一个例子: + +``` +def printLinkedList(head): + while head: + print(head) + head = head.next +``` + + +输出 + +``` + printLinkedList(head) + +<__main__.ListNode object at 0x1044c0e10> + +1 + +<__main__.ListNode object at 0x1044c0fd0> + +2 + +<__main__.ListNode object at 0x1044c0c88> + +3 + +<__main__.ListNode object at 0x1044c0be0> + +4 + +<__main__.ListNode object at 0x1044c0780> + +5 + +head + +Out[39]: <__main__.ListNode at 0x1044c0e10> + +``` + +其实这里的head为什么没有改变有点疑惑 + + + +##### String看一下 + + + a = "abc" + + def changeA(s): + s = "" + changeA(a) + + +a 并不会改变,依旧为'abc' + + \ No newline at end of file diff --git "a/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" "b/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" new file mode 100644 index 000000000..7dccde3ec --- /dev/null +++ "b/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" @@ -0,0 +1,183 @@ +# Tree Search, Graph Search, DFS, BFS + + +其实原本是根本不知道还有tree search的,只知道graph search,原来graph search就是一般我看到的dfs,bfs,有一个结构来记录visited node,这样在寻找邻居的时候,防止已经visit的node再被visit. + + +### Tree Search + +general tree search pseudocode + + +``` +function TREE_SEARCH(problem, strategy) returns a solution, or failure + initialize the search tree using the initial state of problem + loop do + if there are no candidates for expansion then return failure + choose a leaf node for expansion according to strategy + if the node contains a goal state then return the corresponding solution + else expand the node and add the resulting nodes to the search tree + end +``` + + + + +### Graph Search + +very simple fix: never expand a state type twice + +``` +function GRAPH_SEARCH(problem, fringe) returns a solution, or failure + closed <- an empty set + fringe <- INSERT(MAKE-NODE(INITIAL-STATE[problem]),fringe) + loop do + if fringe is empty then return failure + node <- REMOVE-FRONT(fringe) + if GOAL-TEST(problem, STATE[node]) then return node + if STATE[node] is not in closed then + add STATE[node] to closed + fringe <- INSERTALL(EXPAND(node, problem)) + end + +``` + + +重要的点: + +- fringe +- strategy + +然后没有查重的过程 + +####DFS + +递归伪码 + +``` +1 procedure DFS(G,v): +2 label v as discovered +3 for all edges from v to w in G.adjacentEdges(v) do +4 if vertex w is not labeled as discovered then +5 recursively call DFS(G,w) +``` + +非递归伪码,其实递归在计算机内部就是用的stack,所以这里用stack可以解决问题 + +每次都expand deepest node + +``` +1 procedure DFS-iterative(G,v): +2 let S be a stack +3 S.push(v) +4 while S is not empty +5 v = S.pop() +6 for all edges from v to w in G.adjacentEdges(v) do +7 if w is not labeled as discovered: +8 label w as discovered +9 S.push(w) +``` + + +#### BFS + +伪码,这个伪码提供的信息有点多啊,把Unweighted shortest distance顺便也求出来了。 + +``` + 1 Breadth-First-Search(Graph, root): + 2 + 3 for each node n in Graph: + 4 n.distance = INFINITY + 5 n.parent = NIL + 6 + 7 create empty queue Q + 8 + 9 root.distance = 0 +10 Q.enqueue(root) +11 +12 while Q is not empty: +13 +14 current = Q.dequeue() +15 +16 for each node n that is adjacent to current: +17 if n.distance == INFINITY: +18 n.distance = current.distance + 1 +19 n.parent = current +20 Q.enqueue(n) +``` + +其实跟以上DFS的非递归写成一样也行 + +expand the shallowest node + + +``` +1 procedure BFS-iterative(G,v): +2 let Q be a queue +3 Q.enqueue(v) +4 while Q is not empty +5 v = Q.dequeue() +6 for all edges from v to w in G.adjacentEdges(v) do +7 if w is not labeled as discovered: +8 label w as discovered +9 Q.enqueue(w) +``` + +BFS和DFS其实就是每次选下一个expand的node用的strategy不同. + + +#### DFS/BFS with Path + +可以让stack/queue记录更多一些的东西,因为反正stack/queue更像通用结构 + +``` + A + / \ + C B + \ / \ + \ D E + \ / + F + + +graph = {'A': set(['B', 'C']), + 'B': set(['A', 'D', 'E']), + 'C': set(['A', 'F']), + 'D': set(['B']), + 'E': set(['B', 'F']), + 'F': set(['C', 'E'])} + + + + +def dfs_paths(graph, start, goal): + stack = [(start, [start])] + visited = set() + while stack: + (vertex, path) = stack.pop() + if vertex not in visited: + if vertex == goal: + return path + visited.add(vertex) + for neighbor in graph[vertex]: + stack.append((neighbor, path + [neighbor])) + +print (dfs_paths(graph, 'A', 'F')) #['A', 'B', 'E', 'F'] +``` + +一旦BFS/DFS与更具体的,更有特性的data structure结合起来,比如binary search tree,那么BFS/DFS会针对这个tree traversal显得更有特性。 + + +#### UCS + +expand the cheapest node first + +Fringe is a priority queue + +乃Dijkstra算法 + + +#### Greedy + +#### A* + diff --git "a/\344\275\215\350\277\220\347\256\227.md" "b/\344\275\215\350\277\220\347\256\227.md" new file mode 100644 index 000000000..aeaa44c4d --- /dev/null +++ "b/\344\275\215\350\277\220\347\256\227.md" @@ -0,0 +1,38 @@ +### 位运算 + +位运算包括: 加 减 乘 取反 and 异或 + +- 0110 + 0110 = 0110 * 2 ,也就是0110左移1位 + +- 0011 * 0100 0100 = 4, 一个数乘以 2^n 即是将这个数左移n + +- a ^(~a) = 0 + +- x & (~0 << n ) 这样来看,0取反全部为1,然后将其右移n位,后面的全是0,x & (~0 <>:右移 + + ​ + +Bit Facts and Tricks + +``` +x ^ 0s = x x & 0s = 0 x | 0s = x +x ^ 1s = ~x x & 1s = x x | 1s = 1s +x ^ x = 0 x & x = x x | x = x +``` + diff --git "a/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" "b/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" new file mode 100644 index 000000000..c371aba66 --- /dev/null +++ "b/\345\205\250\346\216\222\345\210\227\347\256\227\346\263\225.md" @@ -0,0 +1,194 @@ +###全排列算法 + + +#### 46. Permutations + + +Given a collection of distinct numbers, return all possible permutations. + +For example, +[1,2,3] have the following permutations: + + [ + [1,2,3], + [1,3,2], + [2,1,3], + [2,3,1], + [3,1,2], + [3,2,1] + ] + + +#####从空开始加 + +先跳离开这道题,来看类似的'ABC',我们要求它的全排列 + + +``` +def recPermute(sofar, rest): + if rest == '': + print sofar + else: + for i in range(len(rest)): + nxt = sofar + rest[i] + remaining = rest[:i] + rest[i+1:] + recPermute(nxt, remaining) + +// "wrapper" function +def listPermute(s): + recPermute('',s) +``` + +会正确输出`ABC ACB BAC BCA CAB CBA`,题目依靠的是每次我们从余下的字母中选一个,如果画图则会是这样: + + +``` + A B C + B C A C A B + C B C A B A +``` + +时间复杂度应该是O(n!) + +- n choose 1 +- n-1 choose 1 +- ... + + + +#####另一种市面上常见思路是交换: + +思路是这样的,同样看上面的图: + +- n个元素的全排列 = (n-1)个元素的全排列 + 另一个元素作为前缀 +- 如果只有一个元素,那么这个元素本身就是它的全排列 +- 不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组 + + +这个用数组来测试更容易写代码和直观: + + +``` +def recPermute(nums,begin): + n = len(nums) + if begin == n: + print nums, + + for i in range(begin,n): + nums[begin], nums[i] = nums[i],nums[begin] + recPermute(nums,begin+1) + nums[begin],nums[i] = nums[i],nums[begin] + +recPermute(['A','B','C'],0) + +``` + +这样的写法更容易理解: + + +``` +class Solution: + # @param num, a list of integer + # @return a list of lists of integers + def permute(self, num): + if len(num) == 0: return [] + if len(num) == 1: return [num] + res = [] + for i in range(len(num)): + x = num[i] + xs = num[:i] + num[i+1:] + for j in self.permute(xs): + res.append([x] + j) + return res +``` + +每次用一个没有用过的头元素,然后加上全排列产生的结果. + +如果分析复杂度,应该也是O(n!) + + +#### 47. Permutations II + + +最简单的想法: + +- 排序 +- 如果碰到重复的就继续处理下一个 + +``` +class Solution(object): + def permuteUnique(self, nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + if len(nums) == 0: return [] + if len(nums) == 1: return [nums] + res = [] + nums.sort() + for i in range(len(nums)): + if i > 0 and nums[i] == nums[i-1]: continue + for j in self.permuteUnique(nums[:i] + nums[i+1:]): + res.append([nums[i]] + j) + return res + +``` + + + + +#### 31. Next Permutation + +实际上这个题目也就是Generation in lexicographic order, + +wikipedia 和 [这里](https://www.nayuki.io/page/next-lexicographical-permutation-algorithm) 有很好,很精妙的算法,也有点two pointer的意思 + + +``` +1. Find the highest index i such that s[i] < s[i+1]. If no such index exists, the permutation is the last permutation. +2. Find the highest index j > i such that s[j] > s[i]. Such a j must exist, since i+1 is such an index. +3. Swap s[i] with s[j]. +4. Reverse the order of all of the elements after index i till the last element. +``` + + +看例子: + +125430 + + +- 从末尾开始,找到decreasing subsequence,5430,因为来调5330无论怎么调,都不可能有比它更小的,数也被自然的分成两部分(1,2) 和 (5,4,3,0) +- 下一步是找这个sequence里面第一个比前面部分,比2大的,3,也很容易理解,因为下一个必定是(1,3)打头 +- 交换 3和2 ,变成 (1,3,5,4,2,0),再把后面的部分reverse,得到后面部分可得到的最小的 + +这个时候,得到下一个sequence 130245 + + + +``` +class Solution(object): + def nextPermutation(self, nums): + """ + :type nums: List[int] + :rtype: void Do not return anything, modify nums in-place instead. + """ + m, n = 0, 0 + for i in range(len(nums) - 2, 0 , -1): + if nums[i] < nums[i+1]: + m = i + break + + for i in range(len(nums) - 1, 0 , -1): + if nums[i] > nums[m]: + n = i + break + + if m < n : + nums[m], nums[n] = nums[n], nums[m] + nums[m+1:] = nums[len(nums):m:-1] + else: + nums = nums.reverse() +``` + + +所以可以用这个next permutation来解46/47也可以,然后我兴奋了一下,这个算法很快的!然后我又冷静了,因为permutation的个数是O(n!)个啊|||,所以也不可能有啥大的提升吧 \ No newline at end of file diff --git "a/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" "b/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" new file mode 100644 index 000000000..0d4afa96a --- /dev/null +++ "b/\345\255\220\351\233\206\345\220\210\351\227\256\351\242\230.md" @@ -0,0 +1,114 @@ +###子集合问题 + +####78. Subsets + +子集合是全排列的好朋友,也是combination组合的好朋友,排列·组合·子集,他们三个都是好朋友. + + +#####从空开始加 + +同样先来看'ABC' + +``` +def recsubsets(sofar, rest): + if rest == '': + print sofar, + else: + recsubsets(sofar, rest[1:]) + recsubsets(sofar + rest[0], rest[1:]) + +def listsubsets(s): + recsubsets('',s) + + +listsubsets('ABC') +``` + +##### 市面流行思路 + +市面上流行的思路: + +- [[],[1]] 是 [1] 的子集合 +- [[],[1],[2],[1,2]] 是 [1,2] 的子集合,实际上就是1的子集合们加了一个2 + + +所以用python写起来也很简单/精美 + +``` +def subsets(nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + results = [[]] + for num in nums: + results.extend([result + [num] for result in results]) + return results +``` +我在这里犯过错,所以这一句 + +`results.extend([result + [num] for result in results])` 实际上等于: + + +``` +tmp = [] +for result in results: + tmp.append(result + [num]) +results.extend(tmp) +``` + + + + + +#### 90. Subsets II + + +要去重了,比如如果有 [1,2,2],那么解答为: + + + [ + [2], + [1], + [1,2,2], + [2,2], + [1,2], + [] + ] + + +现在来观察规律,与之前有不同之处是我们需要一个位置来mark,因为不再需要往之前出现过的地方再加了,看这个: + + +``` +[[],[1]] 是 [1] 的子集合 +[[],[1],[2],[1,2]] 是 [1,2] 的子集合,实际上就是1的子集合们加了一个2 +新来的2不能再从头开始加了,它需要从[ .., [2],[1,2] ]加 才是合理的 +``` + +所以看到非常精妙的代码 + + +``` +def subsets(nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + nums.sort() + result = [[]] + temp_size = 0 + + for i in range(len(nums)): + start = temp_size if i >= 1 and nums[i] == nums[i-1] else 0 + temp_size = len(result) + #print start,temp_size,result + for j in range(start, temp_size): + result.append(result[j] + [nums[i]]) + print result + +subsets([1,2,2]) +``` + +这里这个start是来记录了之前一次数组的长度,temp_size记住目前数组的长度,然后用这个来达到去重的目的,非常聪明 + diff --git "a/\347\273\204\345\220\210\351\227\256\351\242\230.md" "b/\347\273\204\345\220\210\351\227\256\351\242\230.md" new file mode 100644 index 000000000..33f295e82 --- /dev/null +++ "b/\347\273\204\345\220\210\351\227\256\351\242\230.md" @@ -0,0 +1,84 @@ +### 组合问题 + + +#### 77.Combinations + + +##### 会超时的recursion + + + +``` +class Solution(object): + def combine(self, n, k): + """ + :type n: int + :type k: int + :rtype: List[List[int]] + """ + ans = [] + self.dfs(n, k, 1, [], ans) + return ans + + def dfs(self, n, k ,start, lst, ans): + if k == 0 : + ans.append(lst) + return + for i in range(start, n+1): + self.dfs(n, k - 1, i + 1,lst +[i], ans) +``` + +理解方式 + +``` + + 1 2 3 + 12 13 14 23 24 34 +``` + +可以参照这里 + + + + + +##### 市面上流行解法 + +递归的思想: n选k + +- 如果 k==n ,则全选。 +- n > k 又可以分成两类: + - 选了n, 则在余下的n-1中选k-1 + - 没有选n, 则在余下的n-1中选k + +注意一下会有两个base case,因为k在不断减小和n在不断减小,所以写起来可以这样: + + +``` +def combine(n,k): + if k == 1: + return [[i+1] for i in range(n)] + if n == k: + return [range(1, k+1)] + # choose n , not choose n + return [r + [n] for r in combine(n-1,k-1)] + combine(n-1,k) + + +print combine(20,16) +``` + + +#### 39. Combination Sum + + +使用正常递归思路 + + +#### 40. Combination Sum II + +重复做跳过处理 + +#### 216. Combination Sum III + + +#### 377. Combination Sum IV diff --git "a/\351\200\222\345\275\222_recursion.md" "b/\351\200\222\345\275\222_recursion.md" new file mode 100644 index 000000000..413872965 --- /dev/null +++ "b/\351\200\222\345\275\222_recursion.md" @@ -0,0 +1,39 @@ +#递归 Recursion + +### 递归 + +递归绝对是一个非常重要的概念。比如安利? 不断的delegate,本来想要完成1000个人的销售,找10个人,每人完成100人的,这10个人每人再去找10个人,每人完成10人的销售,这样就完成了1000人的销售(不懂安利是否这样,拿来举例)。 + + +递归之所以重要,这里面存在的概念太多了,首先上面这个例子里面就有divide and conquer的意思,把task divide小,然后来解决它。 + + +同样有趣的例子 → 吃完一个bowl of chips: + +- for loop,知道多少薯片,然后从0开始吃到最后 +- while, while 碗里还有薯片,就吃 +- 递归,吃一片,然后继续吃剩下的 N - 1 片,直到碗里的薯片数量只剩下0片了 + + +典型的例子: + +- pow(x,n) +- isPalindrome +- TowerofHanoi +- binarySearch + + + +### 链表, 树, 图 + +链表(linked list) 是数据结构的基础,而链表本身就是具有递归特性的,看C++中对于linked list node的定义, next指向本身这样的结构,就是再这个node定义还未完成之时,我们已经指向自己。 + + +``` +struct node{ + int data; + node* next; +}; +``` + +binary tree定义就是靠递归来实现的。 From eb7d9bfeccf443b95ceab7734c8afd02380f4ec9 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 1 Oct 2017 07:25:26 -0500 Subject: [PATCH 002/473] add .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..5509140f2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.DS_Store From 0d086a4c91771e0f2b9ed9e894517ac8fe42b479 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 1 Oct 2017 07:28:58 -0500 Subject: [PATCH 003/473] add .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5509140f2..c288fcde3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -*.DS_Store +# *.DS_Store From 9e6b59e0fa4946c4139d8090df948d3414dda2b9 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 1 Oct 2017 07:37:11 -0500 Subject: [PATCH 004/473] add .gitignore --- .DS_Store | Bin 6148 -> 28676 bytes .gitconfig | 7 +++++++ .gitignore | 1 - .gitignore_global | 25 +++++++++++++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 .gitconfig delete mode 100644 .gitignore create mode 100644 .gitignore_global diff --git a/.DS_Store b/.DS_Store index b9081167bec57b03803a6eb35b4bd974f4f5755a..e92deb31688ce3b5de2b93544199cc43d1557614 100644 GIT binary patch literal 28676 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 literal 6148 zcmeHK&1%~~5T141MkbW{5J--DDdgaSOiJBS0>VxXfgD0q+Cx(kDH63n)dpLRNgM~g zM)F2^f<8|B?T_6Sx6oWnTV`PP8_mwlqHo2nhKNLWl(dPOMC3s=)*2XoA$nfxg4CR6 z1t?679w|yFrRUUJh-Sy%$bjCvbvnSFrBq_qzVF`w9Z`s#Jfus^^f6QH=jtrZRg4_{ z!MuTPeKi8>0d?Z>@Z8n8kI(aLSo;1KQCq1$dc5j28eZdx_c83Naacy>XxNPgAIwvh zq_MN#DwWUeD1MivKsO8AGv0slji1R((zxl ze0epwp5EM=S0sTC-N;jiGq{8C$3$L)gCbYO zC*;iP&FU~R1Iz$3umlF&(c`TxVJ%*Q8DIwfEe7=YAfXxqhm}QhbYL(o0I&|X5!m|I zQ0GX8fy2roW+1|*0&S{rErzh^@JkmLIIJw%bP}%l5N>7RIuv16M}29+Ndy*oWCoal zpBd1-AEc@8|GnS$|0akBW`G&^KN%49-Eg;ycXM~^!dvRQRzgpqT6A1xah?LhT*Zjh dSMes)2>enTz`$W;5grKt2pAf8U Date: Sun, 1 Oct 2017 07:40:52 -0500 Subject: [PATCH 005/473] add .gitignore --- .DS_Store | Bin 28676 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index e92deb31688ce3b5de2b93544199cc43d1557614..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28676 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 From b9f34da35c3a7991366fa76a9bf3a1f3b3f614b8 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 1 Oct 2017 07:41:37 -0500 Subject: [PATCH 006/473] add .gitignore --- .gitconfig | 7 ------- .gitignore_global | 25 ------------------------- 2 files changed, 32 deletions(-) delete mode 100644 .gitconfig delete mode 100644 .gitignore_global diff --git a/.gitconfig b/.gitconfig deleted file mode 100644 index 2afdd8b4e..000000000 --- a/.gitconfig +++ /dev/null @@ -1,7 +0,0 @@ -[user] -name = Keqi Huang -email = keqih@smu.edu -[push] -default = matching -[core] -excludesfile =/Users/lisanaaa/Documents/GitHub/lc/.gitignore diff --git a/.gitignore_global b/.gitignore_global deleted file mode 100644 index 8040a71fb..000000000 --- a/.gitignore_global +++ /dev/null @@ -1,25 +0,0 @@ -# .gitignore_global -#################################### -######## OS generated files ######## -#################################### -.DS_Store -.DS_Store? -*.swp -._* -.Spotlight-V100 -.Trashes -Icon? -ehthumbs.db -Thumbs.db -#################################### -############# packages ############# -#################################### -*.7z -*.dmg -*.gz -*.iso -*.jar -*.rar -*.tar -*.zip - From 957cfa8c97bd45e892d92eaac724777026519197 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 12 Oct 2017 02:44:01 -0500 Subject: [PATCH 007/473] java change of types --- 001._two_sum.md | 62 ++-- ..._substring_without_repeating_characters.md | 81 +++-- 004._median_of_two_sorted_arrays.md | 308 +++++++++--------- 005._longest_palindromic_substring.md | 294 +++++++++-------- 007._Reverse_Integer.md | 60 ++++ 015._3sum.md | 174 +++++----- 038._Count_and_Say.md | 99 ++++++ ...mbing Stairs.md => 070. Climbing Stairs.md | 0 230._kth_smallest_element_in_a_bst.md | 62 ++-- 237._delete_node_in_a_linked_list.md | 70 ++-- 316._Remove_Duplicate_Letters.md | 46 +++ 319._Bulb_Switcher.md | 72 ++++ ..._Unique_Substrings_in_Wraparound_String.md | 42 +++ 647._Palindromic_Substrings.md | 64 ++++ 672._Bulb_Switcher_II.md | 70 ++++ 682._Baseball_Game.md | 37 +++ ...h \344\270\215\346\230\223\345\206\231.md" | 12 +- ...13\347\232\204\350\275\254\346\215\242.md" | 239 ++++++++++++++ "LinkedList\346\212\200\345\267\247.md" | 12 +- Readme.md | 6 +- 20 files changed, 1311 insertions(+), 499 deletions(-) create mode 100644 007._Reverse_Integer.md create mode 100644 038._Count_and_Say.md rename 70. Climbing Stairs.md => 070. Climbing Stairs.md (100%) create mode 100644 316._Remove_Duplicate_Letters.md create mode 100644 319._Bulb_Switcher.md create mode 100644 467._Unique_Substrings_in_Wraparound_String.md create mode 100644 647._Palindromic_Substrings.md create mode 100644 672._Bulb_Switcher_II.md create mode 100644 682._Baseball_Game.md create mode 100644 "Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" diff --git a/001._two_sum.md b/001._two_sum.md index ab93b9bdf..fdec21f60 100644 --- a/001._two_sum.md +++ b/001._two_sum.md @@ -1,30 +1,30 @@ -###1. Two Sum - -题目: - - - -难度: - -Easy - - -思路 - -可以用O(n^2) loop - -但是也可以牺牲空间换取时间,异常聪明的AC解法 - -``` - 2 7 11 15 - 不存在 存在之中 -lookup {2:0} [0,1] -``` - -一点字典有了这个 `target - 当前数字`,找到它的index和当前index一起返回。 - - -``` +###1. Two Sum + +题目: + + + +难度: + +Easy + + +思路 + +可以用O(n^2) loop + +但是也可以牺牲空间换取时间,异常聪明的AC解法 + +``` + 2 7 11 15 + 不存在 存在之中 +lookup {2:0} [0,1] +``` + +一但字典内有了这个 `target - 当前数字`,找到它的index和当前index一起返回。 + + +``` class Solution(object): def twoSum(self, nums, target): """ @@ -37,7 +37,7 @@ class Solution(object): if target - num in lookup: return [lookup[target - num],i] lookup[num] = i - return [] -``` - - + return [] +``` + + diff --git a/003._longest_substring_without_repeating_characters.md b/003._longest_substring_without_repeating_characters.md index 74e95c8ce..08ede7eaa 100644 --- a/003._longest_substring_without_repeating_characters.md +++ b/003._longest_substring_without_repeating_characters.md @@ -15,42 +15,71 @@ Medium 粗一看是dp,细一看是greedy +我们先从第一个字符开始,只要碰到已经出现过的字符我们就必须从之前出现该字符的index开始重新往后看。 - idx 0 1 2 3 4 5 6 7 - a b c a b c b b - rnd ↑ stop↑ - ↑ stop↑ - ↑ stop↑ +例如‘xyzxlkjh’,当看到第二个‘x’时我们就应该从y开始重新往后看了。 +那么怎么判断字符已经出现过了呢?我们使用一个hashmap,将每一个已经阅读过的字符作为键,而它的值就是它在原字符串中的index,如果我们现在的字符不在hashmap里面我们就把它加进hashmap中去,因此,只要目前的这个字符在该hashmap中的值大于等于了这一轮字符串的首字符,就说明它已经出现过了,我们就将首字符的index加1,即从后一位又重新开始读,然后比较目前的子串长度与之前的最大长度,取大者。 -因为其实只要每次记录下重复开始的位置,就可以解决问题。 +### 程序变量解释 +- l(字母L) 代表目前最大子串的长度 +- start 是这一轮未重复子串首字母的index +- maps 放置每一个字符的index,如果maps.get(s[i], -1)大于等于start的话,就说明字符重复了,此时就要重置 l(字母L) 和start的值了, -注意最后还有一个 n - start 和 l 来比较,这相当于是最后一个round +最后还要进行一次比较,因为最后一次没有比较,即 n - start 和 l (字母L) 的比较,这是最后一个round -如果当前重复的这个s[i]取值是限定大于start,就是在start之后再出现重复 -``` +```python +python class Solution(object): - def lengthOfLongestSubstring(self, s): - """ - :type s: str - :rtype: int - """ - n = len(s) - l = 0 - maps = {} - start = 0 - - for i in range(n): - if maps.get(s[i],-1) >= start: - l = max(i - start, l) - start = maps.get(s[i]) + 1 - print start - maps[s[i]] = i - return max(n - start, l) + def lengthOfLongestSubstring(self, s): + """ + :type s: str + :rtype: int + """ + l, start, n = 0, 0, len(s) + maps = {} + for i in range(n): + if maps.get(s[i], -1) >= start: + l = max(l, i - start) + start = maps.get(s[i]) + 1 + maps[s[i]] = i + return max(l, n - start) +``` + +```java +java +class Solution { + public int lengthOfLongestSubstring(String s) { + HashMap map = new HashMap(); + int l= 0; + int start = 0; + int n = s.length(); + for (int i = 0; i < n; i++){ + if(returnDef(map, s.charAt(i)) >= start){ + l = Math.max(l, i-start); + start = map.get(s.charAt(i)) + 1; + } + map.put(s.charAt(i), i); + } + return Math.max(n-start,l); + } + public int returnDef(HashMap map, Character c){ + if (map.get(c) == null){ + return -1; + } + return map.get(c); + } +} ``` + +Author: Keqi Huang + +If you like it, please spread your support + +![Support](https://github.com/Lisanaaa/myTODOs/blob/master/WechatIMG17.jpeg) diff --git a/004._median_of_two_sorted_arrays.md b/004._median_of_two_sorted_arrays.md index 32f419e3a..8714c2abf 100644 --- a/004._median_of_two_sorted_arrays.md +++ b/004._median_of_two_sorted_arrays.md @@ -1,151 +1,157 @@ -###4. Median of Two Sorted Arrays - -题目: - - - -难度: - -Hard - - -一看到的时候,觉得跟CLRS书上的一道习题类似 -求X[1....n] Y[1....n] 的 median - -习题 9.3-8 - - -Let X[1..n] and Y [1..n] be two arrays, each containing n numbers already in sorted order. Give an O(lg n)-time algorithn to find the median of all 2n elements in arrays X and Y . - - -> The median can be obtained recursively as follows. Pick the median of the sorted array A. This is just O(1) time as median is the n/2th element in the sorted array. Now compare the median of A, call is a∗ with median of B, b∗. We have two cases. - - a∗ < b∗ : In this case, the elements in B[n/2 ···n] are also greater than a . So the median cannot lie in either A[1 · · · n/2 ] or B[n/2 · · · n]. So we can just throw these away and recursively - - a∗ > b∗ : In this case, we can still throw away B[1··· n/2] and also A[ n/ · · · n] and solve a smaller subproblem recursively. - In either case, our subproblem size reduces by a factor of half and we spend only constant time to compare the medians of A and B. So the recurrence relation would be T (n) = T (n/2) + O(1) which has a solution T (n) = O(log n). -divide and conquer - -- 如果X[n/2] == Y[n/2],则找到,return -- 如果X[n/2] < Y[n/2],找X[n/2+1….n]和Y[1,2…n/2]之间 -- 否则找X[1..n/2]和Y[n/2…n] - - - - -但是实际上不同,这里需要考虑的问题更多: - -- 两个数组长度不一样 -- 并不是只找一个median,如果median有两个,需要算平均 - -思路 - -把它转化成经典的findKth问题 - -参考: - - -首先转成求A和B数组中第k小的数的问题, 然后用k/2在A和B中分别找。 - - -比如k = 6, 分别看A和B中的第3个数, 已知 A1 < A2 < A3 < A4 < A5... 和 B1 < B2 < B3 < B4 < B5..., 如果A3 <= B3, 那么第6小的数肯定不会是A1, A2, A3, 因为最多有两个数小于A1, 三个数小于A2, 四个数小于A3。 关键点是从 k/2 开始来找。 - - - -B3至少大于5个数, 所以第6小的数有可能是B1 (A1 < A2 < A3 < A4 < A5 < B1), 有可能是B2 (A1 < A2 < A3 < B1 < A4 < B2), 有可能是B3 (A1 < A2 < A3 < B1 < B2 < B3)。那就可以排除掉A1, A2, A3, 转成求A4, A5, ... B1, B2, B3, ...这些数中第3小的数的问题, k就被减半了。每次都假设A的元素个数少, pa = min(k/2, lenA)的结果可能导致k == 1或A空, 这两种情况都是终止条件。 - - -发问,为什么要从k/2开始寻找,依旧k = 6, 我可以比较A1 和 B5的关系么,可以这样做,但是明显的问题出现在如果A1 > B5,那么这个第6小的数应该存在于B6和A1中。 - -如果A1 < B5,这个时间可能性就很多了,比如A1 < A2 < A3 < A4 < B1 < B2,各种可能,无法排除元素,所以还是要从k/2开始寻找。 - -这个跟习题算法的区别是每次扔的东西明显少一些,但是k也在不断变小。 - - -``` -class Solution(object): - def findMedianSortedArrays(self, nums1, nums2): - """ - :type nums1: List[int] - :type nums2: List[int] - :rtype: float - """ - n = len(nums1) + len(nums2) - if n % 2 == 1: - return self.findKth(nums1, nums2, n / 2 + 1) - else: - smaller = self.findKth(nums1, nums2, n / 2) - bigger = self.findKth(nums1, nums2, n / 2 + 1) - return (smaller + bigger) / 2.0 - - - def findKth(self, A, B, k): - if len(A) == 0: - return B[k-1] - if len(B) == 0: - return A[k-1] - if k == 1 : - return min(A[0],B[0]) - - - a = A[ k / 2 - 1 ] if len(A) >= k / 2 else None - b = B[ k / 2 - 1 ] if len(B) >= k / 2 else None - - if b is None or (a is not None and a < b): - return self.findKth(A[k/2:], B, k - k/2) - return self.findKth(A, B[k/2:],k - k/2) - -``` - -这个findKth的算法单独抽出来也是题目。 - -给定两个已经排序好的数组,求第k大的,算法有O(m+n).类似merge sort的原理。否则利用的就是之上提到的,利用已经有序的原理,然后每次丢。 - -之所以这里还有一个丢弃条件是b is None 丢A的一部分,是因为B的数组长度是有限的,这个时候很明显丢A的k/2是不影响的,因为无论B[-1]是如何大或者小,因为整个B的长度没有达到k/2,所以丢掉的这部分最大的A[k/2-1]也不可能是第k个,因为即使整个B都比A[k/2-1],拼起来也不能使A[k/2-1]第k大,所以可以放心丢弃。 - - -这里是两个sorted list/array findKth,想到了类似的题目,如果给一个n个linked list,findKth,能想到的办法也只能是用heap吧,类似merge k sorted lists. - - -再写一个O(m+n)类似merge sort的也可以AC的代码 - -``` -class Solution(object): - def findMedianSortedArrays(self, nums1, nums2): - """ - :type nums1: List[int] - :type nums2: List[int] - :rtype: float - """ - def findKth(A, pa, B, pb, k): - res = 0 - m = 0 - while pa < len(A) and pb < len(B) and m < k: - if A[pa] < B[pb]: - res = A[pa] - m += 1 - pa += 1 - else: - res = B[pb] - m += 1 - pb += 1 - - while pa < len(A) and m < k: - res = A[pa] - pa += 1 - m += 1 - - - while pb < len(B) and m < k: - res = B[pb] - pb += 1 - m += 1 - return res - - n = len(nums1) + len(nums2) - if n % 2 == 1: - return findKth(nums1,0, nums2,0, n / 2 + 1) - else: - smaller = findKth(nums1,0, nums2,0, n / 2) - bigger = findKth(nums1,0, nums2,0, n / 2 + 1) - return (smaller + bigger) / 2.0 - -``` \ No newline at end of file +###4. Median of Two Sorted Arrays + +题目: + + + +难度: + +Hard + + +一看到的时候,觉得跟CLRS书上的一道习题类似 +求X[1....n] Y[1....n] 的 median + +习题 9.3-8 + + +Let X[1..n] and Y [1..n] be two arrays, each containing n numbers already in sorted order. Give an O(lg n)-time algorithn to find the median of all 2n elements in arrays X and Y . + + +> The median can be obtained recursively as follows. Pick the median of the sorted array A. This is just O(1) time as median is the n/2th element in the sorted array. Now compare the median of A, call is a∗ with median of B, b∗. We have two cases. + +- a∗ < b∗ : In this case, the elements in B[n/2 ···n] are also greater than a . So the median cannot lie in either A[1 · · · n/2 ] or B[n/2 · · · n]. So we can just throw these away and recursively + +- a∗ > b∗ : In this case, we can still throw away B[1··· n/2] and also A[ n/ · · · n] and solve a smaller subproblem recursively. + + +In either case, our subproblem size reduces by a factor of half and we spend only constant time to compare the medians of A and B. So the recurrence relation would be T (n) = T (n/2) + O(1) which has a solution T (n) = O(log n). + + +divide and conquer + +- 如果X[n/2] == Y[n/2],则找到,return +- 如果X[n/2] < Y[n/2],找X[n/2+1….n]和Y[1,2…n/2]之间 +- 否则找X[1..n/2]和Y[n/2…n] + + + + +但是实际上不同,这里需要考虑的问题更多: + +- 两个数组长度不一样 +- 并不是只找一个median,如果median有两个,需要算平均 + +思路 + +把它转化成经典的findKth问题 + +参考: + + +首先转成求A和B数组中第k小的数的问题, 然后用k/2在A和B中分别找。 + + +比如k = 6, 分别看A和B中的第3个数, 已知 A1 < A2 < A3 < A4 < A5... 和 B1 < B2 < B3 < B4 < B5..., 如果A3 <= B3, 那么第6小的数肯定不会是A1, A2, A3, 因为最多有两个数小于A1, 三个数小于A2, 四个数小于A3。 关键点是从 k/2 开始来找。 + + + +B3至少大于5个数, 所以第6小的数有可能是B1 (A1 < A2 < A3 < A4 < A5 < B1), 有可能是B2 (A1 < A2 < A3 < B1 < A4 < B2), 有可能是B3 (A1 < A2 < A3 < B1 < B2 < B3)。那就可以排除掉A1, A2, A3, 转成求A4, A5, ... B1, B2, B3, ...这些数中第3小的数的问题, k就被减半了。每次都假设A的元素个数少, pa = min(k/2, lenA)的结果可能导致k == 1或A空, 这两种情况都是终止条件。 + + +发问,为什么要从k/2开始寻找,依旧k = 6, 我可以比较A1 和 B5的关系么,可以这样做,但是明显的问题出现在如果A1 > B5,那么这个第6小的数应该存在于B6和A1中。 + +如果A1 < B5,这个时间可能性就很多了,比如A1 < A2 < A3 < A4 < B1 < B2,各种可能,无法排除元素,所以还是要从k/2开始寻找。 + +这个跟习题算法的区别是每次扔的东西明显少一些,但是k也在不断变小。下面的代码的时间复杂度是O(lg(m+n)) + + +```python +class Solution(object): + def findMedianSortedArrays(self, nums1, nums2): + """ + :type nums1: List[int] + :type nums2: List[int] + :rtype: float + """ + n = len(nums1) + len(nums2) + if n % 2 == 1: + return self.findKth(nums1, nums2, n / 2 + 1) + else: + smaller = self.findKth(nums1, nums2, n / 2) + bigger = self.findKth(nums1, nums2, n / 2 + 1) + return (smaller + bigger) / 2.0 + + + def findKth(self, A, B, k): + if len(A) == 0: + return B[k-1] + if len(B) == 0: + return A[k-1] + if k == 1 : + return min(A[0],B[0]) + + + a = A[ k / 2 - 1 ] if len(A) >= k / 2 else None + b = B[ k / 2 - 1 ] if len(B) >= k / 2 else None + + if b is None or (a is not None and a < b): + return self.findKth(A[k/2:], B, k - k/2) +   return self.findKth(A, B[k/2:],k - k/2) //这里要注意:因为 k/2 不一定 等于 (k - k/2) + +``` + +这个findKth的算法单独抽出来也是题目。 + +给定两个已经排序好的数组,求第k大的,算法有O(m+n).类似merge sort的原理。否则利用的就是之上提到的,利用已经有序的原理,然后每次丢。 + +之所以这里还有一个丢弃条件是b is None 丢A的一部分,是因为B的数组长度是有限的,这个时候很明显丢A的k/2是不影响的,因为无论B[-1]是如何大或者小,因为整个B的长度没有达到k/2,所以丢掉的这部分最大的A[k/2-1]也不可能是第k个,因为即使整个B都比A[k/2-1],拼起来也不能使A[k/2-1]第k大,所以可以放心丢弃。 + + +这里是两个sorted list/array findKth,想到了类似的题目,如果给一个n个linked list,findKth,能想到的办法也只能是用heap吧,类似merge k sorted lists. + + +再写一个O(m+n)类似merge sort的也可以AC的代码 + +```python +class Solution(object): + def findMedianSortedArrays(self, nums1, nums2): + """ + :type nums1: List[int] + :type nums2: List[int] + :rtype: float + """ + def findKth(A, pa, B, pb, k): + res = 0 + m = 0 + while pa < len(A) and pb < len(B) and m < k: + if A[pa] < B[pb]: + res = A[pa] + m += 1 + pa += 1 + else: + res = B[pb] + m += 1 + pb += 1 + + while pa < len(A) and m < k: + res = A[pa] + pa += 1 + m += 1 + + + while pb < len(B) and m < k: + res = B[pb] + pb += 1 + m += 1 + return res + + n = len(nums1) + len(nums2) + if n % 2 == 1: + return findKth(nums1,0, nums2,0, n / 2 + 1) + else: + smaller = findKth(nums1,0, nums2,0, n / 2) + bigger = findKth(nums1,0, nums2,0, n / 2 + 1) + return (smaller + bigger) / 2.0 + +``` diff --git a/005._longest_palindromic_substring.md b/005._longest_palindromic_substring.md index b09aad051..da5949b7c 100644 --- a/005._longest_palindromic_substring.md +++ b/005._longest_palindromic_substring.md @@ -1,9 +1,8 @@ -###5. Longest Palindromic Substring - +5. Longest Palindromic Substring 题目: - +https://leetcode.com/problems/longest-palindromic-substring/ 难度: @@ -15,11 +14,12 @@ Medium 暴力解法绝对不行 - 思路1: 所以一个好的想法是 s 和 reverse(s) 共有的最长的 substring就是longest palindromic substring -> 问题转成求Longest common substring problem -参见[wikipedia](https://en.wikipedia.org/wiki/Longest_common_substring_problem) + +参见wikipedia + ,典型动归 LCSuff(S1...p, T1...q) = LCS(S1...p1, T1...q-1) if S[p] = T[q] else 0 @@ -28,58 +28,50 @@ LCSuff(S1...p, T1...q) = LCS(S1...p1, T1...q-1) if S[p] = T[q] else 0 伪码也有了,代码也有: - - +https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Longest_common_substring#Python_2 这样也超时? - -``` -class Solution(object): - def longestPalindrome(self, s): - """ - :type s: str - :rtype: str - """ - def lcs(s1, s2): - m = [[0] * (1 + len(s2)) for i in xrange(1 + len(s1))] - longest, x_longest = 0, 0 - for x in xrange(1, 1 + len(s1)): - for y in xrange(1, 1 + len(s2)): - if s1[x - 1] == s2[y - 1]: - m[x][y] = m[x - 1][y - 1] + 1 - if m[x][y] > longest: - longest = m[x][y] - x_longest = x - else: - m[x][y] = 0 - return s1[x_longest - longest: x_longest] - - return lcs(s, s[::-1]) -``` + class Solution(object): + def longestPalindrome(self, s): + """ + :type s: str + :rtype: str + """ + def lcs(s1, s2): + m = [[0] * (1 + len(s2)) for i in xrange(1 + len(s1))] + longest, x_longest = 0, 0 + for x in xrange(1, 1 + len(s1)): + for y in xrange(1, 1 + len(s2)): + if s1[x - 1] == s2[y - 1]: + m[x][y] = m[x - 1][y - 1] + 1 + if m[x][y] > longest: + longest = m[x][y] + x_longest = x + else: + m[x][y] = 0 + return s1[x_longest - longest: x_longest] + + return lcs(s, s[::-1]) 因为以为这样s[::-1]已经很快了. +这个方法是buggy的,看字符串abcxgcba,它reverse之后是abcgxcba,它们有公共字符串,但是这里面没有回文,修复方式是: -这个方法是buggy的,看字符串`abcxgcba`,它reverse之后是`abcgxcba`,它们有公共字符串,但是这里面没有回文,修复方式是: - -> we check if the substring’s indices are the same as the reversed substring’s original indices. If it is, then we attempt to update the longest palindrome found so far; if not, we skip this and find the next candidate. +we check if the substring’s indices are the same as the reversed substring’s original indices. If it is, then we attempt to update the longest palindrome found so far; if not, we skip this and find the next candidate. 我觉得的修复方式这样么: -``` -原本 翻转 -ABXYBA ABYXBA - -求出来的substring indices是 0:2 但是这个s1[0:2] 和 s2[0:2]一样,所以不行 -同理common substring indices还是s[4:6] 和s2[4:6]一样,不行 - -而比如ABAD和 DABA - -substring indice 一个是0:3, 一个是1:4,这样就没问题 - - -``` + 原本 翻转 + ABXYBA ABYXBA + + 求出来的substring indices是 0:2 但是这个s1[0:2] 和 s2[0:2]一样,所以不行 + 同理common substring indices还是s[4:6] 和s2[4:6]一样,不行 + + 而比如ABAD和 DABA + + substring indice 一个是0:3, 一个是1:4,这样就没问题 + @@ -87,107 +79,137 @@ substring indice 一个是0:3, 一个是1:4,这样就没问题 -> 依次把每一个字符当做回文字符串的中间字符,找到以该字符为中间字符的回文串的最大长度。分别对奇偶的情况进行讨论,接下来的关键就是对边界的把握,确保下标不要越界。当子串已经包含首字符或最后一个字符且此时还是回文串的时候,下标分别会向两边多移一位,需要补回来。 - -参考 +依次把每一个字符当做回文字符串的中间字符,找到以该字符为中间字符的回文串的最大长度。分别对奇偶的情况进行讨论,接下来的关键就是对边界的把握,确保下标不要越界。当子串已经包含首字符或最后一个字符且此时还是回文串的时候,下标分别会向两边多移一位,需要补回来。 + +参考https://shenjie1993.gitbooks.io/leetcode-python/content/005%20Longest%20Palindromic%20Substring.html + + class Solution(object): + def longestPalindrome(self, s): + """ + :type s: str + :rtype: str + """ + n = len(s) + + # empty or one char + if n < 2: + return s + + # left index of the target substring + l = 0 + # right index of the target substring + r = 0 + # length of the longest palindromic substring for now + m = 0 + # length of the current substring + c = 0 + + # Whether the substring contains the first character or last character and is palindromic + b = True + for i in range(n): + # Odd situation + for j in range(min(n-i,i+1)): + if s[i-j] != s [i+j]: + b = False + break + else: + c = 2 * j + 1 + + if c > m : + l = i - j + 1 - b + r = i + j + b + m = c + b = True + + # Even situation + for j in range(min(n - i - 1, i + 1)): + if (s[i - j] != s[i + j + 1]): + b = False + break + else: + c = 2 * j + 2 + if (c > m): + l = i - j + 1 - b + r = i + j + 1 + b + m = c + b = True + return s[l:r] +以上是参考版本,自己写的版本: -``` -class Solution(object): - def longestPalindrome(self, s): - """ - :type s: str - :rtype: str - """ - n = len(s) - - # empty or one char - if n < 2: - return s - - # left index of the target substring - l = 0 - # right index of the target substring - r = 0 - # length of the longest palindromic substring for now - m = 0 - # length of the current substring - c = 0 - - # Whether the substring contains the first character or last character and is palindromic - b = True - for i in range(n): - # Odd situation - for j in range(min(n-i,i+1)): - if s[i-j] != s [i+j]: - b = False - break - else: - c = 2 * j + 1 - - if c > m : - l = i - j + 1 - b - r = i + j + b - m = c - b = True + class Solution(object): + def longestPalindrome(self, s): + """ + :type s: str + :rtype: str + """ + n = len(s) + + m,l,r = 0,0,0 + + for i in range(n): + # odd case + for j in range(min(i+1,n-i)): + if s[i-j] != s[i+j]: + break + if 2*j + 1 > m : + m = 2 * j + 1 + l = i-j + r = i+j + + + if i+1 < n and s[i] == s[i+1]: + for j in range(min(i+1,n-i-1)): + if s[i-j] != s[i+j+1]: + break + if 2 * j + 2 > m : + m = 2*j +2 + l = i-j + r = i+j+1 + + + return s[l:r+1] - # Even situation - for j in range(min(n - i - 1, i + 1)): - if (s[i - j] != s[i + j + 1]): - b = False - break - else: - c = 2 * j + 2 - if (c > m): - l = i - j + 1 - b - r = i + j + 1 + b - m = c - b = True - return s[l:r] -``` -以上是参考版本,自己写的版本: +思路3: -``` +[Manacher算法](https://www.felix021.com/blog/read.php?2040) +```python class Solution(object): def longestPalindrome(self, s): """ :type s: str :rtype: str """ - n = len(s) - - m,l,r = 0,0,0 - - for i in range(n): - # odd case - for j in range(min(i+1,n-i)): - if s[i-j] != s[i+j]: - break - if 2*j + 1 > m : - m = 2 * j + 1 - l = i-j - r = i+j - - - if i+1 < n and s[i] == s[i+1]: - for j in range(min(i+1,n-i-1)): - if s[i-j] != s[i+j+1]: - break - if 2 * j + 2 > m : - m = 2*j +2 - l = i-j - r = i+j+1 - - - return s[l:r+1] + def preProcess(s): + if not s: + return ['^', '$'] + T = ['^'] + for c in s: + T += ['#', c] + T += ['#', '$'] + return T + T = preProcess(s) + P = [0] * len(T) + id, mx = 0, 0 + for i in range(1,len(T) - 1): + j = 2*id - i + if mx > i: + P[i] = min(mx - i, P[j]) + else: + P[i] = 0 + while T[i+P[i]+1] == T[i-P[i]-1]: + P[i] += 1 + if (i + P[i]) > mx: + id, mx = i, i + P[i] + max_i = 0 + for i in range(1, len(T)-1): + if P[i] > P[max_i]: + max_i = i + start = (max_i - P[max_i] - 1) / 2 + return s[start : start + P[max_i]] ``` + - - -思路3: - -在查看wikipedia,有一个[Longest palindromic substring](https://en.wikipedia.org/wiki/Longest_palindromic_substring), 有一个Manacher算法,to be 学 - diff --git a/007._Reverse_Integer.md b/007._Reverse_Integer.md new file mode 100644 index 000000000..96060cc4f --- /dev/null +++ b/007._Reverse_Integer.md @@ -0,0 +1,60 @@ +###7. Reverse Integer + +题目: + + + +难度: + +Easy + + +思路 + +如果输入的是负数,就递归调用原函数,参数变成-x即可 +最后要处理overflow + + +```python +class Solution(object): + def reverse(self, x): + """ + :type x: int + :rtype: int + """ + if x < 0: + return -self.reverse(-x) + res = 0 + while x: + res = res * 10 + x % 10 + x /= 10 + return res if res <= 0x7fffffff else 0 +``` + +```python +class Solution(object): + def reverse2(self, x): + """ + :type x: int + :rtype: int + """ + if x < 0: + x = int(str(x)[::-1][-1] + str(x)[::-1][:-1]) + else: + x = int(str(x)[::-1]) + x = 0 if abs(x) > 0x7FFFFFFF else x + return x +``` +```python +class Solution(object): + def reverse3(self, x): + """ + :type x: int + :rtype: int + """ + s = cmp(x, 0) + r = int(`s * x`[::-1]) + return s * r * (r < 2 ** 31) +``` + + diff --git a/015._3sum.md b/015._3sum.md index c7ac15c01..7db404066 100644 --- a/015._3sum.md +++ b/015._3sum.md @@ -1,17 +1,17 @@ -###15. 3Sum - -题目: - - - -难度: - -Medium - - -第一想法,先把nums排序,用三个loop,无法AC - -``` +###15. 3Sum + +题目: + + + +难度: + +Medium + + +第一想法,先把nums排序,用三个loop,无法AC + +``` class Solution(object): def threeSum(self, nums): """ @@ -29,76 +29,76 @@ class Solution(object): if curRes not in res: res.append(curRes) - return res -``` - - -然后查了一下2sum,用2sum的花样,因为要排除重复以及输出是按照从小到大的输出: - - -``` -class Solution(object): - def threeSum(self, nums): - """ - :type nums: List[int] - :rtype: List[List[int]] - """ - def twoSum(nums, target): - """ - :type nums: List[int] - :type target: int - :rtype: List[int] - """ - lookup = {} - for num in nums: - if target - num in lookup: - if (-target ,target - num, num) not in res: - res.append((-target ,target - num, num)) - lookup[num] = target - num - - n = len(nums) - nums.sort() - res = [] - for i in range(n): - twoSum(nums[i+1:], 0-nums[i]) - return [list(i) for i in res] -``` - - -谷歌看别人的代码,思路非常清晰的,运行起来比直接调用 Two Sum快. - -清晰的思路: - -- 排序 -- 固定左边,如果左边重复,继续 -- 左右弄边界,去重,针对不同的左右边界情况处理 - - -``` -class Solution(object): - def threeSum(self, nums): - """ - :type nums: List[int] - :rtype: List[List[int]] - """ - n = len(nums) - nums.sort() - ans = [] - for i in range(n): - if i > 0 and nums[i] == nums[i-1] : continue - l, r = i+1, n -1 - while l < r: - temp = nums[i] + nums[l] + nums[r] - if temp == 0: - ans.append([nums[i],nums[l],nums[r]]) - l += 1 - r -= 1 - while l < r and nums[l] == nums[l-1]: l += 1 - while l < r and nums[r] == nums[r+1]: r -= 1 - elif temp > 0: - r -= 1 - else: - l += 1 - return ans -``` - + return res +``` + + +然后查了一下2sum,用2sum的花样,因为要排除重复以及输出是按照从小到大的输出: + + +``` +class Solution(object): + def threeSum(self, nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + def twoSum(nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: List[int] + """ + lookup = {} + for num in nums: + if target - num in lookup: + if (-target ,target - num, num) not in res: + res.append((-target ,target - num, num)) + lookup[num] = target - num + + n = len(nums) + nums.sort() + res = [] + for i in range(n): + twoSum(nums[i+1:], 0-nums[i]) + return [list(i) for i in res] +``` + + +谷歌看别人的代码,思路非常清晰的,运行起来比直接调用 Two Sum快. + +清晰的思路: + +- 排序 +- 固定左边,如果左边重复,继续 +- 左右弄边界,去重,针对不同的左右边界情况处理 + + +```python +class Solution(object): + def threeSum(self, nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + n = len(nums) + nums.sort() + ans = [] + for i in range(n): +            if i > 0 and nums[i] == nums[i-1] : continue   #因为i=0这个元素会直接往下执行 +            l, r = i+1, n -1 + while l < r: + temp = nums[i] + nums[l] + nums[r] + if temp == 0: + ans.append([nums[i],nums[l],nums[r]]) + l += 1 + r -= 1 + while l < r and nums[l] == nums[l-1]: l += 1 + while l < r and nums[r] == nums[r+1]: r -= 1 + elif temp > 0: + r -= 1 + else: + l += 1 + return ans +``` + diff --git a/038._Count_and_Say.md b/038._Count_and_Say.md new file mode 100644 index 000000000..ac4542b5b --- /dev/null +++ b/038._Count_and_Say.md @@ -0,0 +1,99 @@ +###38. Count and Say + +题目: + + + +难度: + +Easy + + +思路 + + +1. i代表字符下标,从0开始取值,也就是从第一个字符开始,因为要让i取到最后一个字符,并且后面还要进行i+1的操作,所以将原字符串随意加上一个‘*’字符防止溢出 +2. sum代表此时已经连续相同的字符个数 +3. res代表最终输出的字符串 + +- 只要i下标对应的字符等于下一个字符,则sum和i都加1,无限循环 +- 如果i下标对应的字符不等于下一个字符了,则res应该加上str(sum)和i下标对应的那个字符,并且i加1,sum复原回0 + +``` +Examples of nth sequence + + 1. 1 + 2. 11 + 3. 21 + 4. 1211 + 5. 111221 + 6. 312211 + 7. 13112221 + 8. 1113213211 + 9. 31131211131221 + 10. 13211311123113112211 + +``` +```python +解法1 +class Solution(object): + def countAndSay(self, n): + """ + :type n: int + :rtype: str + """ + if n == 1: + return '1' + s = self.countAndSay(n-1) + '*' + res = '' + i, sum = 0, 1 + while i < len(s) - 1: + if s[i] == s[i+1]: + sum += 1 + else: + res += (str(sum) + s[i]) + sum = 1 + i += 1 + return res +``` +```python +解法2 +class Solution(object): + def countAndSay(self, n): + """ + :type n: int + :rtype: str + """ + res = '1' + for i in xrange(n-1): + res = ''.join([str(len(list(group))) + digit for digit, group in itertools.groupby(res)]) + return res +``` + +```java +解法3 +class Solution { + public String countAndSay(int n) { + if(n == 1){ + return "1"; + } + //递归调用,然后对字符串处理 + String str = countAndSay(n-1) + "*";//为了str末尾的标记,方便循环读数 + char[] c = str.toCharArray(); + int count = 1; + String s = ""; + for(int i = 0; i < c.length - 1;i++){ + if(c[i] == c[i+1]){ + count++;//计数增加 + }else{ + s = s + count + c[i];//上面的*标记这里方便统一处理 + count = 1;//初始化 + } + } + return s; + + } +} +``` + + diff --git a/70. Climbing Stairs.md b/070. Climbing Stairs.md similarity index 100% rename from 70. Climbing Stairs.md rename to 070. Climbing Stairs.md diff --git a/230._kth_smallest_element_in_a_bst.md b/230._kth_smallest_element_in_a_bst.md index 4068afd8a..c583cdca1 100644 --- a/230._kth_smallest_element_in_a_bst.md +++ b/230._kth_smallest_element_in_a_bst.md @@ -1,19 +1,19 @@ -###230. Kth Smallest Element in a BST - -题目: - - - -难度: -Medium - - -跟昨天做的一道题类似,一上来就走取巧之路。 - -InOrder排序,输出,当然也完全可以用昨天的binary tree iterator,入stack,出stack,知道输出第k位 - - -``` +###230. Kth Smallest Element in a BST + +题目: + + + +难度: +Medium + + +跟昨天做的一道题类似,一上来就走取巧之路。 + +InOrder排序,输出,当然也完全可以用昨天的binary tree iterator,入stack,出stack,直到输出第k位 + + +``` class Solution(object): def kthSmallest(self, root, k): """ @@ -31,18 +31,18 @@ class Solution(object): return self.inOrder(root.left) self.lst.append(root.val) - self.inOrder(root.right) -``` - - -现在看到kth 就条件反射的想用divide & conquer, 扫root的左子树看nodes量,如果nodes数量是k-1,那么node就刚好是第k个,如果大于k > 左子树数量,扫右子树,同时更新root为root.right。 - -看到的言论: - -> If we can change the BST node structure, We can add a new Integer to mark the number of element in the left sub-tree. - -when the node is not null. - -- if k == node.leftNum + 1, return node -- if k > node.leftNum + 1, make k -= node.leftNum + 1, and then node = node.right -- otherwise, node = node.left \ No newline at end of file + self.inOrder(root.right) +``` + + +现在看到kth 就条件反射的想用divide & conquer, 扫root的左子树看nodes量,如果nodes数量是k-1,那么node就刚好是第k个,如果大于k > 左子树数量,扫右子树,同时更新root为root.right。 + +看到的言论: + +> If we can change the BST node structure, We can add a new Integer to mark the number of element in the left sub-tree. + +when the node is not null. + +- if k == node.leftNum + 1, return node +- if k > node.leftNum + 1, make k -= node.leftNum + 1, and then node = node.right +- otherwise, node = node.left diff --git a/237._delete_node_in_a_linked_list.md b/237._delete_node_in_a_linked_list.md index 5e4a505ef..8c1ed5e28 100644 --- a/237._delete_node_in_a_linked_list.md +++ b/237._delete_node_in_a_linked_list.md @@ -1,26 +1,32 @@ -###237. Delete Node in a Linked List - -题目: - - - -难度: -Easy - - - -这道题,第一感觉,像删链表一样来删,把所有的node val前移一个,但是有个问题,为什么tail那个node还是存在?哼(ˉ(∞)ˉ)唧.. - -已经去提问,被解答: - - - - - -另外一个O(1)的办法更好,把后一个node的val移到待删这个节点,并且把node.next = node.next.next -很好理解,但是为嘛不对 - -``` +###237. Delete Node in a Linked List + +题目: + + + +难度: +Easy + + + +这道题,第一感觉,像删链表一样来删,把所有的node val前移一个,但是有个问题,为什么tail那个node还是存在?哼(ˉ(∞)ˉ)唧.. + +已经被解答: + + + + + +另外一个O(1)的办法更好,把后一个node的val移到待删这个节点,并且把node.next = node.next.next + +题目说了不会删最后一个点,所以node.next.next一定存在,所以直接让node的val等于它next的val,然后让node的next指向它的next的next,举个例子: + 1->2->3->4->5->None,要删除第四个节点,就让4变成5,然后让第四个节点指向第五个节点的next, +这样原来的第四个节点就不存在了,虽然原来的第五个节点仍然存在且指向None,变成了1->2->3->5->None-<5 + + + +```python +O(1)时间 class Solution(object): def deleteNode(self, node): """ @@ -28,5 +34,19 @@ class Solution(object): :rtype: void Do not return anything, modify node in-place instead. """ node.val = node.next.val - node.next = node.next.next -``` \ No newline at end of file + node.next = node.next.next +``` +```python +O(n)时间 +class Solution(object): + def deleteNode(self, node): + """ + :type node: ListNode + :rtype: void Do not return anything, modify node in-place instead. + """ + while node.next: + node.val = node.next.val + prev, node = node, node.next + # clear reference to tail + prev.next = None +``` diff --git a/316._Remove_Duplicate_Letters.md b/316._Remove_Duplicate_Letters.md new file mode 100644 index 000000000..ab7f8c6ff --- /dev/null +++ b/316._Remove_Duplicate_Letters.md @@ -0,0 +1,46 @@ +###316. Remove Duplicate Letters + +题目: + + + +难度: + +Hard + + +思路 + +这道题让我们移除重复字母,使得每个字符只能出现一次,而且结果要按最优的字母顺序排列,前提是不能打乱其原本的相对位置。 +- 先用remaining统计所有出现字母出现过的次数; +- res就是输出结果的字母顺序(list),最后用join连接起来作为返回值(str); +- 在stack(set)中的元素意味着其已经出现在最终结果中; + +对s中每个字母c,首先看它在stack中有没有出现过: +1. 如果没有那么只要res最后一个字母的ASCII值大于c,且其剩余次数大于0,就将其在res和stack中删去,不停做此操作 +2. 如果有了那么说明已经出现在最终结果中,只需要将其统计次数减去1以防后面挪动位置要做判断 + +做完这些后必须要把c加入到stack和res中去,代表c已经加入到最终结果中的目前应该处于的位置 + +``` +class Solution(object): + def removeDuplicateLetters(self, s): + """ + :type s: str + :rtype: str + """ + remaining = collections.defaultdict(int) + for c in s: + remaining[c] += 1 + stack, res = set(), [] + for c in s: + if c not in stack: + while res and res[-1] > c and remaining[res[-1]] > 0: + stack.remove(res.pop()) + stack.add(c) + res += c + remaining[c] -= 1 + return ''.join(res) +``` + + diff --git a/319._Bulb_Switcher.md b/319._Bulb_Switcher.md new file mode 100644 index 000000000..c39b68392 --- /dev/null +++ b/319._Bulb_Switcher.md @@ -0,0 +1,72 @@ +###319. Bulb Switcher + +题目: + + + +难度: + +Medium + + +思路 + +bulb代表第一轮结束后的所有灯亮灭的情况,从第二轮开始 +- 如果是最后一轮,则bulb的最后一个灯要switch +- 对于其他轮,相应的第i-1+C(i)个灯要siwitch,且C为常数,i-1+C(i)必须<=n-1 + +但是发现这样提交会超时 +Last executed input: +999999 + + +```python +class Solution(object): + def bulbSwitch(self, n): + """ + :type n: int + :rtype: int + """ + bulb = [1] * n + for i in range(2,n+1): + if i == n: + bulb[n-1] = 1 if bulb[n-1] == 0 else 0 + else: + for x in range(i-1, n, i): + bulb[x] = 1 if bulb[x] == 0 else 0 + return bulb.count(1) +``` + +原来,这是一道智商碾压题: + +> A bulb ends up on iff it is switched an odd number of times. +Bulb i is switched in round d iff d divides i. +So bulb i ends up on iff it has an odd number of >divisors. +Divisors come in pairs, like i=12 has divisors 1 and 12, 2 and 6, and 3 and 4. +Except if i is a >square, like 36 has divisors 1 and 36, 2 and 18, 3 and 12, 4 and 9, +and double divisor 6. So bulb >i ends up on iff and only if i is a square. So just count the square numbers. + +大概解释一下,当一个灯泡被执行偶数次switch操作时它是灭着的,当被执行奇数次switch操作时它是亮着的,那么这题就是要找出哪些编号的灯泡会被执行奇数次操作。 + +现在假如我们执行第i次操作,即从编号i开始对编号每次+i进行switch操作,对于这些灯来说, +如果其编号j(j=1,2,3,⋯,n)能够整除i,则编号j的灯需要执switch操作。 +具备这样性质的i是成对出现的,比如: +- 12 = 1 * 12, +- 12 = 2 * 6 +- 12 = 3 * 4 + +所以编号为12的灯,在第1次,第12次;第2次,第6次;第3次,第4次一定会被执行Switch操作,这样的话,编号为12的灯执行偶数次switch,肯定为灭。 +这样推出,完全平方数一定是亮着的,因为它有两个相同的因子,总因子数为奇数,如36 = 6 * 6,所以本题的关键在于找完全平方数的个数。 + +```python +class Solution(object): + def bulbSwitch(self, n): + """ + type n: int + rtype: int + """ + # The number of full squares. + return int(math.sqrt(n)) +``` + + diff --git a/467._Unique_Substrings_in_Wraparound_String.md b/467._Unique_Substrings_in_Wraparound_String.md new file mode 100644 index 000000000..a4d86d0ce --- /dev/null +++ b/467._Unique_Substrings_in_Wraparound_String.md @@ -0,0 +1,42 @@ +###467. Unique Substrings in Wraparound String + +题目: + + + +难度: + +Medium + + +思路 + +有个无限长的字符串s,是由无数个「abcdefghijklmnopqrstuvwxyz」组成的。现在给你一个字符串p,求多少个p的非空子串在s中出现了? +   + +先考虑s的特性,满足条件(在s中)的p的子串只可能是abcd……z的连续序列(z后面是a), 我们只需要处理p中连续的部分就可以了。但是 举个例子,h-k的序列出现了,a-z的序列也出现了,那么只需要计算a-z的子串个数就可以了,因为h-k已经包含在a-z里了。考虑所有包含的情况,似乎就变得复杂了,a-z还可能被包含在x-za-z中,甚至更长的序列中。 + +  但是如果考虑以某个字母结尾的子串个数,那么p中以该字母结尾的连续序列长度,就是满足条件的子串个数。如果以字母x结尾的连续序列有多个, 我们只需要最长的一个即可,因为其他短的序列都已经被长的包含进去了,例如'bcd'和'abcd',有了'abcd'就知道以d结尾的子串有4个,分别是‘d’,'cd','bcd','abcd',‘bcd’已经被包含进去了。最后求和,问题就解决了。 这样思考就非常简单了,代码也可以很容易写出来。 + + + +``` +class Solution(object): + def findSubstringInWraproundString(self, p): + """ + :type p: str + :rtype: int + """ +        letters = [0] * 26         #开始默认每个都是0 +        length = 0 + for i in xrange(len(p)): + curr = ord(p[i]) - ord('a') +            if i > 0 and ord(p[i-1]) != (curr-1)%26 + ord('a'):   #一旦开始不相等了就要将length重置为0 +                length = 0 +            length += 1     #否则就说明继续与前面一个字符是连续的,length要加1才行 +            if length > letters[curr]:     #length一直加,如果到i这个字符length比它的目前的最大连续子串长度还要长,那么肯定要更新letters +                letters[curr] = length + return sum(letters) +``` + + diff --git a/647._Palindromic_Substrings.md b/647._Palindromic_Substrings.md new file mode 100644 index 000000000..6b99a5d87 --- /dev/null +++ b/647._Palindromic_Substrings.md @@ -0,0 +1,64 @@ +###647. Palindromic Substrings + +题目: + + + +难度: + +Medium + + +思路 + +这道题要求给定一个字符串中的所有回文子串的个数,所以我想到了Manacher算法, +Manacher算法增加两个辅助变量id和mx,其中id表示最大回文子串中心的位置,mx则为id+P[id],也就是最大回文子串的边界。得到一个很重要的结论: + +- 如果mx > i,那么P[i] >= Min(P[2 * id - i], mx - i) + +下面,令j = 2*id - i,也就是说j是i关于id的对称点。 + +- 当 mx - i > P[j] 的时候,以S[j]为中心的回文子串包含在以S[id]为中心的回文子串中,由于i和j对称,以S[i]为中心的回文子串必然包含在以S[id]为中心的回文子串中,所以必有P[i] = P[j]; + +- 当 P[j] >= mx - i 的时候,以S[j]为中心的回文子串不一定完全包含于以S[id]为中心的回文子串中,但是基于对称性可知,下图中两个绿框所包围的部分是相同的,也就是说以S[i]为中心的回文子串,其向右至少会扩张到mx的位置,也就是说 P[i] >= mx - i。至于mx之后的部分是否对称,再具体匹配。 + +- 此外,对于 mx <= i 的情况,因为无法对 P[i]做更多的假设,只能让P[i] = 1,然后再去匹配。 + +最后,当P[i]等于1时,即以它为中心的回文子串就只有它自己的时候。但是其实这个字符本身也是一个回文子串,所以叠加的形式是count += (P[i]+1)/2 + + +```python +class Solution(object): + def countSubstrings(self, s): + """ + :type s: str + :rtype: str + """ + def preProcess(s): + if not s: + return ['^', '$'] + T = ['^'] + for c in s: + T += ['#', c] + T += ['#', '$'] + return T + T = preProcess(s) + P = [0] * len(T) + id, mx, count = 0, 0, 0 + for i in range(1,len(T) - 1): + j = 2*id - i + if mx > i: + P[i] = min(mx - i, P[j]) + else: + P[i] = 0 + while T[i+P[i]+1] == T[i-P[i]-1]: + P[i] += 1 + if (i + P[i]) > mx: + id, mx = i, i + P[i] + for i in range(len(P)): + count += (P[i]+1)/2 + return count +``` + + + diff --git a/672._Bulb_Switcher_II.md b/672._Bulb_Switcher_II.md new file mode 100644 index 000000000..08f5d0584 --- /dev/null +++ b/672._Bulb_Switcher_II.md @@ -0,0 +1,70 @@ +###672. Bulb Switcher II + +题目: + + + +难度: + +Medium + + +思路 + +这道题又是一个数学题。找规律呀找规律。 +我们只需要考虑当 n<=2 and m < 3 的特殊情形。因为当 n >2 and m >=3, 结果肯定是 8. +The four buttons: + +Flip all the lights. +Flip lights with even numbers. +Flip lights with odd numbers. +Flip lights with (3k + 1) numbers, k = 0, 1, 2, ... +如果我们使用了 button 1 和 2, 其效果等同于使用 button 3 。 +类似的.. + +1 + 2 --> 3, 1 + 3 --> 2, 2 + 3 --> 1 +所以,只有 8 种情形。 + +***All_on, 1, 2, 3, 4, 1+4, 2+4, 3+4*** + +并且当 n>2 and m>=3 时,我们就能够获得所有的情形。 + +| m\n | 0 | 1 | 2 | 3 | 4 | + --- | ---|--- |----|---|---| +| 0 | 1 | 1 | 1 | 1 | 8 | +| 1 | 1 | 2 | 3 | 4 | 8 | +| 2 | 1 | 2 | 4 | 7 | 8 | +| 3 | 8 | 8 | 8 | 8 | 8 | + +```python +class Solution(object): + def flipLights(self, n, m): + """ + :type n: int + :type m: int + :rtype: int + """ + if m * n == 0: return 1 + if n == 1: return 2 + if n == 2: return 4 - (m % 2) + if m == 1: return 4 + if m == 2: return 7 + return 8 +``` + +还有两位大佬的两行解法: +```python +class Solution(object): + def flipLights(self, n, m): + m, n = min(3, m), min(3, n) + return 1 if n * m == 0 else self.flipLights(n - 1, m) + self.flipLights( n - 1, m - 1) +``` +```python +class Solution(object): + def flipLights(self, n, m): + n = min(n, 3) + return min(1< + + +难度: + +Easy + + +思路 + +points用来存放每一次的分数,最后求和。 + + +```python +class Solution(object): + def calPoints(self, ops): + """ + :type ops: List[str] + :rtype: int + """ + points = [] + for i in ops: + if i == 'C': + points.pop() + elif i == 'D': + points.append(2 * points[-1]) + elif i == '+': + points.append(points[-1] + points[-2]) + else: + points.append(int(i)) + return sum(points) +``` + + diff --git "a/Binary Search \344\270\215\346\230\223\345\206\231.md" "b/Binary Search \344\270\215\346\230\223\345\206\231.md" index 0b07a1c98..9a09b8ac9 100644 --- "a/Binary Search \344\270\215\346\230\223\345\206\231.md" +++ "b/Binary Search \344\270\215\346\230\223\345\206\231.md" @@ -48,17 +48,17 @@ function Binary_Search(x, A, l, u) 或者这样,正确代码 -``` +```python def binarySearch(nums, target): l, r = 0, len(nums) -1 while l <= r: - mid = (l+r) / 2 - if nums[mid] == target: - return mid - elif nums[mid] > target: + mid = l + ((r-l) >> 2) + if nums[mid] > target: r = mid - 1 - else: + elif: l = mid + 1 + else: + return mid return -1 ``` diff --git "a/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" "b/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" new file mode 100644 index 000000000..c1d3e5522 --- /dev/null +++ "b/Java\345\220\204\347\247\215\347\261\273\345\236\213\347\232\204\350\275\254\346\215\242.md" @@ -0,0 +1,239 @@ +之前在写java程序的时候,经常会遇到很多的需要需要转换基础数据类型的情况,然后我就一直去记录这些情况,今天做了一下总结,当然转换的方法肯定不止我写的这些,有的我可能只会写其中的一种,以后再遇到其他的情况的话,我会慢慢来补充,希望这篇文章会对大家能有所帮助。 + +------ + +# String的转换 + +首先介绍一下String类型的转换,一般遇到的情况可能会有以下几种:Strng转int,String转long,String转byte数组,String转float,下面主要介绍这四种情况。 + +## String转int + +把String类型转换为int类型,常用的有以下三种方法: + +``` +public class StringToInt { + public static void main(String[] args) { + String number = "123456"; + int num1 = Integer.parseInt(number);//使用Integer的parseInt方法 + int num2 = new Integer(number);//强制转换 + int num3 = Integer.valueOf(number).intValue();//先转Integer类型,再调用intValue()转为int + } +} +``` + +## String转long + +把String类型转换为long类型的方法跟上面的方法类似。 + +``` +public class StringToLong { + public static void main(String[] args) { + String number = "1234567890"; + long num1 = Long.parseLong(number);//调用Long类型的parseLong方法 + long num2 = new Long(number);//强制转换 + long num3 = Long.valueOf(number).longValue();//先转换Long类型,再使用longValue方法转为long + } +} +``` + +## String转float + +把String类型转换为float类型的方法也跟上面的类似。 + +``` +public class StringToFloat { + public static void main(String[] args) { + String number = "1234.202"; + float num1 = Float.parseFloat(number);//调用Float的parseFloat方法 + float num2 = new Float(number);//强制转换 + float num3 = Float.valueOf(number).floatValue();//先转为Float类型再使用floatValue转为float + } +} +``` + +## String转byte[] + +String类型转byte数组方法一般使用String类自带的`getBytes()`方法。 + +``` +public class StringToByte { + public static void main(String[] args) { + byte[] num = new byte[200]; + String number = "1234567890"; + num = number.getBytes(); + } +} +``` + +这里补充一个path类型转换为String类型的方法: + +``` +String fileName=path.getFileName().toString(); +``` + +------ + +# long类型转换 + +long类型的转换,这一部分用的情况也很多,下面介绍几种常见的情况。 + +## long转String + +long类型转String类型,这里主要介绍三种方法: + +``` +public class LongToString { + public static void main(String[] args) { + long number = 1234567890l; + String num1 = Long.toString(number);//Long的tostring方法 + String num2 = String.valueOf(number);//使用String的valueOf方法 + String num3 = "" + number;//这个应该属于强制转换吧 + } +} +``` + +## long转int + +long类型转换为int类型,这里也主要介绍三种方法: + +``` +public class LongToInt { + public static void main(String[] args) { + long number = 121121121l; + int num1 = (int) number;// 强制类型转换 + int num2 = new Long(number).intValue();// 调用intValue方法 + int num3 = Integer.parseInt(String.valueOf(number));// 先把long转换位字符串String,然后转换为Integer + } +} +``` + +## long与byte数组的相互转换 + +一直都感觉byte数组转换比较繁琐,这里也不再叙述,我就给出一篇别人的博客让大家作为参考吧,这里面byte数组与多种数据类型的转换——[ java Byte和各数据类型(short,int,long,float,double)之间的转换](http://blog.csdn.net/cshichao/article/details/9813973) + +------ + +# int类型的转换 + +int类型的转换也是我们经常使用的情况,下面也主要介绍几种常见的情况。 + +## int转String + +int类型转换为String类型与long转String的类似,一般也有以下三种方法。 + +``` +public class IntToString { + public static void main(String[] args) { + int number = 121121; + String num1 = Integer.toString(number);//使用Integer的toString方法 + String num2 = String.valueOf(number);//使用String的valueOf方法 + String num3 = "" + number;//也是强制转换吧 + } +} +``` + +## int与Byte的相互转换 + +关于int类型与byte[]数组的转换,一般情况下,我们使用条件都是在这里转换过来,在另外一个地方就要转换回来,这里介绍两种int与byte数组互相转换的方式。 + +``` +//int类型转换为byte[]数组 +public static byte[] intToByteArray(int i) { + byte[] result = new byte[4]; + // 由高位到低位 + result[0] = (byte) ((i >> 24) & 0xFF); + result[1] = (byte) ((i >> 16) & 0xFF); + result[2] = (byte) ((i >> 8) & 0xFF); + result[3] = (byte) (i & 0xFF); + return result; +} + +//byte数组转换为int类型 +public static int byteArrayToInt(byte[] bytes) { + int value = 0; + // 由高位到低位 + for (int i = 0; i < 4; i++) { + int shift = (4 - 1 - i) * 8; + value += (bytes[i] & 0x000000FF) << shift;// 往高位游 + } + return value; +} +``` + +还有一种为: + +``` +//int类型转换为byte[]数组 +public static byte[] intToByteArray(int x) { + byte[] bb = new byte[4]; + bb[3] = (byte) (x >> 24); + bb[2] = (byte) (x >> 16); + bb[1] = (byte) (x >> 8); + bb[0] = (byte) (x >> 0); + return bb; +} + +//byte数组转换为int类型 +public static int byteArrayToInt(byte[] bb) { + return (int) ((((bb[3] & 0xff) << 24) | ((bb[2] & 0xff) << 16) | ((bb[1] & 0xff) << 8) | ((bb[0] & 0xff) << 0))); +} +``` + +## int转long + +int类型转换为long类型的情况并不是大多,这里主要接收几种转换方法: + +``` +public class IntToLong { + public static void main(String[] args) { + int number = 123111; + long num1 = (long) number;//强制 + long num2 = Long.parseLong(new Integer(number).toString());//先转String再进行转换 + long num3 = Long.valueOf(number); + } +} +``` + +## int转Interger + +int类型转换为Interger类型的情况,我是基本上每怎么遇到过,在这里也上网查询一些资料找到了两种方法。 + +``` +public class IntToInterge { + public static void main(String[] args) { + int number = 123456; + Integer num1 = Integer.valueOf(number); + Integer num2 = new Integer(number); + } +} +``` + +------ + +# byte数组的转换 + +关于byte数组的转换,上面有几个都是它们只见相互转换的,所以这里就不再介绍那么多,只介绍一个byte数组转换String类型的方法,其他的类型可以通过String类型再进行转换。 + +byte数组转String类型的方法经常用的可能就是下面这种方法。 + +``` +public class ByteToString { + public static void main(String[] args) { + byte[] number = "121121".getBytes(); + String num1 = new String(number); + } +} +``` + +------ + +最后简单补充以下Java基本数据类型的一些知识: + +| 类型 | 字节数 | 类名称 | 范围 | +| ------ | ---- | -------- | ---------------------------------------- | +| int | 4字节 | Interger | -2147483648 ~ 2147483647 | +| short | 2字节 | Short | -32768 ~ 32767 | +| long | 8字节 | Long | -9223372036854775808 ~ 9223372036854775807 | +| byte | 1字节 | Byte | -128 ~ 127 | +| float | 4字节 | Float | | +| double | 8字节 | Double | | \ No newline at end of file diff --git "a/LinkedList\346\212\200\345\267\247.md" "b/LinkedList\346\212\200\345\267\247.md" index 85cbfef68..677a083a2 100644 --- "a/LinkedList\346\212\200\345\267\247.md" +++ "b/LinkedList\346\212\200\345\267\247.md" @@ -1,4 +1,4 @@ -#LinkedList +# LinkedList 结点定义如下: @@ -11,14 +11,16 @@ 可以使用的技巧包括: -##Dummy head +## Dummy head 有的时候因为边界条件,需要判定是否是list的head,因为处理起来会有些不同,而创造一个dummy head则可以极大的解决一些问题。 - dummy = ListNode(-1) +``` + dummy = ListNode(-1) dummy.next = head +``` -##双指针 +## 双指针 - 19. Remove Nth Node From End of List @@ -78,7 +80,7 @@ class Solution(object): ``` -##寻找LinkedList中间项 +## 寻找LinkedList中间项 依旧使用双指针,快慢指针:快指针每次走两步,慢指针每次走一步,快指针如果到头了,那么慢指针也会在中间了,这个中间可以考量,如果是奇数的话必然是中间。 diff --git a/Readme.md b/Readme.md index 859d89797..18ccfc183 100644 --- a/Readme.md +++ b/Readme.md @@ -1,8 +1,12 @@ -### LeetCode × Python × CLRS +### Appreciation + +This repository is modified and added based on https://github.com/KrisYu/LeetCode-CLRS-Python, appreciate for his effort. +### LeetCode × Python × CLRS Finally, going to take LeetCode, Python can make you focus on the ideas, while CLRS is really kind of tedious, so whenever you finished some reading, you just, just would feel so happy that you can do LeetCode. + - 📚📖✏️📓 - 🍔🍝🍛🍣 - 😕😐😮😏 From 5681ba94dae77b8cca244affc171010cd09b2a6d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 14 Oct 2017 00:45:34 -0500 Subject: [PATCH 008/473] add 218 --- 218._The _Skyline_Problem .md | 133 ++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 218._The _Skyline_Problem .md diff --git a/218._The _Skyline_Problem .md b/218._The _Skyline_Problem .md new file mode 100644 index 000000000..8c80c5f24 --- /dev/null +++ b/218._The _Skyline_Problem .md @@ -0,0 +1,133 @@ +### 218. The Skyline Problem + +题目: + + + +难度: + +Hard + +思路 + +观察发现,skyline的points的横坐标一定是某个building的左边界或者右边界。 + +开始,假设只有2个建筑物,拿出第一个buiding B1,我们先把它的左上顶点加进我们的output结果skyline中,然后继续拿下一个building B2,我们现在需要将B2的左上顶点对应的x coordinate与B1的右上顶点所对应的x coordinate做比较: + +- 如果前者小且B2的高度大于B1的高度,则我们将B2的左上顶点也加入skyline中去。 +- 如果前者小且B2的高度小于于B1的高度,则忽略B2的左上顶点 + +接下来考虑更多建筑物的情况,从左到右扫描,当我们遇到一个楼的左边界时,把它push到一个heap中。如果后面扫描的楼的高度比heap中最高的楼还高,那么它的左上顶点一定会被加入到skyline中。当我们遇到一个building的右边界时,我们需要将其从heap中pop掉,如果heap中max height有变化,则push到结果中。 + + + +#### 程序代码解释 + +- liveBuildings代表(左上顶点已经被加入output中但右上顶点还没有做判断的building)的右上顶点的集合,形式为[(height, x-coordinate)…..] +- skyline是output +- 程序里面的这句代码```while idx < n and buildings[idx][0] == start:```是为了防止有左右坐标完全相同但是height不同的building的存在,it's not useless!!! +- python里面的heapq模块如果有不懂的同学可以看看这个文章:[heapq](http://blog.csdn.net/calling_wisdom/article/details/41676133) + + +```python +class Solution(object): + def getSkyline(self, buildings): + """ + :type buildings: List[List[int]] + :rtype: List[List[int]] + """ + idx, n = 0, len(buildings) + liveBuildings, skyline = [], [] + while idx < n or len(liveBuildings) > 0: + if len(liveBuildings) == 0 or (idx < n and buildings[idx][0] <= -liveBuildings[0][1]): + start = buildings[idx][0] + while idx < n and buildings[idx][0] == start: + heapq.heappush(liveBuildings, [-buildings[idx][2], -buildings[idx][1]]) + idx += 1 + else: + start = -liveBuildings[0][1] + while len(liveBuildings) > 0 and -liveBuildings[0][1] <= start: + heapq.heappop(liveBuildings) + height = len(liveBuildings) and -liveBuildings[0][0] + if len(skyline) == 0 or skyline[-1][1] != height: + skyline.append([start, height]) + return skyline +``` +#####另外还有一个超级6的大神的代码,但是今天我要赶报告,就只先贴代码了 + +```python +class Solution(object): + def getSkyline(self, buildings): + """ + :type buildings: List[List[int]] + :rtype: List[List[int]] + """ + events = sorted([(L, -H, R) for L, R, H in buildings] + list(set((R, 0, None) for L, R, H in buildings))) + #events = sorted(event for L, R, H in buildings for event in ((L, -H, R), (R, 0, None))) + res, hp = [[0, 0]], [(0, float("inf"))] + for x, negH, R in events: + while x >= hp[0][1]: + heapq.heappop(hp) + if negH: heapq.heappush(hp, (negH, R)) + if res[-1][1] + hp[0][0]: + res += [x, -hp[0][0]], + return res[1:] +``` + +```Java +public class Solution { + public List getSkyline(int[][] buildings) { + List result = new ArrayList(); + if (buildings == null || buildings.length == 0 || buildings[0].length == 0) { + return result; + } + + List heights = new ArrayList(); + for (int[] building : buildings) { + heights.add(new Height(building[0], -building[2])); + heights.add(new Height(building[1], building[2])); + } + Collections.sort(heights, new Comparator() { + @Override + public int compare(Height h1, Height h2) { + return h1.index != h2.index ? h1.index - h2.index : h1.height - h2.height; + } + }); + + PriorityQueue pq = new PriorityQueue(1000, Collections.reverseOrder()); + pq.offer(0); + int prev = 0; + for (Height h : heights) { + if (h.height < 0) { + pq.offer(-h.height); + } else { + pq.remove(h.height); + } + int cur = pq.peek(); + if (cur != prev) { + result.add(new int[]{h.index, cur}); + prev = cur; + } + } + + return result; + } + + class Height { + int index; + int height; + Height(int index, int height) { + this.index = index; + this.height = height; + } + } +} +``` + + + +Author: Keqi Huang + +If you like it, please spread your support + +![Support](https://github.com/Lisanaaa/myTODOs/blob/master/WechatIMG17.jpeg) From e369e806a4eb5abf08c095c938d74ae8e92d9074 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 17 Oct 2017 16:11:59 -0500 Subject: [PATCH 009/473] add 587 --- ..._substring_without_repeating_characters.md | 2 +- 141._linked_list_cycle.md | 184 ++++++++++-------- 587.-Erect-the-Fence .md | 101 ++++++++++ 3 files changed, 206 insertions(+), 81 deletions(-) create mode 100644 587.-Erect-the-Fence .md diff --git a/003._longest_substring_without_repeating_characters.md b/003._longest_substring_without_repeating_characters.md index 08ede7eaa..188a6c26d 100644 --- a/003._longest_substring_without_repeating_characters.md +++ b/003._longest_substring_without_repeating_characters.md @@ -1,4 +1,4 @@ -###3. Longest Substring Without Repeating Characters +### 3. Longest Substring Without Repeating Characters 题目: diff --git a/141._linked_list_cycle.md b/141._linked_list_cycle.md index e671e4942..2cf604e4e 100644 --- a/141._linked_list_cycle.md +++ b/141._linked_list_cycle.md @@ -1,81 +1,105 @@ -###141. Linked List Cycle - -题目: - - - - -难度: - -Easy - - -想法一: - -直接超时 - +### 141. Linked List Cycle + +题目: + + + + +难度: + +Easy + + +想法一: + +直接超时 + ``` -class Solution(object): - def hasCycle(self, head): - """ - :type head: ListNode - :rtype: bool - """ - if head == None: return False - lst = [] - cur = head - while cur: - if cur in lst: - return True - lst.append(cur) - cur = cur.next - return False -``` - - - -想法二:相当用boolean array记录某个点是否被访问过,时间,空间复杂度都是O(n) - -``` -class Solution(object): - def hasCycle(self, head): - """ - :type head: ListNode - :rtype: bool - """ - if head == None: return False - dictx = {} - cur = head - while cur: - if cur in dictx: - return True - dictx[cur] = 1 - cur = cur.next - return False -``` - -结果这种方法的run time还比较快 - -查了一下,有解答说可以有空间复杂度O(1),时间复杂度O(n)。两个指针,一个快一个慢,快的每次走两步,慢的每次走一步,如果有环,最终会在某处相遇。这也是一个算法。这种快慢指针配合已经不是第一次遇到了,比如找linklist中间的node。 - - - -但是并没有觉得这样的算法是O(n), worst case time complexity is O(N+K), which is O(n). - - -``` -class Solution(object): - def hasCycle(self, head): - """ - :type head: ListNode - :rtype: bool - """ - slow = head - fast = head - while slow and fast and fast.next: - slow = slow.next - fast = fast.next.next - if slow == fast: - return True - return False -``` +class Solution(object): + def hasCycle(self, head): + """ + :type head: ListNode + :rtype: bool + """ + if head == None: return False + lst = [] + cur = head + while cur: + if cur in lst: + return True + lst.append(cur) + cur = cur.next + return False +``` + + + +想法二:相当用boolean array记录某个点是否被访问过,时间,空间复杂度都是O(n) + +``` +class Solution(object): + def hasCycle(self, head): + """ + :type head: ListNode + :rtype: bool + """ + if head == None: return False + dictx = {} + cur = head + while cur: + if cur in dictx: + return True + dictx[cur] = 1 + cur = cur.next + return False +``` + +结果这种方法的run time还比较快 + +查了一下,有解答说可以有空间复杂度O(1),时间复杂度O(n)。两个指针,一个快一个慢,快的每次走两步,慢的每次走一步,如果有环,最终会在某处相遇。这也是一个算法。这种快慢指针配合已经不是第一次遇到了,比如找linklist中间的node。 + + + +但是并没有觉得这样的算法是O(n), worst case time complexity is O(N+K), which is O(n). + + +```python +python +class Solution(object): + def hasCycle(self, head): + """ + :type head: ListNode + :rtype: bool + """ + slow = head + fast = head + while slow and fast and fast.next: + slow = slow.next + fast = fast.next.next + if slow == fast: + return True + return False +``` + + +```java +java +public class Solution { + public boolean hasCycle(ListNode head) { + if (head == null){ + return false; + } + ListNode fast = head; + ListNode slow = head; + while (fast != null && slow != null && fast.next != null){ + fast = fast.next.next; + slow = slow.next; + if (slow == fast){ + return true; + } + } + return false; + } +} +``` + diff --git a/587.-Erect-the-Fence .md b/587.-Erect-the-Fence .md new file mode 100644 index 000000000..396e5e18c --- /dev/null +++ b/587.-Erect-the-Fence .md @@ -0,0 +1,101 @@ +### 587. Erect the Fence + + +题目: + + + +难度: + +Hard + + + +思路 + +题目要求用一个围栏把所有的点(🌲)围起来,然后求处于围栏上点(🌲)的集合。 + +我们可以发现,从最左边的那个点一直往右走,只要一直都是走的逆时针方向,那么我们一定可以找到这条围栏。那么接下来就考虑最简单的情况, + +- 只有两个点```p```和```q```,我们从```p```走到```q```,当```p```到原点这条直线的斜率小于```q```到原点这条直线的斜率时,```p->q```就是沿逆时针方向走的; +- 接下来考虑3个点:```p,q,r```,以```p```为参照点(即前面的原点),那么从```q```走到```r```的时候,只要```q```到```q```这条直线的斜率小于```r```到```p```这条直线的斜率,```q->r```就是沿逆时针方向走的。 + +因此,我们只要构建一个```orientation```函数,就可以判断出目前我们的围栏是不是沿着逆时针在走下去了。 + +我们用一个```stack```来存放目前认为在围栏上的点的集合,然后把所有的点按照指定规则排好序:```先按照点的x坐标升序排列,如果x相等则按照点的y坐标升序排列```。这样我们依次取点,只要stack里面的点大于等于2个我们就要无限进行判断是否走的是逆时针,如果不是就把stack里面最后那个点pop出去(可能一直pop到只剩一个点),否则就把目前的这个点加入到stack中去,因为目前它还是在逆时针方向上的。 + +从左往右走完一遍points之后,我们围栏的下部分lower hull就构建好了,此时我们还要构建围栏的upper hull,因此我们将points逆序一下,从右往左再来一次遍历,仍然看是否走的是逆时针。但是这次遍历我们需要进行一个判断,就是之前放进stack的点,此时我们还是会经过它,如果它已经在stack里面了,我们就不需要再加进去了,同时这样也避免了我们把最左边的点重复加进去。 + + + +```python +python +import functools +class Solution: + def outerTrees(self, points): + """ + :type points: List[Point] + :rtype: List[Point] + """ + def orientation(p, q, r): + return (q.y - p.y)*(r.x - p.x) - (r.y - p.y)*(q.x - p.x) + def myComparator(p,q): + return p.x - q.x if p.x != q.x else p.y - q.y + + stack= [] + points.sort(key = functools.cmp_to_key(myComparator)) + for i in range(len(points)): + while (len(stack) >= 2 and orientation(stack[-2],stack[-1],points[i]) > 0): + stack.pop() + stack.append(points[i]) + points.reverse(); + for i in range(len(points)): + while (len(stack) >= 2 and orientation(stack[-2],stack[-1],points[i]) > 0): + stack.pop() + if points[i] not in stack: + stack.append(points[i]) + return stack +``` + +```java +java +class Solution { + public List outerTrees(Point[] points) { + List res = new ArrayList(); + Arrays.sort(points, new Comparator(){ + @Override + public int compare(Point p, Point q){ + return p.x == q.x ? p.y - q.y : p.x - q.x; + } + }); + Stack stack = new Stack<>(); + for (int i = 0; i < points.length; i++){ + while(stack.size() >= 2 && orientation(stack.get(stack.size() - 2), stack.peek(), points[i]) > 0){ + stack.pop(); + } + stack.push(points[i]); + } + //stack.pop(); + for (int i = points.length - 1; i >= 0; i--){ + while(stack.size() >= 2 && orientation(stack.get(stack.size() - 2), stack.peek(), points[i]) > 0){ + stack.pop(); + } + stack.push(points[i]); + } + res.addAll(new HashSet<>(stack)); + return res; + } + + public int orientation(Point p, Point q, Point r){ + return (q.y - p.y)*(r.x - p.x) - (r.y - p.y)*(q.x - p.x); + } +} +``` + + + +Author: Keqi Huang + +If you like it, please spread your support + +![Support](https://github.com/Lisanaaa/myTODOs/blob/master/WechatIMG17.jpeg) \ No newline at end of file From 668bb9a48001771623f61a40706bb17bb0caccf9 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 17 Oct 2017 16:22:40 -0500 Subject: [PATCH 010/473] add 587 --- "001._clone\346\234\200\346\226\260" | 1 + ...Erect-the-Fence .md => 587._Erect_the_Fence .md | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 "001._clone\346\234\200\346\226\260" rename 587.-Erect-the-Fence .md => 587._Erect_the_Fence .md (75%) diff --git "a/001._clone\346\234\200\346\226\260" "b/001._clone\346\234\200\346\226\260" new file mode 100644 index 000000000..9135c5048 --- /dev/null +++ "b/001._clone\346\234\200\346\226\260" @@ -0,0 +1 @@ +001._记得先clone最新 diff --git a/587.-Erect-the-Fence .md b/587._Erect_the_Fence .md similarity index 75% rename from 587.-Erect-the-Fence .md rename to 587._Erect_the_Fence .md index 396e5e18c..bcade46c4 100644 --- a/587.-Erect-the-Fence .md +++ b/587._Erect_the_Fence .md @@ -1,3 +1,5 @@ + + ### 587. Erect the Fence @@ -22,9 +24,9 @@ Hard 因此,我们只要构建一个```orientation```函数,就可以判断出目前我们的围栏是不是沿着逆时针在走下去了。 -我们用一个```stack```来存放目前认为在围栏上的点的集合,然后把所有的点按照指定规则排好序:```先按照点的x坐标升序排列,如果x相等则按照点的y坐标升序排列```。这样我们依次取点,只要stack里面的点大于等于2个我们就要无限进行判断是否走的是逆时针,如果不是就把stack里面最后那个点pop出去(可能一直pop到只剩一个点),否则就把目前的这个点加入到stack中去,因为目前它还是在逆时针方向上的。 +我们用一个```stack```来存放目前认为在围栏上的点的集合,然后把所有的点按照指定规则排好序:```先按照点的x坐标升序排列,如果x相等则按照点的y坐标升序排列```。这样我们依次取点,只要```stack```里面的点大于等于```2```个我们就要无限进行判断是否走的是逆时针,如果不是就把```stack```里面最后那个点```pop```出去(可能一直```pop```到只剩一个点),否则就把目前的这个点加入到```stack```中去,因为目前它还是在逆时针方向上的。 -从左往右走完一遍points之后,我们围栏的下部分lower hull就构建好了,此时我们还要构建围栏的upper hull,因此我们将points逆序一下,从右往左再来一次遍历,仍然看是否走的是逆时针。但是这次遍历我们需要进行一个判断,就是之前放进stack的点,此时我们还是会经过它,如果它已经在stack里面了,我们就不需要再加进去了,同时这样也避免了我们把最左边的点重复加进去。 +从左往右走完一遍```points```之后,我们围栏的下部分```lower hull```就构建好了,此时我们还要构建围栏的```upper hull```,因此我们将```points```逆序一下,从右往左再来一次遍历,仍然看是否走的是逆时针。但是这次遍历我们需要进行一个判断,就是之前放进```stack```的点,此时我们还是会经过它,如果它已经在```stack```里面了,我们就不需要再加进去了,同时这样也避免了我们把最左边的点重复加进去。 @@ -57,6 +59,10 @@ class Solution: return stack ``` +下面是小傅大神的代码,本来想叫‘’傅神‘’的,结果这名字🤦‍♂️(手动捂脸) + +另外其中的```stack.pop()```这行代码注释掉也是可以的 + ```java java class Solution { @@ -94,8 +100,10 @@ class Solution { + + Author: Keqi Huang If you like it, please spread your support -![Support](https://github.com/Lisanaaa/myTODOs/blob/master/WechatIMG17.jpeg) \ No newline at end of file +![Support](https://github.com/Lisanaaa/myTODOs/blob/master/WechatIMG17.jpeg) From 467c5847a4fb1b50ce66f02a5b300679febc44af Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 17 Oct 2017 16:49:06 -0500 Subject: [PATCH 011/473] Update 242._valid_anagram.md --- 242._valid_anagram.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/242._valid_anagram.md b/242._valid_anagram.md index 28ddbe9c6..e2d9004b9 100644 --- a/242._valid_anagram.md +++ b/242._valid_anagram.md @@ -9,6 +9,17 @@ 对Python来说,又是一块蛋糕,基本不本地测试 就是这么自信 +我的一行解法: +```python +class Solution(object): + def isAnagram(self, s, t): + """ + :type s: str + :type t: str + :rtype: bool + """ + return len(s) == len(t) and collections.Counter(s) == collections.Counter(t) +``` ``` class Solution(object): @@ -27,7 +38,6 @@ class Solution(object): 作弊神奇python大法,看了看别人的解法,用字数统计,因为只可能是26个字母 -然后发现作弊大法居然更快 ``` From 654fab76243b233cc8d2a542d34193643104a09e Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 17 Oct 2017 17:16:33 -0500 Subject: [PATCH 012/473] Update 350._intersection_of_two_arrays_ii.md --- 350._intersection_of_two_arrays_ii.md | 44 +++++++++++++++------------ 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/350._intersection_of_two_arrays_ii.md b/350._intersection_of_two_arrays_ii.md index bd43b8dc8..4e088757d 100644 --- a/350._intersection_of_two_arrays_ii.md +++ b/350._intersection_of_two_arrays_ii.md @@ -1,19 +1,19 @@ -###350. Intersection of Two Arrays II - -题目: - - - - -难度: - -Easy - - -sort之后用了双指针来走和看 - - -``` +### 350. Intersection of Two Arrays II + +题目: + + + + +难度: + +Easy + + +sort之后用了双指针来走和看 + + +``` class Solution(object): def intersect(self, nums1, nums2): """ @@ -41,6 +41,12 @@ class Solution(object): res.append(nums1[p1]) p1 += 1 p2 += 1 - return res -``` - \ No newline at end of file + return res +``` + + + + + + + From ed2a6f749d5e12bf51c2abbc92d63f1159b58c5a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 17 Oct 2017 17:16:48 -0500 Subject: [PATCH 013/473] Update 350._intersection_of_two_arrays_ii.md --- 350._intersection_of_two_arrays_ii.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/350._intersection_of_two_arrays_ii.md b/350._intersection_of_two_arrays_ii.md index 4e088757d..5b6c5632e 100644 --- a/350._intersection_of_two_arrays_ii.md +++ b/350._intersection_of_two_arrays_ii.md @@ -13,7 +13,7 @@ Easy sort之后用了双指针来走和看 -``` +```python class Solution(object): def intersect(self, nums1, nums2): """ From 093469ff122af7378c83993a489bef8bad532507 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 17 Oct 2017 17:48:45 -0500 Subject: [PATCH 014/473] Create 345._Reverse_Vowels_of_a_String --- 345._Reverse_Vowels_of_a_String | 59 +++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 345._Reverse_Vowels_of_a_String diff --git a/345._Reverse_Vowels_of_a_String b/345._Reverse_Vowels_of_a_String new file mode 100644 index 000000000..41fc053c6 --- /dev/null +++ b/345._Reverse_Vowels_of_a_String @@ -0,0 +1,59 @@ +### 345. Reverse Vowels of a String + + +题目: + + + +难度: + +Easy + + + +思路 + +字符串不可变,所以用list代替,最后join + + + +```python +python +class Solution(object): + def reverseVowels(self, s): + """ + :type s: str + :rtype: str + """ + vowels = 'aeiou' + string = list(s) + i, j = 0, len(s) -1 + while i < j: + if string[i].lower() not in vowels: + i += 1 + elif string[j].lower() not in vowels: + j -= 1 + else: + string[i], string[j] = string[j], string[i] + i += 1 + j -= 1 + return ''.join(string) +``` + + + + + +Author: Keqi Huang + +If you like it, please spread your support + +![Support](https://github.com/Lisanaaa/myTODOs/blob/master/WechatIMG17.jpeg) + + + + + + + + From 1ab2dd0666773bc92fbba3a4acdf55d2b93836d8 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 17 Oct 2017 18:16:20 -0500 Subject: [PATCH 015/473] Update 058._length_of_last_word.md --- 058._length_of_last_word.md | 52 ++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/058._length_of_last_word.md b/058._length_of_last_word.md index 7e9ff8a5d..82eadabe5 100644 --- a/058._length_of_last_word.md +++ b/058._length_of_last_word.md @@ -6,11 +6,46 @@ 难度 : Easy - +我的解法: +```python +class Solution(object): + def lengthOfLastWord(self, s): + """ + :type s: str + :rtype: int + """ + if not s: + return 0 + string = list(s) + i = len(s)-1 + res = [] + while i >= 0 and string[i] == ' ': + i -= 1 + while i >= 0 and string[i] != ' ': + res.append(string[i]) + i -= 1 + return len(res) +``` +上面这个判断可以精简成下面的代码: +```python +class Solution(object): + def lengthOfLastWord(self, s): + """ + :type s: str + :rtype: int + """ + length = 0 + for i in reversed(s): + if i == ' ': + if length: + break + else: + length += 1 + return length +``` 作弊式做法 ``` - class Solution(object): def lengthOfLastWord(self, s): """ @@ -21,4 +56,15 @@ class Solution(object): if len(lst) >= 1: return len(lst[-1]) return 0 -``` \ No newline at end of file +``` +split()方法最低可以分0组,split(' ')最低可以分1组 +```python +一行解法: +class Solution(object): + def lengthOfLastWord(self, s): + """ + :type s: str + :rtype: int + """ + return len(s.strip().split(" ")[-1]) +``` From a27b0678d5c69f91638dca778d9b48009bdb83ee Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 17 Oct 2017 18:20:41 -0500 Subject: [PATCH 016/473] Update 587._Erect_the_Fence .md --- 587._Erect_the_Fence .md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/587._Erect_the_Fence .md b/587._Erect_the_Fence .md index bcade46c4..e2737fe28 100644 --- a/587._Erect_the_Fence .md +++ b/587._Erect_the_Fence .md @@ -59,7 +59,7 @@ class Solution: return stack ``` -下面是小傅大神的代码,本来想叫‘’傅神‘’的,结果这名字🤦‍♂️(手动捂脸) +下面是小傅大神的代码,本来想叫‘’傅神‘’的,结果这名字🤦‍♂️(手动捂脸)[小傅每日一题](https://www.bilibili.com/video/av15446980/) 另外其中的```stack.pop()```这行代码注释掉也是可以的 From 30e35746d0115dae9be0c8411d1ef6994598e99a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 17 Oct 2017 18:21:06 -0500 Subject: [PATCH 017/473] Update 587._Erect_the_Fence .md --- 587._Erect_the_Fence .md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/587._Erect_the_Fence .md b/587._Erect_the_Fence .md index e2737fe28..cb3cb7f00 100644 --- a/587._Erect_the_Fence .md +++ b/587._Erect_the_Fence .md @@ -59,7 +59,7 @@ class Solution: return stack ``` -下面是小傅大神的代码,本来想叫‘’傅神‘’的,结果这名字🤦‍♂️(手动捂脸)[小傅每日一题](https://www.bilibili.com/video/av15446980/) +下面是小傅大神的代码,本来想叫‘’傅神‘’的,结果这名字🤦‍♂️(手动捂脸)[小傅每日一题587](https://www.bilibili.com/video/av15446980/) 另外其中的```stack.pop()```这行代码注释掉也是可以的 From ee08bad7f64b241372c5207eab2cf97c0dec830b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 17 Oct 2017 18:48:07 -0500 Subject: [PATCH 018/473] Update 067._add_binary.md --- 067._add_binary.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/067._add_binary.md b/067._add_binary.md index 8ddec55c7..33470e6a4 100644 --- a/067._add_binary.md +++ b/067._add_binary.md @@ -10,7 +10,7 @@ 几种case: - a or b 为空,最简单 -- 唯一的问题是如果有进位的处理,进位的处理就是先让其中的一个数addBinary +1 ,然后再用addBinary +- 唯一的问题是如果有进位的处理,进位的处理就是先让其中的一个数和```‘1’```做```addBinary```处理 ,然后再用```addBinary``` ``` @@ -30,4 +30,4 @@ class Solution(object): return self.addBinary(a[:-1], self.addBinary(b[:-1],'1')) + '0' else: return self.addBinary(a[:-1], b[:-1]) + '1' -``` \ No newline at end of file +``` From b9d316b94a19dc0c22df91cd91e48e2dccee84f2 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 17 Oct 2017 18:48:45 -0500 Subject: [PATCH 019/473] Update 067._add_binary.md --- 067._add_binary.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/067._add_binary.md b/067._add_binary.md index 33470e6a4..875dc9e63 100644 --- a/067._add_binary.md +++ b/067._add_binary.md @@ -12,9 +12,7 @@ - a or b 为空,最简单 - 唯一的问题是如果有进位的处理,进位的处理就是先让其中的一个数和```‘1’```做```addBinary```处理 ,然后再用```addBinary``` -``` - - +```python class Solution(object): def addBinary(self, a, b): """ From 5d02f42b9e2bd93a3def334e199630503b06c158 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 17 Oct 2017 22:25:09 -0500 Subject: [PATCH 020/473] Create 459._Repeated_Substring_Pattern.md --- 459._Repeated_Substring_Pattern.md | 40 ++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 459._Repeated_Substring_Pattern.md diff --git a/459._Repeated_Substring_Pattern.md b/459._Repeated_Substring_Pattern.md new file mode 100644 index 000000000..8840c1c31 --- /dev/null +++ b/459._Repeated_Substring_Pattern.md @@ -0,0 +1,40 @@ +### 459. Repeated Substring Pattern + + +题目: + + + +难度: + +Easy + + +思路 + +- 如果存在这样的子串,那么子串的第一个字符和最后一个字符肯定跟父字符串```s```的相同。 +- 因此构建一个新字符串```s*2```(两个父字符串相加),去掉首尾字符 +- 如果此时能在其中找到```s```,说明存在这样的子串 + + + + +```python +python +class Solution(object): + def repeatedSubstringPattern(self, s): + """ + :type s: str + :rtype: bool + """ + return (s*2)[1:-1].find(s) != -1 +``` + + + + +Author: Keqi Huang + +If you like it, please spread your support + +![Support](https://github.com/Lisanaaa/myTODOs/blob/master/WechatIMG17.jpeg) From 490561c931d38094da830d58501a6778499acf86 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 17 Oct 2017 22:31:12 -0500 Subject: [PATCH 021/473] =?UTF-8?q?Update=20Python=E5=88=B7=E9=A2=98?= =?UTF-8?q?=E6=8A=80=E5=B7=A7=E7=AC=94=E8=AE=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...42\230\346\212\200\345\267\247\347\254\224\350\256\260.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.md" "b/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.md" index bf50419f3..9287535cb 100644 --- "a/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.md" +++ "b/Python\345\210\267\351\242\230\346\212\200\345\267\247\347\254\224\350\256\260.md" @@ -58,8 +58,8 @@ python 的三目运算符是这么写的 x if y else z 考虑这种list of list: matrix = [ [1,2,3] , [4,5,6] ] -row  = len(matrix) -col = len(matrix[0]) if row else 0  +```row  = len(matrix)```, +```col = len(matrix[0]) if row else 0 ``` 这样写通用的原因是, 当matrix = [], row = 0, col =0 From 986641259a56acf1d50f6a9597a5325cb7b74980 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 18 Oct 2017 01:46:30 -0500 Subject: [PATCH 022/473] Update 587._Erect_the_Fence .md python comparator new type --- 587._Erect_the_Fence .md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/587._Erect_the_Fence .md b/587._Erect_the_Fence .md index cb3cb7f00..ee94a6c55 100644 --- a/587._Erect_the_Fence .md +++ b/587._Erect_the_Fence .md @@ -32,7 +32,7 @@ Hard ```python python -import functools +# import functools class Solution: def outerTrees(self, points): """ @@ -41,11 +41,11 @@ class Solution: """ def orientation(p, q, r): return (q.y - p.y)*(r.x - p.x) - (r.y - p.y)*(q.x - p.x) - def myComparator(p,q): - return p.x - q.x if p.x != q.x else p.y - q.y - + # def myComparator(p,q): + # return p.x - q.x if p.x != q.x else p.y - q.y stack= [] - points.sort(key = functools.cmp_to_key(myComparator)) + # points.sort(key = functools.cmp_to_key(myComparator)) + points.sort(key = lambda p: (p.x, p.y)) for i in range(len(points)): while (len(stack) >= 2 and orientation(stack[-2],stack[-1],points[i]) > 0): stack.pop() From db3d1e16c24dff94715203b1b14eac49a1200f9e Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 19 Oct 2017 19:48:49 -0500 Subject: [PATCH 023/473] Update 049._group_anagrams_python.md --- 049._group_anagrams_python.md | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/049._group_anagrams_python.md b/049._group_anagrams_python.md index c6d15903c..aa6962957 100644 --- a/049._group_anagrams_python.md +++ b/049._group_anagrams_python.md @@ -6,10 +6,10 @@ 难度 : Medium -我又来使用我的取巧神奇python大法 +python大法好 -``` +```python class Solution(object): def groupAnagrams(self, strs): """ @@ -17,22 +17,12 @@ class Solution(object): :rtype: List[List[str]] """ mapx = {} - for str1 in strs: - key = self.sortedWord(str1) - if key in mapx: - mapx[key].append(str1) - else: - mapx[key] = [str1] - return list(mapx.values()) - - def sortedWord(self,s): - """ - :type s: str - :type t: str - :rtype: bool - """ - sList = sorted(list(s)) - str1 = ''.join(sList) - return str1 + for i in strs: + x = ''.join(sorted(list(i))) + if x in mapx: + mapx[x].append(i) + else: + mapx[x] = [i] + return mapx.values() ``` From c2e7444265d97287ad79aecd56610e4d303154f6 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 20 Oct 2017 16:57:33 -0500 Subject: [PATCH 024/473] Create 438._Find_All_Anagrams_in_a_String.md --- 438._Find_All_Anagrams_in_a_String.md | 69 +++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 438._Find_All_Anagrams_in_a_String.md diff --git a/438._Find_All_Anagrams_in_a_String.md b/438._Find_All_Anagrams_in_a_String.md new file mode 100644 index 000000000..f7427756d --- /dev/null +++ b/438._Find_All_Anagrams_in_a_String.md @@ -0,0 +1,69 @@ +### 438. Find All Anagrams in a String + + +题目: + + + +难度: + +Easy + + + +思路 + +刚开始打算直接遍历整个s,时间复杂度为O(m*n),m和n分别为字符串p和s的长度,但是超时了 + + + +```python +python +class Solution(object): + def findAnagrams(self, s, p): + """ + :type s: str + :type p: str + :rtype: List[int] + """ + l, res = len(p), [] + for i in range(len(s)): + if collections.Counter(s[i:i+l]) == collections.Counter(p): + res.append(i) + return res +``` +于是用双指针,left和right都从0开始往后遍历 +```python +class Solution(object): + def findAnagrams(self, s, p): + """ + :type s: str + :type p: str + :rtype: List[int] + """ + result = [] + + cnts = [0] * 26 + for c in p: + cnts[ord(c) - ord('a')] += 1 + + left, right = 0, 0 + while right < len(s): + cnts[ord(s[right]) - ord('a')] -= 1 + while left <= right and cnts[ord(s[right]) - ord('a')] < 0: + cnts[ord(s[left]) - ord('a')] += 1 + left += 1 + if right - left + 1 == len(p): + result.append(left) + right += 1 + + return result +``` + + + +Author: Keqi Huang + +If you like it, please spread your support + +![Support](https://github.com/Lisanaaa/myTODOs/blob/master/WechatIMG17.jpeg) From cb0c340c24c703f1c405d7ae2059c423b6268c52 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 21 Oct 2017 12:01:40 -0500 Subject: [PATCH 025/473] Update 587._Erect_the_Fence .md --- 587._Erect_the_Fence .md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/587._Erect_the_Fence .md b/587._Erect_the_Fence .md index ee94a6c55..f61d75b3c 100644 --- a/587._Erect_the_Fence .md +++ b/587._Erect_the_Fence .md @@ -58,6 +58,30 @@ class Solution: stack.append(points[i]) return stack ``` +简化python版本 +```python +class Solution(object): + def outerTrees(self, points): + """ + :type points: List[Point] + :rtype: List[Point] + """ + def orientation(p, q, r): + return (q.y - p.y) * (r.x - q.x) - \ + (q.x - p.x) * (r.y - q.y) + + hull = [] + points.sort(key=lambda p: (p.x, p.y)) + + for i in itertools.chain(xrange(len(points)), \ + reversed(xrange(len(points)))): + while len(hull) >= 2 and \ + orientation(hull[-2], hull[-1], points[i]) > 0: + hull.pop() + hull.append(points[i]) + + return list(set(hull)) +``` 下面是小傅大神的代码,本来想叫‘’傅神‘’的,结果这名字🤦‍♂️(手动捂脸)[小傅每日一题587](https://www.bilibili.com/video/av15446980/) From 46543b2c85c519f7e344fa862a698cd0bbf8234b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 21 Oct 2017 12:35:15 -0500 Subject: [PATCH 026/473] Update 003._longest_substring_without_repeating_characters.md --- ...est_substring_without_repeating_characters.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/003._longest_substring_without_repeating_characters.md b/003._longest_substring_without_repeating_characters.md index 188a6c26d..24f30c7c6 100644 --- a/003._longest_substring_without_repeating_characters.md +++ b/003._longest_substring_without_repeating_characters.md @@ -49,7 +49,23 @@ class Solution(object): maps[s[i]] = i return max(l, n - start) ``` +简化python版本 +```python +class Solution(object): + def lengthOfLongestSubstring(self, s): + """ + :type s: str + :rtype: int + """ + l, start, n = 0, 0, len(s) + maps = {} + for i in range(n): + start = max(start, maps.get(s[i], -1)+1) + l = max(l, i - start+1) + maps[s[i]] = i + return l +``` ```java java class Solution { From 8fbe50f501ccbb826864ab81f82112e28f65563e Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 30 Oct 2017 13:16:45 -0500 Subject: [PATCH 027/473] Create 665._Non-decreasing_Array.md --- 665._Non-decreasing_Array.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 665._Non-decreasing_Array.md diff --git a/665._Non-decreasing_Array.md b/665._Non-decreasing_Array.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/665._Non-decreasing_Array.md @@ -0,0 +1 @@ + From f95e660d1fc489fa26bb97a8ee828cf3bc9c33b3 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 30 Oct 2017 13:32:18 -0500 Subject: [PATCH 028/473] Update 665._Non-decreasing_Array.md --- 665._Non-decreasing_Array.md | 47 ++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/665._Non-decreasing_Array.md b/665._Non-decreasing_Array.md index 8b1378917..3b90e5772 100644 --- a/665._Non-decreasing_Array.md +++ b/665._Non-decreasing_Array.md @@ -1 +1,48 @@ +### 665. Non-decreasing Array + +题目: + + + +难度: + +Easy + + +思路 + +从index=1的元素依次检查,只要不符合规则则让count+1,如果count>1则肯定不符合返回False +但是我们在发现nums[i]小于nums[i-1]的时候,我们就必须要对原数组作出改变了,来让它的后面index部分尽可能满足条件 +下面就是两种情况: +1. 2,4,2,6 + +如果是这种情况,当index=2时,不满足条件,但是i=0的元素是小于i=2处元素的,我们需要改变的是i-1处的元素,也就是将4改变成i=2处元素即2,最终变成2,2,2,6 + +2. 3,4,2,6 + +这种情况如果我们将4变成2那么仍然是不满足条件的,此时我们需要将2变成4,即将i处元素变为i-1处元素 + +在每一次不符合条件的时候我们都检查一下count,如果count大于1的话我们就返回False,否则最终就返回True + +```python +class Solution(object): + def checkPossibility(self, nums): + """ + :type nums: List[int] + :rtype: bool + """ + count = 0 + for i in range(1,len(nums)): + if nums[i] < nums[i-1]: + count += 1 + if count > 1: + return False + if i - 2 < 0 or nums[i-2] <= nums[i]: + nums[i-1] = nums[i] + else: + nums[i] = nums[i-1] + return True +``` + + From 3566abb9ec2059e1bc457cf841340a0d528718b8 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 30 Oct 2017 13:32:45 -0500 Subject: [PATCH 029/473] Update 665._Non-decreasing_Array.md --- 665._Non-decreasing_Array.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/665._Non-decreasing_Array.md b/665._Non-decreasing_Array.md index 3b90e5772..cfb621a98 100644 --- a/665._Non-decreasing_Array.md +++ b/665._Non-decreasing_Array.md @@ -14,11 +14,11 @@ Easy 从index=1的元素依次检查,只要不符合规则则让count+1,如果count>1则肯定不符合返回False 但是我们在发现nums[i]小于nums[i-1]的时候,我们就必须要对原数组作出改变了,来让它的后面index部分尽可能满足条件 下面就是两种情况: -1. 2,4,2,6 +1.2,4,2,6 如果是这种情况,当index=2时,不满足条件,但是i=0的元素是小于i=2处元素的,我们需要改变的是i-1处的元素,也就是将4改变成i=2处元素即2,最终变成2,2,2,6 -2. 3,4,2,6 +2.3,4,2,6 这种情况如果我们将4变成2那么仍然是不满足条件的,此时我们需要将2变成4,即将i处元素变为i-1处元素 From 61a5d49855936d275bb9d1012ddd6944aafc2d0d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 30 Oct 2017 13:33:00 -0500 Subject: [PATCH 030/473] Update 665._Non-decreasing_Array.md --- 665._Non-decreasing_Array.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/665._Non-decreasing_Array.md b/665._Non-decreasing_Array.md index cfb621a98..62db06891 100644 --- a/665._Non-decreasing_Array.md +++ b/665._Non-decreasing_Array.md @@ -14,11 +14,11 @@ Easy 从index=1的元素依次检查,只要不符合规则则让count+1,如果count>1则肯定不符合返回False 但是我们在发现nums[i]小于nums[i-1]的时候,我们就必须要对原数组作出改变了,来让它的后面index部分尽可能满足条件 下面就是两种情况: -1.2,4,2,6 +- 2,4,2,6 如果是这种情况,当index=2时,不满足条件,但是i=0的元素是小于i=2处元素的,我们需要改变的是i-1处的元素,也就是将4改变成i=2处元素即2,最终变成2,2,2,6 -2.3,4,2,6 +- 3,4,2,6 这种情况如果我们将4变成2那么仍然是不满足条件的,此时我们需要将2变成4,即将i处元素变为i-1处元素 From 4433869fa9d1053a21948c889c2c6c3cd978e27e Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 30 Oct 2017 13:33:26 -0500 Subject: [PATCH 031/473] Update 665._Non-decreasing_Array.md --- 665._Non-decreasing_Array.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/665._Non-decreasing_Array.md b/665._Non-decreasing_Array.md index 62db06891..cf05d3c9e 100644 --- a/665._Non-decreasing_Array.md +++ b/665._Non-decreasing_Array.md @@ -14,7 +14,7 @@ Easy 从index=1的元素依次检查,只要不符合规则则让count+1,如果count>1则肯定不符合返回False 但是我们在发现nums[i]小于nums[i-1]的时候,我们就必须要对原数组作出改变了,来让它的后面index部分尽可能满足条件 下面就是两种情况: -- 2,4,2,6 +- 2,4,2,6 如果是这种情况,当index=2时,不满足条件,但是i=0的元素是小于i=2处元素的,我们需要改变的是i-1处的元素,也就是将4改变成i=2处元素即2,最终变成2,2,2,6 From fb2ec12700b7ebd027893e5ba266f023b5c887b7 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 14 Nov 2017 17:37:32 -0600 Subject: [PATCH 032/473] Update 088._merge_sorted_array.md --- 088._merge_sorted_array.md | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/088._merge_sorted_array.md b/088._merge_sorted_array.md index 935310045..b1e83bd7b 100644 --- a/088._merge_sorted_array.md +++ b/088._merge_sorted_array.md @@ -7,7 +7,7 @@ 难度 : Easy -并不easy和容易写对 +思路: 给的数组可能是这样的 @@ -17,16 +17,14 @@ nums2 : [1] n : 1 -设置指针p = m + n -1, p1 = m - 1, p2 = n - 1 - -从末端开始,哪个数更大就放末端,两个指针都走到-1才算走完,问题可能出现在p1走完但是p2还没走完,所以添加一个多的loop来检查,想之上的例子就可以理解 +所以要判断m和n是不是仍然大于0 AC代码 ``` -class Solution(object): +class Solution: def merge(self, nums1, m, nums2, n): """ :type nums1: List[int] @@ -35,22 +33,14 @@ class Solution(object): :type n: int :rtype: void Do not return anything, modify nums1 in-place instead. """ - p = m + n -1 - p1 = m - 1 - p2 = n - 1 - while p2 >= 0 and p1 >= 0 : - if nums2[p2] > nums1[p1]: - nums1[p] = nums2[p2] - p2 -= 1 + while m > 0 and n > 0: + if nums1[m-1] > nums2[n-1]: + nums1[m+n-1] = nums1[m-1] + m -= 1 else: - nums1[p] = nums1[p1] - p1 -= 1 - p -= 1 - - + nums1[m+n-1] = nums2[n-1] + n -= 1 + if n > 0: + nums1[:n] = nums2[:n] - for i in range(p2,-1,-1): - nums1[p] = nums2[i] - p -= 1 - -``` \ No newline at end of file +``` From dbe98b99fb3d85ec977a33b927e6307aebb1d250 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 14 Nov 2017 17:37:52 -0600 Subject: [PATCH 033/473] Update 088._merge_sorted_array.md --- 088._merge_sorted_array.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/088._merge_sorted_array.md b/088._merge_sorted_array.md index b1e83bd7b..dc8815e67 100644 --- a/088._merge_sorted_array.md +++ b/088._merge_sorted_array.md @@ -1,4 +1,4 @@ -###88. Merge Sorted Array +### 88. Merge Sorted Array 题目: @@ -7,7 +7,7 @@ 难度 : Easy -思路: +### 思路: 给的数组可能是这样的 From 8fb3a6c5fa1fffc4846675cdd86cbba41f78babb Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 17 Nov 2017 07:26:06 -0600 Subject: [PATCH 034/473] Create 599._Minimum_Index_Sum_of_Two_Lists.md --- 599._Minimum_Index_Sum_of_Two_Lists.md | 58 ++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 599._Minimum_Index_Sum_of_Two_Lists.md diff --git a/599._Minimum_Index_Sum_of_Two_Lists.md b/599._Minimum_Index_Sum_of_Two_Lists.md new file mode 100644 index 000000000..1682fab62 --- /dev/null +++ b/599._Minimum_Index_Sum_of_Two_Lists.md @@ -0,0 +1,58 @@ +### 599. Minimum Index Sum of Two Lists + + +题目: + + + +难度: + +Easy + + + +思路 + +两个list,我们首先要取得它们相同的部分,并且之后我们还要知道哪个相同的字符串在两个list中的index之和是最小的。 +- 所以我们首先遍历list1,只要目前这个字符串在list2中,我们就以[字符串,index之和]的形式将其存放到ress中,同时维护一个index保持为最小index之和的值 +- 对于ress,我们遍历,只要某一项的index之和等于最小index之和我们就将他的字符串以i[0]的形式append到res中去, +- return res + +### 程序变量解释 + +- ress format: [[string1, sumOfIndex1], [string2, sumOfIndex2]... ] +- index 最小sunOfIndex值 +- res 最终结果,foramt: [string1, string2,. ...] + + + + +```python +python +class Solution: + def findRestaurant(self, list1, list2): + """ + :type list1: List[str] + :type list2: List[str] + :rtype: List[str] + """ + ress = [] + index = 2000 + for i in list1: + if i in list2: + ress.append([i, list1.index(i)+list2.index(i)]) + index = min(index, list1.index(i)+list2.index(i)) + res = [] + for i in ress: + if i[1] == index: + res.append(i[0]) + return res +``` + + + +Author: Keqi Huang + +If you like it, please spread your support + +![Support](https://github.com/Lisanaaa/myTODOs/blob/master/WechatIMG17.jpeg) From 2497e6378f33fa8ddbc739a08b51dcfd95afcf2e Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 22 Nov 2017 04:52:53 -0600 Subject: [PATCH 035/473] Update 004._median_of_two_sorted_arrays.md --- 004._median_of_two_sorted_arrays.md | 69 +++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/004._median_of_two_sorted_arrays.md b/004._median_of_two_sorted_arrays.md index 8714c2abf..409e923d3 100644 --- a/004._median_of_two_sorted_arrays.md +++ b/004._median_of_two_sorted_arrays.md @@ -102,6 +102,75 @@ class Solution(object): ``` 这个findKth的算法单独抽出来也是题目。 +寻找最小的k个数 + +题目描述 + +输入n个整数,输出其中最小的k个。 +分析与解法 + +解法一 + +要求一个序列中最小的k个数,按照惯有的思维方式,则是先对这个序列从小到大排序,然后输出前面的最小的k个数。 +至于选取什么的排序方法,我想你可能会第一时间想到快速排序(我们知道,快速排序平均所费时间为n*logn),然后再遍历序列中前k个元素输出即可。因此,总的时间复杂度:```O(n * log n)+O(k)=O(n * log n)```。 +解法二 + +咱们再进一步想想,题目没有要求最小的```k```个数有序,也没要求最后```n-k```个数有序。既然如此,就没有必要对所有元素进行排序。这时,咱们想到了用选择或交换排序,即: +1、遍历```n```个数,把最先遍历到的k个数存入到大小为```k```的数组中,假设它们即是最小的```k```个数; +2、对这```k```个数,利用选择或交换排序找到这k个元素中的最大值```kmax```(找最大值需要遍历这```k```个数,时间复杂度为```O(k))```; +3、继续遍历剩余```n-k```个数。假设每一次遍历到的新的元素的值为```x```,把```x```与```kmax```比较:如果```x``` < ```kmax``` ,用```x```替换```kmax```,并回到第二步重新找出k个元素的数组中最大元素kmax‘;如果```x >= kmax```,则继续遍历不更新数组。 +每次遍历,更新或不更新数组的所用的时间为```O(k)```或```O(0)```。故整趟下来,时间复杂度为```n*O(k)=O(n*k)```。 +解法三 + +更好的办法是维护容量为k的最大堆,原理跟解法二的方法相似: +1、用容量为```k```的最大堆存储最先遍历到的```k```个数,同样假设它们即是最小的```k```个数; +2、堆中元素是有序的,令```k1 pivot ){ } + if( i < j ) + swap( &a[ i ], &a[ j ] ); + else + break; + } + //重置枢纽元 + swap( &a[ i ], &a[ right - 1 ] ); + + if( k <= i ) + QuickSelect( a, k, left, i - 1 ); + else if( k > i + 1 ) + QuickSelect( a, k, i + 1, right ); + } + else + InsertSort( a + left, right - left + 1 ); +} +``` +这个快速选择SELECT算法,类似快速排序的划分方法。N个数存储在数组S中,再从数组中选取“中位数的中位数”作为枢纽元X,把数组划分为Sa和Sb俩部分,Sa<=X<=Sb,如果要查找的k个元素小于Sa的元素个数,则返回Sa中较小的k个元素,否则返回Sa中所有元素+Sb中小的k-|Sa|个元素,这种解法在平均情况下能做到O(n)的复杂度。 +更进一步,《算法导论》第9章第9.3节介绍了一个最坏情况下亦为O(n)时间的SELECT算法,有兴趣的读者可以参看。 给定两个已经排序好的数组,求第k大的,算法有O(m+n).类似merge sort的原理。否则利用的就是之上提到的,利用已经有序的原理,然后每次丢。 From 4d0cbddf66514d4ff85680574cdc99dc10ed8eaa Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 22 Nov 2017 04:56:26 -0600 Subject: [PATCH 036/473] Update 004._median_of_two_sorted_arrays.md --- 004._median_of_two_sorted_arrays.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/004._median_of_two_sorted_arrays.md b/004._median_of_two_sorted_arrays.md index 409e923d3..eae9ceb7a 100644 --- a/004._median_of_two_sorted_arrays.md +++ b/004._median_of_two_sorted_arrays.md @@ -174,7 +174,7 @@ void QuickSelect( int a[], int k, int left, int right ) 给定两个已经排序好的数组,求第k大的,算法有O(m+n).类似merge sort的原理。否则利用的就是之上提到的,利用已经有序的原理,然后每次丢。 -之所以这里还有一个丢弃条件是b is None 丢A的一部分,是因为B的数组长度是有限的,这个时候很明显丢A的k/2是不影响的,因为无论B[-1]是如何大或者小,因为整个B的长度没有达到k/2,所以丢掉的这部分最大的A[k/2-1]也不可能是第k个,因为即使整个B都比A[k/2-1],拼起来也不能使A[k/2-1]第k大,所以可以放心丢弃。 +之所以这里还有一个丢弃条件是b is None 丢A的一部分,是因为B的数组长度是有限的,这个时候很明显丢A的k/2是不影响的,因为无论B[-1]是如何大或者小,因为整个B的长度没有达到k/2小,所以丢掉的这部分最大的A[k/2-1]也不可能是第k个,因为即使整个B都比A[k/2-1],拼起来也不能使A[k/2-1]第k大,所以可以放心丢弃。 这里是两个sorted list/array findKth,想到了类似的题目,如果给一个n个linked list,findKth,能想到的办法也只能是用heap吧,类似merge k sorted lists. From 6d3bd34edf35755e7bac74dcbcda7ee7d57963d5 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 22 Nov 2017 05:07:26 -0600 Subject: [PATCH 037/473] Update 004._median_of_two_sorted_arrays.md --- 004._median_of_two_sorted_arrays.md | 30 ++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/004._median_of_two_sorted_arrays.md b/004._median_of_two_sorted_arrays.md index eae9ceb7a..0af062cc5 100644 --- a/004._median_of_two_sorted_arrays.md +++ b/004._median_of_two_sorted_arrays.md @@ -109,32 +109,32 @@ class Solution(object): 输入n个整数,输出其中最小的k个。 分析与解法 -解法一 +## 解法一 要求一个序列中最小的k个数,按照惯有的思维方式,则是先对这个序列从小到大排序,然后输出前面的最小的k个数。 至于选取什么的排序方法,我想你可能会第一时间想到快速排序(我们知道,快速排序平均所费时间为n*logn),然后再遍历序列中前k个元素输出即可。因此,总的时间复杂度:```O(n * log n)+O(k)=O(n * log n)```。 -解法二 +## 解法二 咱们再进一步想想,题目没有要求最小的```k```个数有序,也没要求最后```n-k```个数有序。既然如此,就没有必要对所有元素进行排序。这时,咱们想到了用选择或交换排序,即: -1、遍历```n```个数,把最先遍历到的k个数存入到大小为```k```的数组中,假设它们即是最小的```k```个数; -2、对这```k```个数,利用选择或交换排序找到这k个元素中的最大值```kmax```(找最大值需要遍历这```k```个数,时间复杂度为```O(k))```; -3、继续遍历剩余```n-k```个数。假设每一次遍历到的新的元素的值为```x```,把```x```与```kmax```比较:如果```x``` < ```kmax``` ,用```x```替换```kmax```,并回到第二步重新找出k个元素的数组中最大元素kmax‘;如果```x >= kmax```,则继续遍历不更新数组。 +1. 遍历```n```个数,把最先遍历到的k个数存入到大小为```k```的数组中,假设它们即是最小的```k```个数; +2. 对这```k```个数,利用选择或交换排序找到这k个元素中的最大值```kmax```(找最大值需要遍历这```k```个数,时间复杂度为```O(k))```; +3. 继续遍历剩余```n-k```个数。假设每一次遍历到的新的元素的值为```x```,把```x```与```kmax```比较:如果```x``` < ```kmax``` ,用```x```替换```kmax```,并回到第二步重新找出k个元素的数组中最大元素kmax‘;如果```x >= kmax```,则继续遍历不更新数组。 每次遍历,更新或不更新数组的所用的时间为```O(k)```或```O(0)```。故整趟下来,时间复杂度为```n*O(k)=O(n*k)```。 -解法三 +## 解法三 更好的办法是维护容量为k的最大堆,原理跟解法二的方法相似: -1、用容量为```k```的最大堆存储最先遍历到的```k```个数,同样假设它们即是最小的```k```个数; -2、堆中元素是有序的,令```k1 Date: Wed, 22 Nov 2017 05:07:59 -0600 Subject: [PATCH 038/473] Update 004._median_of_two_sorted_arrays.md --- 004._median_of_two_sorted_arrays.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/004._median_of_two_sorted_arrays.md b/004._median_of_two_sorted_arrays.md index 0af062cc5..8adfb6d1a 100644 --- a/004._median_of_two_sorted_arrays.md +++ b/004._median_of_two_sorted_arrays.md @@ -102,7 +102,7 @@ class Solution(object): ``` 这个findKth的算法单独抽出来也是题目。 -寻找最小的k个数 +### 寻找最小的k个数 题目描述 From 945b60c34f33eaf941bd5f92e3dbb13327f94d95 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 22 Nov 2017 05:43:09 -0600 Subject: [PATCH 039/473] Update 004._median_of_two_sorted_arrays.md --- 004._median_of_two_sorted_arrays.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/004._median_of_two_sorted_arrays.md b/004._median_of_two_sorted_arrays.md index 8adfb6d1a..2a4313a46 100644 --- a/004._median_of_two_sorted_arrays.md +++ b/004._median_of_two_sorted_arrays.md @@ -97,7 +97,7 @@ class Solution(object): if b is None or (a is not None and a < b): return self.findKth(A[k/2:], B, k - k/2) -   return self.findKth(A, B[k/2:],k - k/2) //这里要注意:因为 k/2 不一定 等于 (k - k/2) +   return self.findKth(A, B[k/2:],k - k/2) #这里要注意:因为 k/2 不一定 等于 (k - k/2) ``` From 021203e176cd96942f97b1d557f7c10314b3d51c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 22 Nov 2017 06:00:26 -0600 Subject: [PATCH 040/473] Update 004._median_of_two_sorted_arrays.md --- 004._median_of_two_sorted_arrays.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/004._median_of_two_sorted_arrays.md b/004._median_of_two_sorted_arrays.md index 2a4313a46..ccdc8baae 100644 --- a/004._median_of_two_sorted_arrays.md +++ b/004._median_of_two_sorted_arrays.md @@ -97,7 +97,7 @@ class Solution(object): if b is None or (a is not None and a < b): return self.findKth(A[k/2:], B, k - k/2) -   return self.findKth(A, B[k/2:],k - k/2) #这里要注意:因为 k/2 不一定 等于 (k - k/2) +   return self.findKth(A, B[k/2:],k - k/2) #这里要注意:因为 k/2 不一定 等于 (k - k/2), python3里面要用向下取整函数才可以AC,否则报错,TypeError: list indices must be integers or slices, not float ``` From 5a6902035177dbc7a27bf9ecf643e6ec46e02411 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 22 Nov 2017 06:00:51 -0600 Subject: [PATCH 041/473] Update 004._median_of_two_sorted_arrays.md --- 004._median_of_two_sorted_arrays.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/004._median_of_two_sorted_arrays.md b/004._median_of_two_sorted_arrays.md index ccdc8baae..ccfc12877 100644 --- a/004._median_of_two_sorted_arrays.md +++ b/004._median_of_two_sorted_arrays.md @@ -97,7 +97,8 @@ class Solution(object): if b is None or (a is not None and a < b): return self.findKth(A[k/2:], B, k - k/2) -   return self.findKth(A, B[k/2:],k - k/2) #这里要注意:因为 k/2 不一定 等于 (k - k/2), python3里面要用向下取整函数才可以AC,否则报错,TypeError: list indices must be integers or slices, not float +   return self.findKth(A, B[k/2:],k - k/2) #这里要注意:因为 k/2 不一定 等于 (k - k/2), + #python3里面要用向下取整函数才可以AC,否则报错,TypeError: list indices must be integers or slices, not float ``` From c0769c7c0871488762baf50b6fe128a2af3b53bd Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 22 Nov 2017 06:01:21 -0600 Subject: [PATCH 042/473] Update 004._median_of_two_sorted_arrays.md --- 004._median_of_two_sorted_arrays.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/004._median_of_two_sorted_arrays.md b/004._median_of_two_sorted_arrays.md index ccfc12877..f5d0a0c07 100644 --- a/004._median_of_two_sorted_arrays.md +++ b/004._median_of_two_sorted_arrays.md @@ -98,7 +98,7 @@ class Solution(object): if b is None or (a is not None and a < b): return self.findKth(A[k/2:], B, k - k/2)   return self.findKth(A, B[k/2:],k - k/2) #这里要注意:因为 k/2 不一定 等于 (k - k/2), - #python3里面要用向下取整函数才可以AC,否则报错,TypeError: list indices must be integers or slices, not float +#python3里面要用向下取整函数才可以AC,否则报错,TypeError: list indices must be integers or slices, not float ``` From 31d7f7fb8b4945e831c84c5f0c5468f4de1f0a4b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 22 Nov 2017 07:44:27 -0600 Subject: [PATCH 043/473] Update 003._longest_substring_without_repeating_characters.md --- ..._substring_without_repeating_characters.md | 47 +------------------ 1 file changed, 1 insertion(+), 46 deletions(-) diff --git a/003._longest_substring_without_repeating_characters.md b/003._longest_substring_without_repeating_characters.md index 24f30c7c6..02b5c55e8 100644 --- a/003._longest_substring_without_repeating_characters.md +++ b/003._longest_substring_without_repeating_characters.md @@ -28,28 +28,7 @@ Medium - maps 放置每一个字符的index,如果maps.get(s[i], -1)大于等于start的话,就说明字符重复了,此时就要重置 l(字母L) 和start的值了, -最后还要进行一次比较,因为最后一次没有比较,即 n - start 和 l (字母L) 的比较,这是最后一个round - - -```python -python -class Solution(object): - def lengthOfLongestSubstring(self, s): - """ - :type s: str - :rtype: int - """ - l, start, n = 0, 0, len(s) - maps = {} - for i in range(n): - if maps.get(s[i], -1) >= start: - l = max(l, i - start) - start = maps.get(s[i]) + 1 - maps[s[i]] = i - return max(l, n - start) -``` -简化python版本 ```python class Solution(object): def lengthOfLongestSubstring(self, s): @@ -66,31 +45,7 @@ class Solution(object): maps[s[i]] = i return l ``` -```java -java -class Solution { - public int lengthOfLongestSubstring(String s) { - HashMap map = new HashMap(); - int l= 0; - int start = 0; - int n = s.length(); - for (int i = 0; i < n; i++){ - if(returnDef(map, s.charAt(i)) >= start){ - l = Math.max(l, i-start); - start = map.get(s.charAt(i)) + 1; - } - map.put(s.charAt(i), i); - } - return Math.max(n-start,l); - } - public int returnDef(HashMap map, Character c){ - if (map.get(c) == null){ - return -1; - } - return map.get(c); - } -} -``` + From 800ee1ea6dbfd4341b7dc23c21b250ed811a354c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 22 Nov 2017 22:10:42 -0600 Subject: [PATCH 044/473] =?UTF-8?q?Create=20=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\346\200\273\347\273\223.md" | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 "\346\200\273\347\273\223.md" diff --git "a/\346\200\273\347\273\223.md" "b/\346\200\273\347\273\223.md" new file mode 100644 index 000000000..6621c78e4 --- /dev/null +++ "b/\346\200\273\347\273\223.md" @@ -0,0 +1,2 @@ +# 1 +solution下自定义函数func(self, fargs, *args, **kwargs), 调用时self.func()的格式 From 19585c901ada10295ac1bc8a05a777aa6d50aa6c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 22 Nov 2017 22:42:16 -0600 Subject: [PATCH 045/473] Update 004._median_of_two_sorted_arrays.md --- 004._median_of_two_sorted_arrays.md | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/004._median_of_two_sorted_arrays.md b/004._median_of_two_sorted_arrays.md index f5d0a0c07..5b5dcf95f 100644 --- a/004._median_of_two_sorted_arrays.md +++ b/004._median_of_two_sorted_arrays.md @@ -98,8 +98,41 @@ class Solution(object): if b is None or (a is not None and a < b): return self.findKth(A[k/2:], B, k - k/2)   return self.findKth(A, B[k/2:],k - k/2) #这里要注意:因为 k/2 不一定 等于 (k - k/2), + + +``` +```python3 #python3里面要用向下取整函数才可以AC,否则报错,TypeError: list indices must be integers or slices, not float +from math import floor +class Solution: + def findMedianSortedArrays(self, nums1, nums2): + """ + :type nums1: List[int] + :type nums2: List[int] + :rtype: float + """ + n = len(nums1) + len(nums2) + if n % 2 == 1: + return self.findKth(nums1, nums2, floor(n/2)+1) + else: + smaller = self.findKth(nums1, nums2, floor(n/2)) + bigger = self.findKth(nums1, nums2, floor(n/2)+1) + return (smaller + bigger) / 2.0 + def findKth(self, A, B, k): + + if len(A) == 0: + return B[k-1] + if len(B) == 0: + return A[k-1] + if k == 1: + return min(A[0], B[0]) + a = A[floor(k/2)-1] if len(A) >= k/2 else None + b = B[floor(k/2)-1] if len(B) >= k/2 else None + if b is None or (a is not None and a < b): + return self.findKth(A[floor(k/2):], B, k - floor(k/2)) + else: + return self.findKth(A, B[floor(k/2):], k - floor(k/2)) ``` 这个findKth的算法单独抽出来也是题目。 From ae35b547b1355504d597baa79cbeb18da3278e49 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 22 Nov 2017 22:42:48 -0600 Subject: [PATCH 046/473] Update 004._median_of_two_sorted_arrays.md --- 004._median_of_two_sorted_arrays.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/004._median_of_two_sorted_arrays.md b/004._median_of_two_sorted_arrays.md index 5b5dcf95f..4c59a14db 100644 --- a/004._median_of_two_sorted_arrays.md +++ b/004._median_of_two_sorted_arrays.md @@ -101,7 +101,7 @@ class Solution(object): ``` -```python3 +```python #python3里面要用向下取整函数才可以AC,否则报错,TypeError: list indices must be integers or slices, not float from math import floor From b97fba24ac066fd8de1a7f85a8ff758048527906 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 22 Nov 2017 22:45:19 -0600 Subject: [PATCH 047/473] Update 002._add_two_numbers.md --- 002._add_two_numbers.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/002._add_two_numbers.md b/002._add_two_numbers.md index 828fd7610..534275a10 100644 --- a/002._add_two_numbers.md +++ b/002._add_two_numbers.md @@ -1,16 +1,16 @@ -###2. Add Two Numbers - -题目: - - - -难度 : Medium - - -跟plus One, add Binary 玩的同一种花样 - - -``` +###2. Add Two Numbers + +题目: + + + +难度 : Medium + + +跟plus One, add Binary 玩的同一种花样 + + +```python class Solution(object): def addTwoNumbers(self, l1, l2): """ @@ -33,5 +33,5 @@ class Solution(object): tmp = ListNode(1) tmp.next = None l3.next = self.addTwoNumbers(l1.next, self.addTwoNumbers(l2.next ,tmp)) - return l3 -``` + return l3 +``` From b79f0242e76cf48dc423e45201115e302e30aa95 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 15:10:59 -0600 Subject: [PATCH 048/473] Update 647._Palindromic_Substrings.md --- 647._Palindromic_Substrings.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/647._Palindromic_Substrings.md b/647._Palindromic_Substrings.md index 6b99a5d87..3aa4475bf 100644 --- a/647._Palindromic_Substrings.md +++ b/647._Palindromic_Substrings.md @@ -1,4 +1,4 @@ -###647. Palindromic Substrings +### 647. Palindromic Substrings 题目: From f6c11410d5c48aeb4fd66fff550f574c31f82e98 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 15:26:55 -0600 Subject: [PATCH 049/473] Update 647._Palindromic_Substrings.md --- 647._Palindromic_Substrings.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/647._Palindromic_Substrings.md b/647._Palindromic_Substrings.md index 3aa4475bf..c50c2ad45 100644 --- a/647._Palindromic_Substrings.md +++ b/647._Palindromic_Substrings.md @@ -12,16 +12,20 @@ Medium 思路 这道题要求给定一个字符串中的所有回文子串的个数,所以我想到了Manacher算法, +[Manacher算法](https://www.felix021.com/blog/read.php?2040) + Manacher算法增加两个辅助变量id和mx,其中id表示最大回文子串中心的位置,mx则为id+P[id],也就是最大回文子串的边界。得到一个很重要的结论: -- 如果mx > i,那么P[i] >= Min(P[2 * id - i], mx - i) +- 如果mx > i,那么P[i] >= Min(P[2 * id - i], mx - i) . 为什么这样说呢,下面解释 下面,令j = 2*id - i,也就是说j是i关于id的对称点。 - 当 mx - i > P[j] 的时候,以S[j]为中心的回文子串包含在以S[id]为中心的回文子串中,由于i和j对称,以S[i]为中心的回文子串必然包含在以S[id]为中心的回文子串中,所以必有P[i] = P[j]; +![](https://github.com/Lisanaaa/myTODOs/blob/master/manacher1.png) - 当 P[j] >= mx - i 的时候,以S[j]为中心的回文子串不一定完全包含于以S[id]为中心的回文子串中,但是基于对称性可知,下图中两个绿框所包围的部分是相同的,也就是说以S[i]为中心的回文子串,其向右至少会扩张到mx的位置,也就是说 P[i] >= mx - i。至于mx之后的部分是否对称,再具体匹配。 - +![](https://github.com/Lisanaaa/myTODOs/blob/master/manacher2.png) +所以P[i] >= Min(P[2 * id - i], mx - i),因为以j为中心的绘回文子串的左边界可能会比mx关于id的对称点要大,此时只能证明P[i]=P[2 * id - i] - 此外,对于 mx <= i 的情况,因为无法对 P[i]做更多的假设,只能让P[i] = 1,然后再去匹配。 最后,当P[i]等于1时,即以它为中心的回文子串就只有它自己的时候。但是其实这个字符本身也是一个回文子串,所以叠加的形式是count += (P[i]+1)/2 From db5bb2a06f78e5ab686c46eee88debc9ecba1c4c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 15:27:10 -0600 Subject: [PATCH 050/473] Update 005._longest_palindromic_substring.md --- 005._longest_palindromic_substring.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/005._longest_palindromic_substring.md b/005._longest_palindromic_substring.md index da5949b7c..05b09f01d 100644 --- a/005._longest_palindromic_substring.md +++ b/005._longest_palindromic_substring.md @@ -1,4 +1,4 @@ -5. Longest Palindromic Substring +### 5. Longest Palindromic Substring 题目: @@ -175,6 +175,20 @@ we check if the substring’s indices are the same as the reversed substring’s 思路3: [Manacher算法](https://www.felix021.com/blog/read.php?2040) + +Manacher算法增加两个辅助变量id和mx,其中id表示最大回文子串中心的位置,mx则为id+P[id],也就是最大回文子串的边界。得到一个很重要的结论: + +- 如果mx > i,那么P[i] >= Min(P[2 * id - i], mx - i) . 为什么这样说呢,下面解释 + +下面,令j = 2*id - i,也就是说j是i关于id的对称点。 + +- 当 mx - i > P[j] 的时候,以S[j]为中心的回文子串包含在以S[id]为中心的回文子串中,由于i和j对称,以S[i]为中心的回文子串必然包含在以S[id]为中心的回文子串中,所以必有P[i] = P[j]; +![](https://github.com/Lisanaaa/myTODOs/blob/master/manacher1.png) + +- 当 P[j] >= mx - i 的时候,以S[j]为中心的回文子串不一定完全包含于以S[id]为中心的回文子串中,但是基于对称性可知,下图中两个绿框所包围的部分是相同的,也就是说以S[i]为中心的回文子串,其向右至少会扩张到mx的位置,也就是说 P[i] >= mx - i。至于mx之后的部分是否对称,再具体匹配。 +![](https://github.com/Lisanaaa/myTODOs/blob/master/manacher2.png) +所以P[i] >= Min(P[2 * id - i], mx - i),因为以j为中心的绘回文子串的左边界可能会比mx关于id的对称点要大,此时只能证明P[i]=P[2 * id - i] +- 此外,对于 mx <= i 的情况,因为无法对 P[i]做更多的假设,只能让P[i] = 1,然后再去匹配。 ```python class Solution(object): def longestPalindrome(self, s): From 626b0809fb8e22ad8193edb11464cefe377d21c3 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 15:46:16 -0600 Subject: [PATCH 051/473] Update 005._longest_palindromic_substring.md --- 005._longest_palindromic_substring.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/005._longest_palindromic_substring.md b/005._longest_palindromic_substring.md index 05b09f01d..ab4716a09 100644 --- a/005._longest_palindromic_substring.md +++ b/005._longest_palindromic_substring.md @@ -189,6 +189,12 @@ Manacher算法增加两个辅助变量id和mx,其中id表示最大回文子串 ![](https://github.com/Lisanaaa/myTODOs/blob/master/manacher2.png) 所以P[i] >= Min(P[2 * id - i], mx - i),因为以j为中心的绘回文子串的左边界可能会比mx关于id的对称点要大,此时只能证明P[i]=P[2 * id - i] - 此外,对于 mx <= i 的情况,因为无法对 P[i]做更多的假设,只能让P[i] = 1,然后再去匹配。 + +在下面的程序中我的P数组保存的是该回文子串的长度(包含当前字符自身) + + +简单地用 + ```python class Solution(object): def longestPalindrome(self, s): @@ -217,8 +223,8 @@ class Solution(object): P[i] += 1 if (i + P[i]) > mx: id, mx = i, i + P[i] - max_i = 0 - for i in range(1, len(T)-1): +        max_i = 0 #保存的是当前最大回文子串中心位置的index +        for i in range(1, len(T)-1): if P[i] > P[max_i]: max_i = i start = (max_i - P[max_i] - 1) / 2 From 5b50283adfe408602486b0c4ca1843f5c9de5871 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 16:11:53 -0600 Subject: [PATCH 052/473] Update 005._longest_palindromic_substring.md --- 005._longest_palindromic_substring.md | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/005._longest_palindromic_substring.md b/005._longest_palindromic_substring.md index ab4716a09..1c84245f1 100644 --- a/005._longest_palindromic_substring.md +++ b/005._longest_palindromic_substring.md @@ -31,7 +31,7 @@ LCSuff(S1...p, T1...q) = LCS(S1...p1, T1...q-1) if S[p] = T[q] else 0 https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Longest_common_substring#Python_2 这样也超时? - +```python class Solution(object): def longestPalindrome(self, s): """ @@ -53,7 +53,7 @@ https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Longest_common_su return s1[x_longest - longest: x_longest] return lcs(s, s[::-1]) - +``` 因为以为这样s[::-1]已经很快了. 这个方法是buggy的,看字符串abcxgcba,它reverse之后是abcgxcba,它们有公共字符串,但是这里面没有回文,修复方式是: @@ -82,7 +82,7 @@ we check if the substring’s indices are the same as the reversed substring’s 依次把每一个字符当做回文字符串的中间字符,找到以该字符为中间字符的回文串的最大长度。分别对奇偶的情况进行讨论,接下来的关键就是对边界的把握,确保下标不要越界。当子串已经包含首字符或最后一个字符且此时还是回文串的时候,下标分别会向两边多移一位,需要补回来。 参考https://shenjie1993.gitbooks.io/leetcode-python/content/005%20Longest%20Palindromic%20Substring.html - +```python class Solution(object): def longestPalindrome(self, s): """ @@ -134,9 +134,9 @@ we check if the substring’s indices are the same as the reversed substring’s m = c b = True return s[l:r] - +``` 以上是参考版本,自己写的版本: - +```python class Solution(object): def longestPalindrome(self, s): """ @@ -169,7 +169,7 @@ we check if the substring’s indices are the same as the reversed substring’s return s[l:r+1] - +``` 思路3: @@ -190,10 +190,16 @@ Manacher算法增加两个辅助变量id和mx,其中id表示最大回文子串 所以P[i] >= Min(P[2 * id - i], mx - i),因为以j为中心的绘回文子串的左边界可能会比mx关于id的对称点要大,此时只能证明P[i]=P[2 * id - i] - 此外,对于 mx <= i 的情况,因为无法对 P[i]做更多的假设,只能让P[i] = 1,然后再去匹配。 -在下面的程序中我的P数组保存的是该回文子串的长度(包含当前字符自身) +在下面的程序中我的P数组保存的是,以当前字符为回文子串中心时,该回文子串的长度(不包含当前字符自身) + + +简单地用一个小例子来解释:原字符串为'qacbcaw',一眼就可以看出来最大回文子串是'acbca', +index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 +mod-s ^ # q # a # c # b # c # a # w # $ +P数组 0 0 1 0 1 0 1 0 5 0 1 0 1 0 1 0 0 -简单地用 +所以最终代码中的max_i就是字符'b'所对应的index8,start的值就是(max_i - P[max_i] - 1) / 2 = 1,最终输出结果为s[1:6],即‘acbca’ ```python class Solution(object): From 8837bca30aa47f7779aedf75d4a32fa4b40cdeca Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 16:23:34 -0600 Subject: [PATCH 053/473] Update 005._longest_palindromic_substring.md --- 005._longest_palindromic_substring.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/005._longest_palindromic_substring.md b/005._longest_palindromic_substring.md index 1c84245f1..433406a21 100644 --- a/005._longest_palindromic_substring.md +++ b/005._longest_palindromic_substring.md @@ -195,9 +195,13 @@ Manacher算法增加两个辅助变量id和mx,其中id表示最大回文子串 简单地用一个小例子来解释:原字符串为'qacbcaw',一眼就可以看出来最大回文子串是'acbca', -index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 -mod-s ^ # q # a # c # b # c # a # w # $ -P数组 0 0 1 0 1 0 1 0 5 0 1 0 1 0 1 0 0 + index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + Modified-string ^ # q # a # c # b # c # a # w # $ + P-array 0 0 1 0 1 0 1 0 5 0 1 0 1 0 1 0 0 + + + + 所以最终代码中的max_i就是字符'b'所对应的index8,start的值就是(max_i - P[max_i] - 1) / 2 = 1,最终输出结果为s[1:6],即‘acbca’ From 1ef251518b753d29f4830e165f1e5ad4cd3981f5 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 16:29:14 -0600 Subject: [PATCH 054/473] Update 005._longest_palindromic_substring.md --- 005._longest_palindromic_substring.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/005._longest_palindromic_substring.md b/005._longest_palindromic_substring.md index 433406a21..3ea04f398 100644 --- a/005._longest_palindromic_substring.md +++ b/005._longest_palindromic_substring.md @@ -195,11 +195,7 @@ Manacher算法增加两个辅助变量id和mx,其中id表示最大回文子串 简单地用一个小例子来解释:原字符串为'qacbcaw',一眼就可以看出来最大回文子串是'acbca', - index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 - Modified-string ^ # q # a # c # b # c # a # w # $ - P-array 0 0 1 0 1 0 1 0 5 0 1 0 1 0 1 0 0 - - +![](https://github.com/Lisanaaa/myTODOs/blob/master/manacher3.png) From d2fc7c0a8c71f89ac3a2caeee92ea195f326e9df Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 16:31:53 -0600 Subject: [PATCH 055/473] Update 005._longest_palindromic_substring.md --- 005._longest_palindromic_substring.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/005._longest_palindromic_substring.md b/005._longest_palindromic_substring.md index 3ea04f398..c66315feb 100644 --- a/005._longest_palindromic_substring.md +++ b/005._longest_palindromic_substring.md @@ -195,7 +195,7 @@ Manacher算法增加两个辅助变量id和mx,其中id表示最大回文子串 简单地用一个小例子来解释:原字符串为'qacbcaw',一眼就可以看出来最大回文子串是'acbca', -![](https://github.com/Lisanaaa/myTODOs/blob/master/manacher3.png) +![](https://github.com/Lisanaaa/myTODOs/blob/master/manacher3.jpg) From 44d1a77dac2e25a9a5aafc6a01655c56d77335cd Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 16:40:06 -0600 Subject: [PATCH 056/473] Update 005._longest_palindromic_substring.md --- 005._longest_palindromic_substring.md | 1 + 1 file changed, 1 insertion(+) diff --git a/005._longest_palindromic_substring.md b/005._longest_palindromic_substring.md index c66315feb..9de5e248e 100644 --- a/005._longest_palindromic_substring.md +++ b/005._longest_palindromic_substring.md @@ -194,6 +194,7 @@ Manacher算法增加两个辅助变量id和mx,其中id表示最大回文子串 简单地用一个小例子来解释:原字符串为'qacbcaw',一眼就可以看出来最大回文子串是'acbca', +下面是我做的图,累shi了! ![](https://github.com/Lisanaaa/myTODOs/blob/master/manacher3.jpg) From 49cb28678d11e12894a5adf4a04c3798d1d07a2c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 16:41:43 -0600 Subject: [PATCH 057/473] Update 647._Palindromic_Substrings.md --- 647._Palindromic_Substrings.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/647._Palindromic_Substrings.md b/647._Palindromic_Substrings.md index c50c2ad45..f867560d6 100644 --- a/647._Palindromic_Substrings.md +++ b/647._Palindromic_Substrings.md @@ -27,6 +27,8 @@ Manacher算法增加两个辅助变量id和mx,其中id表示最大回文子串 ![](https://github.com/Lisanaaa/myTODOs/blob/master/manacher2.png) 所以P[i] >= Min(P[2 * id - i], mx - i),因为以j为中心的绘回文子串的左边界可能会比mx关于id的对称点要大,此时只能证明P[i]=P[2 * id - i] - 此外,对于 mx <= i 的情况,因为无法对 P[i]做更多的假设,只能让P[i] = 1,然后再去匹配。 +此题还可以借鉴我leetcode第5题的解析, +[lc5](https://github.com/Lisanaaa/thinking_in_lc/blob/master/005._longest_palindromic_substring.md) 最后,当P[i]等于1时,即以它为中心的回文子串就只有它自己的时候。但是其实这个字符本身也是一个回文子串,所以叠加的形式是count += (P[i]+1)/2 From d6935d7c237de58664c3813a7c56b42b401765c6 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 16:42:21 -0600 Subject: [PATCH 058/473] Update 647._Palindromic_Substrings.md --- 647._Palindromic_Substrings.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/647._Palindromic_Substrings.md b/647._Palindromic_Substrings.md index f867560d6..cfd99f47c 100644 --- a/647._Palindromic_Substrings.md +++ b/647._Palindromic_Substrings.md @@ -28,7 +28,7 @@ Manacher算法增加两个辅助变量id和mx,其中id表示最大回文子串 所以P[i] >= Min(P[2 * id - i], mx - i),因为以j为中心的绘回文子串的左边界可能会比mx关于id的对称点要大,此时只能证明P[i]=P[2 * id - i] - 此外,对于 mx <= i 的情况,因为无法对 P[i]做更多的假设,只能让P[i] = 1,然后再去匹配。 此题还可以借鉴我leetcode第5题的解析, -[lc5](https://github.com/Lisanaaa/thinking_in_lc/blob/master/005._longest_palindromic_substring.md) +[thining-in-lc-5](https://github.com/Lisanaaa/thinking_in_lc/blob/master/005._longest_palindromic_substring.md) 最后,当P[i]等于1时,即以它为中心的回文子串就只有它自己的时候。但是其实这个字符本身也是一个回文子串,所以叠加的形式是count += (P[i]+1)/2 From 512e967d05e1469b0675db72398603523ffc2bec Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 16:44:41 -0600 Subject: [PATCH 059/473] Update 005._longest_palindromic_substring.md --- 005._longest_palindromic_substring.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/005._longest_palindromic_substring.md b/005._longest_palindromic_substring.md index 9de5e248e..f468efc05 100644 --- a/005._longest_palindromic_substring.md +++ b/005._longest_palindromic_substring.md @@ -237,6 +237,6 @@ class Solution(object): start = (max_i - P[max_i] - 1) / 2 return s[start : start + P[max_i]] ``` - +还可以转到[647题](https://github.com/Lisanaaa/thinking_in_lc/blob/master/647._Palindromic_Substrings.md)去看一看,也可以用这个算法解 From 0ee21ca13caeb213659fd1e244f4dfa5e34507f8 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 16:50:10 -0600 Subject: [PATCH 060/473] Update 005._longest_palindromic_substring.md --- 005._longest_palindromic_substring.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/005._longest_palindromic_substring.md b/005._longest_palindromic_substring.md index f468efc05..4a76b65ab 100644 --- a/005._longest_palindromic_substring.md +++ b/005._longest_palindromic_substring.md @@ -220,8 +220,8 @@ class Solution(object): T = preProcess(s) P = [0] * len(T) id, mx = 0, 0 - for i in range(1,len(T) - 1): - j = 2*id - i +        for i in range(1,len(T) - 1): #首尾两个字符不需要处理 +            j = 2*id - i if mx > i: P[i] = min(mx - i, P[j]) else: From 6ff69d3224293bee782f802a8ceb8d74fb13494d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 17:03:05 -0600 Subject: [PATCH 061/473] Update 005._longest_palindromic_substring.md --- 005._longest_palindromic_substring.md | 1 + 1 file changed, 1 insertion(+) diff --git a/005._longest_palindromic_substring.md b/005._longest_palindromic_substring.md index 4a76b65ab..eb240a4b0 100644 --- a/005._longest_palindromic_substring.md +++ b/005._longest_palindromic_substring.md @@ -237,6 +237,7 @@ class Solution(object): start = (max_i - P[max_i] - 1) / 2 return s[start : start + P[max_i]] ``` +run code的时候结果会跟expected不一样,但是该input确实2个结果都可以,所以放心地submit吧 还可以转到[647题](https://github.com/Lisanaaa/thinking_in_lc/blob/master/647._Palindromic_Substrings.md)去看一看,也可以用这个算法解 From ff7ca5b3445dc9d9b7e9c331ab5dc2402488e448 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 17:25:05 -0600 Subject: [PATCH 062/473] Update 647._Palindromic_Substrings.md --- 647._Palindromic_Substrings.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/647._Palindromic_Substrings.md b/647._Palindromic_Substrings.md index cfd99f47c..1768185ac 100644 --- a/647._Palindromic_Substrings.md +++ b/647._Palindromic_Substrings.md @@ -65,6 +65,17 @@ class Solution(object): count += (P[i]+1)/2 return count ``` - +python无敌啊!!!有没有天理啊,手动滑稽!一行解法: +```python +class Solution(object): + def countSubstrings(self, s): + """ + :type s: str + :rtype: int + """ + return sum(len(os.path.commonprefix((s[:i][::-1], s[i:]))) + + len(os.path.commonprefix((s[:i][::-1], s[i + 1:]))) + 1 + for i in range(len(s))) +``` From 92ab6d7f24e89d82d85b5767039b7e9a512da06c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 17:26:10 -0600 Subject: [PATCH 063/473] Update 647._Palindromic_Substrings.md --- 647._Palindromic_Substrings.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/647._Palindromic_Substrings.md b/647._Palindromic_Substrings.md index 1768185ac..f449fd41a 100644 --- a/647._Palindromic_Substrings.md +++ b/647._Palindromic_Substrings.md @@ -65,7 +65,7 @@ class Solution(object): count += (P[i]+1)/2 return count ``` -python无敌啊!!!有没有天理啊,手动滑稽!一行解法: +python无敌啊!!!有没有天理啊,手动滑稽😏😏😏😏!一行解法: ```python class Solution(object): def countSubstrings(self, s): From bf986534fd466271eedf1110c0e6624d0d6b9565 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 17:31:00 -0600 Subject: [PATCH 064/473] Update 647._Palindromic_Substrings.md --- 647._Palindromic_Substrings.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/647._Palindromic_Substrings.md b/647._Palindromic_Substrings.md index f449fd41a..1ceca30ae 100644 --- a/647._Palindromic_Substrings.md +++ b/647._Palindromic_Substrings.md @@ -77,5 +77,7 @@ class Solution(object): + len(os.path.commonprefix((s[:i][::-1], s[i + 1:]))) + 1 for i in range(len(s))) ``` - +解释下为啥要加两次,因为回文串有以下两种形式: +- ‘abcba’ +- 'abba' From 5c292362f788550c8448d5652d62708b6ca707a2 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 18:08:12 -0600 Subject: [PATCH 065/473] Update 647._Palindromic_Substrings.md --- 647._Palindromic_Substrings.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/647._Palindromic_Substrings.md b/647._Palindromic_Substrings.md index 1ceca30ae..df119a54a 100644 --- a/647._Palindromic_Substrings.md +++ b/647._Palindromic_Substrings.md @@ -30,7 +30,12 @@ Manacher算法增加两个辅助变量id和mx,其中id表示最大回文子串 此题还可以借鉴我leetcode第5题的解析, [thining-in-lc-5](https://github.com/Lisanaaa/thinking_in_lc/blob/master/005._longest_palindromic_substring.md) -最后,当P[i]等于1时,即以它为中心的回文子串就只有它自己的时候。但是其实这个字符本身也是一个回文子串,所以叠加的形式是count += (P[i]+1)/2 +这道题的基本思想是将以每一个字符为中心的回文子串个数相加,还是用一个小例子来解释 +![](https://github.com/Lisanaaa/myTODOs/blob/master/manacher3.jpg) +其实,以‘#’为中心的回文子串就代表这个子串的长度是偶数,类似于'abba'这种 +但是其实这个字符本身也是一个回文子串,所以叠加的形式是count += (P[i]+1)/2,为什么呢,以下是解释: +- 对于每一个以字符‘#’为中心的回文子串,其P值绝对是偶数,所以```(P[i]+1)/2 = P[i]/2```,并不影响 +- 对于每一个以非字符‘#’为中心的回文子串,其P值绝对是奇数,这就保证了单个字母的回文子串(例如'a'也算一个回文子串)也被加起来了,因为```(P[i]+1)/2 = P[i]/2+1``` ```python From 65b1ce9d289caf2bcccf904c1df2598a30869c41 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 18:08:40 -0600 Subject: [PATCH 066/473] Update 647._Palindromic_Substrings.md --- 647._Palindromic_Substrings.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/647._Palindromic_Substrings.md b/647._Palindromic_Substrings.md index df119a54a..424aa2f7d 100644 --- a/647._Palindromic_Substrings.md +++ b/647._Palindromic_Substrings.md @@ -35,7 +35,7 @@ Manacher算法增加两个辅助变量id和mx,其中id表示最大回文子串 其实,以‘#’为中心的回文子串就代表这个子串的长度是偶数,类似于'abba'这种 但是其实这个字符本身也是一个回文子串,所以叠加的形式是count += (P[i]+1)/2,为什么呢,以下是解释: - 对于每一个以字符‘#’为中心的回文子串,其P值绝对是偶数,所以```(P[i]+1)/2 = P[i]/2```,并不影响 -- 对于每一个以非字符‘#’为中心的回文子串,其P值绝对是奇数,这就保证了单个字母的回文子串(例如'a'也算一个回文子串)也被加起来了,因为```(P[i]+1)/2 = P[i]/2+1``` +- 对于每一个以非字符‘#’为中心的回文子串,其P值绝对是奇数,这就保证了单个字母的回文子串(```例如'a'也算一个回文子串```)也被加起来了,因为```(P[i]+1)/2 = P[i]/2+1``` ```python From 66eb82373ba074e2cf7f2964f32008c3a3ac8538 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 18:32:13 -0600 Subject: [PATCH 067/473] Update 014._longest_common_prefix.md --- 014._longest_common_prefix.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/014._longest_common_prefix.md b/014._longest_common_prefix.md index 14e6247dd..325843e7f 100644 --- a/014._longest_common_prefix.md +++ b/014._longest_common_prefix.md @@ -73,4 +73,14 @@ class Solution(object): ``` -这个题解锁之后可以看到各种各样的解法,to be 读 + +python无敌啊!!!有没有天理啊,手动滑稽😏😏😏😏!一行解法: +```python +class Solution(object): + def longestCommonPrefix(self, strs): + """ + :type strs: List[str] + :rtype: str + """ + return os.path.commonprefix(strs) +``` From 36d4907f2782d18abdf7db23959c30b393c91c25 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 18:40:21 -0600 Subject: [PATCH 068/473] Update 014._longest_common_prefix.md --- 014._longest_common_prefix.md | 41 +++++++++++------------------------ 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/014._longest_common_prefix.md b/014._longest_common_prefix.md index 325843e7f..7f1ff76f4 100644 --- a/014._longest_common_prefix.md +++ b/014._longest_common_prefix.md @@ -14,44 +14,29 @@ Easy 找出最短的string,然后一个一个对比,缺点是时间复杂度会比较高,AC代码,这代码优雅程度也是负数啊 -``` +```python class Solution(object): def longestCommonPrefix(self, strs): """ :type strs: List[str] :rtype: str """ - if strs == []: return '' - - shortStr = '' - shortLen = float('inf') - - for s in strs: - if len(s) < shortLen: - shortLen = len(s) - shortStr = s - - # print shortStr, shortLen - - n = len(strs) - i = 0 - same = True - while i < shortLen and same: - j = 0 - while j < n : - if strs[j][i] != shortStr[i]: - same = False - break - j += 1 - if same: - i += 1 - else: - break - return shortStr[:i] + '''dp[i]代表前i个字符串的最大前缀串, + 如果第i+1个字符串不以dp[i]为前缀,就去掉dp[i]的最后一个字符再试一次 + 都去完了那么dp[i+1]肯定就是空串了,也就等于这时候的dp[i],因为dp[i]的每个字符已经被去完了''' + if not strs or strs == None: + return '' + dp = [strs[0]]*len(strs) + for i in range(1,len(strs)): + while not strs[i].startswith(dp[i-1]): + dp[i-1] = dp[i-1][:-1] + dp[i] = dp[i-1] + return dp[len(strs)-1] ``` + 看一下别人写的优雅程度 佳 From 738e3ee5cafe59b121464e36f012ccae14398973 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 20:42:13 -0600 Subject: [PATCH 069/473] Update 014._longest_common_prefix.md --- 014._longest_common_prefix.md | 51 +++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/014._longest_common_prefix.md b/014._longest_common_prefix.md index 7f1ff76f4..acafdc097 100644 --- a/014._longest_common_prefix.md +++ b/014._longest_common_prefix.md @@ -12,9 +12,34 @@ Easy 思路: -找出最短的string,然后一个一个对比,缺点是时间复杂度会比较高,AC代码,这代码优雅程度也是负数啊 +以一个小例子来解释,strs=['laa', 'lab', 'lac'], 如果存在LCP的话它肯定就在第一个字符串strs[0]中,并且LCP的长度肯定不会大于strs[0]的长度 +- 依次假设LCP长度为0到len(strs[0]),在每一轮循环中: +-   -只要strs中存在比当前长度i更短的string,立刻返回上一轮LCP,即strs[0][:i] +    -只要strs中存在当前index字符与LCP该index不相同的字符串,立刻返回上一轮LCP,即strs[0][:i] +如果一直没返回,说明strs[0]本身就是LCP,返回它 +``` +class Solution(object): + def longestCommonPrefix(self, strs): + """ + :type strs: List[str] + :rtype: str + """ + if not strs: + return "" + for i in range(len(strs[0])): + for str in strs: + if len(str) <= i or strs[0][i] != str[i]: + return strs[0][:i] + return strs[0] + +``` + +#### 解法2: +- dp[i]代表前i个字符串的最大前缀串, +- 如果第i+1个字符串不以dp[i]为前缀,就去掉dp[i]的最后一个字符再试一次 +- 都去完了那么dp[i+1]肯定就是空串了,也就等于这时候的dp[i],因为dp[i]的每个字符已经被去完了 ```python class Solution(object): def longestCommonPrefix(self, strs): @@ -22,10 +47,8 @@ class Solution(object): :type strs: List[str] :rtype: str """ - '''dp[i]代表前i个字符串的最大前缀串, - 如果第i+1个字符串不以dp[i]为前缀,就去掉dp[i]的最后一个字符再试一次 - 都去完了那么dp[i+1]肯定就是空串了,也就等于这时候的dp[i],因为dp[i]的每个字符已经被去完了''' - if not strs or strs == None: + + if not strs: return '' dp = [strs[0]]*len(strs) for i in range(1,len(strs)): @@ -37,26 +60,8 @@ class Solution(object): -看一下别人写的优雅程度 佳 -``` -class Solution(object): - def longestCommonPrefix(self, strs): - """ - :type strs: List[str] - :rtype: str - """ - if not strs: - return "" - longest = strs[0] - for i in range(len(strs[0])): - for str in strs: - if len(str) <= i or strs[0][i] != str[i]: - return strs[0][:i] - return strs[0] - -``` python无敌啊!!!有没有天理啊,手动滑稽😏😏😏😏!一行解法: From 5a17d52831c626a27f66a4f8a4a2022cfad4e94c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 20:43:28 -0600 Subject: [PATCH 070/473] =?UTF-8?q?Update=20=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\346\200\273\347\273\223.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/\346\200\273\347\273\223.md" "b/\346\200\273\347\273\223.md" index 6621c78e4..2d86b7207 100644 --- "a/\346\200\273\347\273\223.md" +++ "b/\346\200\273\347\273\223.md" @@ -1,2 +1,5 @@ # 1 solution下自定义函数func(self, fargs, *args, **kwargs), 调用时self.func()的格式 + +# 2 +not fargs 和 fargs == None不一样,前者可能为[], '', 0等等 From 6ffffe1230afb27c1bff147df907cf25525c8b1a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 20:44:08 -0600 Subject: [PATCH 071/473] =?UTF-8?q?Update=20=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\346\200\273\347\273\223.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/\346\200\273\347\273\223.md" "b/\346\200\273\347\273\223.md" index 2d86b7207..436593603 100644 --- "a/\346\200\273\347\273\223.md" +++ "b/\346\200\273\347\273\223.md" @@ -1,5 +1,5 @@ # 1 -solution下自定义函数func(self, fargs, *args, **kwargs), 调用时self.func()的格式 +```solution```下自定义函数```func(self, fargs, *args, **kwargs)```, 调用时使用```self.func()```的格式 # 2 -not fargs 和 fargs == None不一样,前者可能为[], '', 0等等 +```not fargs``` 和 ```fargs == None```不一样,前者可能为[], '', 0等等 From 21eabf212ddc57402f990aa1d70a9b04e248b20e Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 20:44:36 -0600 Subject: [PATCH 072/473] =?UTF-8?q?Update=20=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/\346\200\273\347\273\223.md" "b/\346\200\273\347\273\223.md" index 436593603..6875cbe28 100644 --- "a/\346\200\273\347\273\223.md" +++ "b/\346\200\273\347\273\223.md" @@ -2,4 +2,4 @@ ```solution```下自定义函数```func(self, fargs, *args, **kwargs)```, 调用时使用```self.func()```的格式 # 2 -```not fargs``` 和 ```fargs == None```不一样,前者可能为[], '', 0等等 +```not fargs``` 和 ```fargs == None```不一样,前者```fargs```可能为[], '', 0, etc From 76d35ef273793ae45cd3520e40cc1c3ead47ffc2 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 20:50:17 -0600 Subject: [PATCH 073/473] Update 014._longest_common_prefix.md --- 014._longest_common_prefix.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/014._longest_common_prefix.md b/014._longest_common_prefix.md index acafdc097..e439b5f8c 100644 --- a/014._longest_common_prefix.md +++ b/014._longest_common_prefix.md @@ -1,4 +1,4 @@ -###14. Longest Common Prefix +### 14. Longest Common Prefix 题目: @@ -47,7 +47,6 @@ class Solution(object): :type strs: List[str] :rtype: str """ - if not strs: return '' dp = [strs[0]]*len(strs) @@ -55,7 +54,7 @@ class Solution(object): while not strs[i].startswith(dp[i-1]): dp[i-1] = dp[i-1][:-1] dp[i] = dp[i-1] - return dp[len(strs)-1] + return dp[-1] ``` From 8955123b0488f91bea2e700054fee176115f37cb Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 20:51:56 -0600 Subject: [PATCH 074/473] Update 014._longest_common_prefix.md --- 014._longest_common_prefix.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/014._longest_common_prefix.md b/014._longest_common_prefix.md index e439b5f8c..a3df666d1 100644 --- a/014._longest_common_prefix.md +++ b/014._longest_common_prefix.md @@ -14,9 +14,10 @@ Easy 以一个小例子来解释,strs=['laa', 'lab', 'lac'], 如果存在LCP的话它肯定就在第一个字符串strs[0]中,并且LCP的长度肯定不会大于strs[0]的长度 - 依次假设LCP长度为0到len(strs[0]),在每一轮循环中: --   -只要strs中存在比当前长度i更短的string,立刻返回上一轮LCP,即strs[0][:i] -    -只要strs中存在当前index字符与LCP该index不相同的字符串,立刻返回上一轮LCP,即strs[0][:i] -如果一直没返回,说明strs[0]本身就是LCP,返回它 +   +- 1. 只要strs中存在比当前长度i更短的string,立刻返回上一轮LCP,即strs[0][:i] + 2. 只要strs中存在当前index字符与LCP该index不相同的字符串,立刻返回上一轮LCP,即strs[0][:i] +- 如果一直没返回,说明strs[0]本身就是LCP,返回它 ``` From d033cc43467db36d63418daaeac5075400559342 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 20:52:25 -0600 Subject: [PATCH 075/473] Update 014._longest_common_prefix.md --- 014._longest_common_prefix.md | 1 + 1 file changed, 1 insertion(+) diff --git a/014._longest_common_prefix.md b/014._longest_common_prefix.md index a3df666d1..18eb18f56 100644 --- a/014._longest_common_prefix.md +++ b/014._longest_common_prefix.md @@ -12,6 +12,7 @@ Easy 思路: +#### 解法1: 以一个小例子来解释,strs=['laa', 'lab', 'lac'], 如果存在LCP的话它肯定就在第一个字符串strs[0]中,并且LCP的长度肯定不会大于strs[0]的长度 - 依次假设LCP长度为0到len(strs[0]),在每一轮循环中:   From fccc88e29e852fed9eecfcc1cd301683588dbc32 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 20:56:59 -0600 Subject: [PATCH 076/473] Update 014._longest_common_prefix.md --- 014._longest_common_prefix.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/014._longest_common_prefix.md b/014._longest_common_prefix.md index 18eb18f56..a64997ef1 100644 --- a/014._longest_common_prefix.md +++ b/014._longest_common_prefix.md @@ -39,8 +39,8 @@ class Solution(object): ``` #### 解法2: -- dp[i]代表前i个字符串的最大前缀串, -- 如果第i+1个字符串不以dp[i]为前缀,就去掉dp[i]的最后一个字符再试一次 +- dp[i]代表前i+1个字符串的最大前缀串, +- 如果第i+2个字符串不以dp[i]为前缀,就去掉dp[i]的最后一个字符再试一次 - 都去完了那么dp[i+1]肯定就是空串了,也就等于这时候的dp[i],因为dp[i]的每个字符已经被去完了 ```python class Solution(object): From 03ee836e5a34537c34f052fdde5af21ac889da1a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 21:55:45 -0600 Subject: [PATCH 077/473] Update 007._Reverse_Integer.md --- 007._Reverse_Integer.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/007._Reverse_Integer.md b/007._Reverse_Integer.md index 96060cc4f..4d655ef04 100644 --- a/007._Reverse_Integer.md +++ b/007._Reverse_Integer.md @@ -1,4 +1,4 @@ -###7. Reverse Integer +### 7. Reverse Integer 题目: @@ -11,8 +11,10 @@ Easy 思路 +翻转数字问题需要注意的就是溢出问题,为什么会存在溢出问题呢,我们知道int型的数值范围是 -2147483648~2147483647(负的2的31次方~2的31次方-1), 那么如果我们要翻转 1000000009 这个在范围内的数得到 9000000001,而翻转后的数就超过了范围。 + +#### 解法1: 如果输入的是负数,就递归调用原函数,参数变成-x即可 -最后要处理overflow ```python @@ -30,24 +32,22 @@ class Solution(object): x /= 10 return res if res <= 0x7fffffff else 0 ``` - +#### 解法2: +按照参数正负号先将其转成字符串,然后再反转,根据是否溢出决定输出0还是反转结果 ```python class Solution(object): - def reverse2(self, x): + def reverse(self, x): """ :type x: int :rtype: int - """ - if x < 0: - x = int(str(x)[::-1][-1] + str(x)[::-1][:-1]) - else: - x = int(str(x)[::-1]) + """ + x = -int(str(x)[::-1][:-1]) if x < 0 else int(str(x)[::-1]) x = 0 if abs(x) > 0x7FFFFFFF else x return x ``` ```python class Solution(object): - def reverse3(self, x): + def reverse(self, x): """ :type x: int :rtype: int From cd2ae50c9d24940d8700c9daf620be3cee50b4c0 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 22:01:08 -0600 Subject: [PATCH 078/473] Update 007._Reverse_Integer.md --- 007._Reverse_Integer.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/007._Reverse_Integer.md b/007._Reverse_Integer.md index 4d655ef04..df4154866 100644 --- a/007._Reverse_Integer.md +++ b/007._Reverse_Integer.md @@ -45,6 +45,8 @@ class Solution(object): x = 0 if abs(x) > 0x7FFFFFFF else x return x ``` +#### 解法3: +看这个解法前先看[backticks](https://docs.python.org/2.7/reference/expressions.html#string-conversions) ```python class Solution(object): def reverse(self, x): From b3b6977c1719e7f914e14bc44c347a43f743692e Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 22:02:55 -0600 Subject: [PATCH 079/473] Update 007._Reverse_Integer.md --- 007._Reverse_Integer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/007._Reverse_Integer.md b/007._Reverse_Integer.md index df4154866..82f6cbb66 100644 --- a/007._Reverse_Integer.md +++ b/007._Reverse_Integer.md @@ -45,7 +45,7 @@ class Solution(object): x = 0 if abs(x) > 0x7FFFFFFF else x return x ``` -#### 解法3: +#### 解法3(StefanPochmann大神): 看这个解法前先看[backticks](https://docs.python.org/2.7/reference/expressions.html#string-conversions) ```python class Solution(object): From 5680c451d04e9bada52ef843c93ba08e2e1a0cad Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 25 Nov 2017 22:06:38 -0600 Subject: [PATCH 080/473] Update 007._Reverse_Integer.md --- 007._Reverse_Integer.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/007._Reverse_Integer.md b/007._Reverse_Integer.md index 82f6cbb66..3b9b58273 100644 --- a/007._Reverse_Integer.md +++ b/007._Reverse_Integer.md @@ -47,6 +47,9 @@ class Solution(object): ``` #### 解法3(StefanPochmann大神): 看这个解法前先看[backticks](https://docs.python.org/2.7/reference/expressions.html#string-conversions) + + +cmp函数在python3.x中用不了了,import operator用gt或者lt吧,或者回归if/else condition爸爸的怀抱吧! ```python class Solution(object): def reverse(self, x): From 4de48070a939214755104afd0f0a6ee0173e093f Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 00:38:46 -0600 Subject: [PATCH 081/473] Create 681._Next_Closest_Time.md --- 681._Next_Closest_Time.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 681._Next_Closest_Time.md diff --git a/681._Next_Closest_Time.md b/681._Next_Closest_Time.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/681._Next_Closest_Time.md @@ -0,0 +1 @@ + From 4f9a5c6d391925a7095086b8df6a90b7663ca469 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 00:38:57 -0600 Subject: [PATCH 082/473] Update 001._two_sum.md --- 001._two_sum.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/001._two_sum.md b/001._two_sum.md index fdec21f60..b0d14b7d0 100644 --- a/001._two_sum.md +++ b/001._two_sum.md @@ -1,4 +1,4 @@ -###1. Two Sum +### 1. Two Sum 题目: From 323549a7d1c0f25b9905e209ec8ae7caf56d5103 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 00:54:35 -0600 Subject: [PATCH 083/473] Update 681._Next_Closest_Time.md --- 681._Next_Closest_Time.md | 45 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/681._Next_Closest_Time.md b/681._Next_Closest_Time.md index 8b1378917..9fda4e0e3 100644 --- a/681._Next_Closest_Time.md +++ b/681._Next_Closest_Time.md @@ -1 +1,46 @@ +### 681. Next Closest Time + + +题目: + + + +难度: + +Medium + + + +思路 + +题目说输入一个时间,format是HH:MM, 然后输出接下来最近的一个时间,且这个时间的数字必须要在输入的时间中可以找到,所以我们用```h```, ```m``` +分别代表输入时间的小时数和分钟数,然后可以计算出输入时间的总分钟数```curr```,在未来的一天之内,我们一分钟一分钟往下面试,第一个满足的就直接 +作为结果就行了. + + + + +```python +class Solution(object): + def nextClosestTime(self, time): + """ + :type time: str + :rtype: str + """ + h, m = time.split(":") +        curr = int(h) * 60 + int(m) # 这里要注意h可能会是0开头的,如输入的时间为01:22,所以需要int(h)和int(m) +        result = None + for i in xrange(curr+1, curr+1441): + t = i % 1440 + h, m = t // 60, t % 60 + result = "%02d:%02d" % (h, m) + if set(result) <= set(time): + break + return result +``` + + + + + From 01c2de1712a52100094837500042d4c0c70ff58b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 01:46:25 -0600 Subject: [PATCH 084/473] Create 687._Longest_Univalue_Path.md --- 687._Longest_Univalue_Path.md | 58 +++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 687._Longest_Univalue_Path.md diff --git a/687._Longest_Univalue_Path.md b/687._Longest_Univalue_Path.md new file mode 100644 index 000000000..0b7a2eef5 --- /dev/null +++ b/687._Longest_Univalue_Path.md @@ -0,0 +1,58 @@ +### 687. Longest Univalue Path + + +题目: + + + +难度: + +Easy + + + +思路 + +这道题也只能算个```easy```题目,根据传进来的```root```,我们只要从它的左右节点不停的递归下去,只要其```value```值与```root```一样, +该方向上的```length```就加```1```,最后我们将左右方向上的```length```相加, 递归取最大值 +##### 很重要的一点就是,Note: The length of path between two nodes is represented by the number of edges between them. +- 因此是```self.res = max(self.res, left_arrow + right_arrow)```, ```return max(left_arrow, right_arrow)``` +- 而不是```self.res = max(self.res, left_arrow + right_arrow + 1)```, ```return max(left_arrow + 1, right_arrow + 1)``` + + + + + +```python +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def longestUnivaluePath(self, root): + """ + :type root: TreeNode + :rtype: int + """ + self.res = 0 + def dir_length(node): + if not node: + return 0 + left_len = dir_length(node.left) # 左节点的length + right_len = dir_length(node.right) # 右节点的length + left_dir, right_dir = 0, 0 + if node.left and node.left.val == node.val: + left_dir = left_len + 1 # 当前节点的左节点方向的length + if node.right and node.right.val == node.val: + right_dir = right_len + 1 # 当前节点的右边节点方向的length + self.res = max(self.res, left_dir + right_dir) + return max(left_dir, right_dir) + dir_length(root) + return self.res +``` + + + From be327a69b691da50a86372a794e75d8f7991e633 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 04:37:36 -0600 Subject: [PATCH 085/473] Update 020._valid_parentheses.md --- 020._valid_parentheses.md | 58 +++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/020._valid_parentheses.md b/020._valid_parentheses.md index 3e41265df..41413b6e3 100644 --- a/020._valid_parentheses.md +++ b/020._valid_parentheses.md @@ -1,29 +1,29 @@ -###20. Valid Parentheses - -题目: - - - - -难度: - -Easy - - -虽然知道肯定是用stack来解决,但是我是看了hint才自己解答的,因为可能想复杂了。 - -因为一共只有三种状况"(" -> ")", "[" -> "]", "{" -> "}". - -一遇到左括号就入栈,右括号出栈,这样来寻找对应 - -需要检查几件事: - -- 右括号时stack里还有没有东西 -- 出stack的是否对应 -- 最终stack是否为空 - - - +### 20. Valid Parentheses + +题目: + + + + +难度: + +Easy + + +思路: + +因为一共只有三种状况"(" -> ")", "[" -> "]", "{" -> "}". + +一遇到左括号就入栈,右括号出栈,这样来寻找对应 + +需要检查几件事: + +- 出现右括号时stack里还有没有东西 +- 出stack时是否对应 +- 最终stack是否为空 + + + ``` class Solution(object): def isValid(self, s): @@ -48,6 +48,6 @@ class Solution(object): return False elif char == "}" and item != "{": return False - return stack == [] -``` - + return stack == [] +``` + From 3504897b3e0ed15337f258fb5d71e35d9ef39ddc Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 04:40:00 -0600 Subject: [PATCH 086/473] Update 020._valid_parentheses.md --- 020._valid_parentheses.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/020._valid_parentheses.md b/020._valid_parentheses.md index 41413b6e3..3b008ac91 100644 --- a/020._valid_parentheses.md +++ b/020._valid_parentheses.md @@ -10,7 +10,7 @@ Easy -思路: +### 思路: 因为一共只有三种状况"(" -> ")", "[" -> "]", "{" -> "}". @@ -24,29 +24,28 @@ Easy -``` +```python class Solution(object): def isValid(self, s): """ :type s: str :rtype: bool """ - leftP = "([{" - rightP = ")]}" - + leftP = '([{' + rightP = ')]}' stack = [] for char in s: if char in leftP: stack.append(char) - elif char in rightP: - if stack == []: - return False - item = stack.pop() - if char == "]" and item != "[": + if char in rightP: + if not stack: return False - elif char == ")" and item != "(": + tmp = stack.pop() + if char == ')' and tmp != '(': return False - elif char == "}" and item != "{": + if char == ']' and tmp != '[': + return False + if char == '}' and tmp != '{': return False return stack == [] ``` From b8d18af653deb08816103794e8697418f8543508 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 05:01:11 -0600 Subject: [PATCH 087/473] Update 467._Unique_Substrings_in_Wraparound_String.md --- 467._Unique_Substrings_in_Wraparound_String.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/467._Unique_Substrings_in_Wraparound_String.md b/467._Unique_Substrings_in_Wraparound_String.md index a4d86d0ce..d7dd32c89 100644 --- a/467._Unique_Substrings_in_Wraparound_String.md +++ b/467._Unique_Substrings_in_Wraparound_String.md @@ -1,4 +1,4 @@ -###467. Unique Substrings in Wraparound String +### 467. Unique Substrings in Wraparound String 题目: @@ -9,7 +9,7 @@ Medium -思路 +思路: 有个无限长的字符串s,是由无数个「abcdefghijklmnopqrstuvwxyz」组成的。现在给你一个字符串p,求多少个p的非空子串在s中出现了?    @@ -29,7 +29,7 @@ class Solution(object): """        letters = [0] * 26         #开始默认每个都是0        length = 0 - for i in xrange(len(p)): + for i in range(len(p)): curr = ord(p[i]) - ord('a')            if i > 0 and ord(p[i-1]) != (curr-1)%26 + ord('a'):   #一旦开始不相等了就要将length重置为0                length = 0 From 69f44979763d429afa11ec0fc548efa33339d040 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 05:01:24 -0600 Subject: [PATCH 088/473] Update 467._Unique_Substrings_in_Wraparound_String.md --- 467._Unique_Substrings_in_Wraparound_String.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/467._Unique_Substrings_in_Wraparound_String.md b/467._Unique_Substrings_in_Wraparound_String.md index d7dd32c89..85c7a9d97 100644 --- a/467._Unique_Substrings_in_Wraparound_String.md +++ b/467._Unique_Substrings_in_Wraparound_String.md @@ -20,7 +20,7 @@ Medium -``` +```python class Solution(object): def findSubstringInWraproundString(self, p): """ From a52fa5c4ee368e67e6dcfcc56fa4976ecb8d4c88 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 05:02:37 -0600 Subject: [PATCH 089/473] Update 001._two_sum.md --- 001._two_sum.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/001._two_sum.md b/001._two_sum.md index b0d14b7d0..120db871d 100644 --- a/001._two_sum.md +++ b/001._two_sum.md @@ -24,7 +24,7 @@ lookup {2:0} [0,1] 一但字典内有了这个 `target - 当前数字`,找到它的index和当前index一起返回。 -``` +```python class Solution(object): def twoSum(self, nums, target): """ From 9c4152903a5eacc49d26eb4058c157be878a64f1 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 05:03:17 -0600 Subject: [PATCH 090/473] Update 002._add_two_numbers.md --- 002._add_two_numbers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/002._add_two_numbers.md b/002._add_two_numbers.md index 534275a10..7ead7c7c4 100644 --- a/002._add_two_numbers.md +++ b/002._add_two_numbers.md @@ -1,4 +1,4 @@ -###2. Add Two Numbers +### 2. Add Two Numbers 题目: From 07647f67c91364182b141f6c47e323c6f14f1d06 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 05:16:53 -0600 Subject: [PATCH 091/473] Update 004._median_of_two_sorted_arrays.md --- 004._median_of_two_sorted_arrays.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/004._median_of_two_sorted_arrays.md b/004._median_of_two_sorted_arrays.md index 4c59a14db..8ad14bbb6 100644 --- a/004._median_of_two_sorted_arrays.md +++ b/004._median_of_two_sorted_arrays.md @@ -1,4 +1,4 @@ -###4. Median of Two Sorted Arrays +### 4. Median of Two Sorted Arrays 题目: From fb79b9c3fca8ca74ac9df89bddb9300607f631e4 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 05:32:08 -0600 Subject: [PATCH 092/473] Update 005._longest_palindromic_substring.md --- 005._longest_palindromic_substring.md | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/005._longest_palindromic_substring.md b/005._longest_palindromic_substring.md index eb240a4b0..14fd335f3 100644 --- a/005._longest_palindromic_substring.md +++ b/005._longest_palindromic_substring.md @@ -211,31 +211,29 @@ class Solution(object): """ def preProcess(s): if not s: - return ['^', '$'] + return ['^', '&'] T = ['^'] - for c in s: - T += ['#', c] + for i in s: + T += ['#', i] T += ['#', '$'] return T T = preProcess(s) P = [0] * len(T) id, mx = 0, 0 -        for i in range(1,len(T) - 1): #首尾两个字符不需要处理 -            j = 2*id - i + for i in range(1, len(T)-1): + j = 2 * id - i if mx > i: - P[i] = min(mx - i, P[j]) + P[i] = min(P[j], mx-i) else: - P[i] = 0 + P[i]= 0 while T[i+P[i]+1] == T[i-P[i]-1]: P[i] += 1 - if (i + P[i]) > mx: + if i + P[i] > mx: id, mx = i, i + P[i] -        max_i = 0 #保存的是当前最大回文子串中心位置的index -        for i in range(1, len(T)-1): - if P[i] > P[max_i]: - max_i = i + max_i = P.index(max(P)) #保存的是当前最大回文子串中心位置的index start = (max_i - P[max_i] - 1) / 2 - return s[start : start + P[max_i]] + res = s[start:start+P[max_i]] + return res ``` run code的时候结果会跟expected不一样,但是该input确实2个结果都可以,所以放心地submit吧 还可以转到[647题](https://github.com/Lisanaaa/thinking_in_lc/blob/master/647._Palindromic_Substrings.md)去看一看,也可以用这个算法解 From 110ed7486952119826fa1accc80930f19e55331f Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 05:57:52 -0600 Subject: [PATCH 093/473] Update 647._Palindromic_Substrings.md --- 647._Palindromic_Substrings.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/647._Palindromic_Substrings.md b/647._Palindromic_Substrings.md index 424aa2f7d..d10f1790e 100644 --- a/647._Palindromic_Substrings.md +++ b/647._Palindromic_Substrings.md @@ -85,4 +85,4 @@ class Solution(object): 解释下为啥要加两次,因为回文串有以下两种形式: - ‘abcba’ - 'abba' - +那为啥要加那个1呢,上面解释过了,单个字符也算是一个回文子串呀,嘻嘻😁 From c5890c748d4bc39741477c6aa42a7ad2ebb8de3d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 05:58:09 -0600 Subject: [PATCH 094/473] Update 647._Palindromic_Substrings.md --- 647._Palindromic_Substrings.md | 1 + 1 file changed, 1 insertion(+) diff --git a/647._Palindromic_Substrings.md b/647._Palindromic_Substrings.md index d10f1790e..8ee312ad5 100644 --- a/647._Palindromic_Substrings.md +++ b/647._Palindromic_Substrings.md @@ -85,4 +85,5 @@ class Solution(object): 解释下为啥要加两次,因为回文串有以下两种形式: - ‘abcba’ - 'abba' + 那为啥要加那个1呢,上面解释过了,单个字符也算是一个回文子串呀,嘻嘻😁 From 6b8b1aaa10ac4ab2b95e9ecb7562efba141cedae Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 06:19:44 -0600 Subject: [PATCH 095/473] Update 066._plus_one.md --- 066._plus_one.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/066._plus_one.md b/066._plus_one.md index af4f118ef..01954efa9 100644 --- a/066._plus_one.md +++ b/066._plus_one.md @@ -1,4 +1,4 @@ -###66. Plus One +### 66. Plus One 题目: @@ -8,9 +8,6 @@ -奇怪的AC了 -😄 -搞笑 —> 😓 这里是用的递归,很容易理解,如果空列表直接加1,最后一位小于9,那么直接就最后一位加1,否则添加一个0,然后再把余下的递归加1 From 74dfd5891f89f54776f7c26b8bd21df24b26670b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 06:19:56 -0600 Subject: [PATCH 096/473] Update 066._plus_one.md --- 066._plus_one.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/066._plus_one.md b/066._plus_one.md index 01954efa9..8897d3919 100644 --- a/066._plus_one.md +++ b/066._plus_one.md @@ -12,7 +12,7 @@ 这里是用的递归,很容易理解,如果空列表直接加1,最后一位小于9,那么直接就最后一位加1,否则添加一个0,然后再把余下的递归加1 -``` +```python class Solution(object): def plusOne(self, digits): From 32a26034a018030ffd15d560331f737525829b7b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 14:22:07 -0600 Subject: [PATCH 097/473] Create 388._Longest_Absolute_File_Path.md --- 388._Longest_Absolute_File_Path.md | 93 ++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 388._Longest_Absolute_File_Path.md diff --git a/388._Longest_Absolute_File_Path.md b/388._Longest_Absolute_File_Path.md new file mode 100644 index 000000000..b241055f7 --- /dev/null +++ b/388._Longest_Absolute_File_Path.md @@ -0,0 +1,93 @@ +### 388. Longest Absolute File Path + + +题目: + + + +难度: + +Medium + + + +思路 + +我们首先观察到每个```文件夹```或者是```文件```前面都会有一个```'\n'```, 还有对应其层数个数的```'\t'```. +- 所以首先根据```'\n'```分行,然后算出该```文件/文件夹```的层数```depth``` +- 如果是```文件```,我们需要更新```maxlen``` +- 如果是```文件夹```,我们需要更新该```depth```下的```pathlen``` + +### 程序变量解释 + +- ```maxlen``` 代表目前最大子串的长度 +- ```pathlen``` 每一个```depth```下对应的```path```长度 + +#### 特别需要注意的是,```'\t'```的长度是1 +有的人仍然会有疑问,每次碰到文件夹都直接更新```pathlen```会不会导致本来长的反而变得短了,但是我们可以看到字符串的排版格式,每层```path```都是严格有自己的分级的, +因此不会出现这样的问题。 +例如: +- The string ```"dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext"``` represents: +``` +dir + subdir1 + file1.ext + subsubdir1 + subdir2 + subsubdir2 + file2.ext +``` +其最大长度是```32```, ```"dir/subdir2/subsubdir2/file2.ext"``` + +- 如果变成```"dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir20\n\t\tsubsubdir2\n\t\t\tfile2.ext"```, + +``` +dir + subdir1 + file1.ext + subsubdir1 + subdir20 + subsubdir2 + file2.ext +``` + +最大长度就是```33```, +```"dir/subdir2/subsubdir20/file2.ext"``` + + +- 如果变成 +```"dir\n\tsubdir1000000000000\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext"``` + +``` +dir + subdir10000000000000 + file1.ext + subsubdir1 + subdir20 + subsubdir2 + file2.ext +``` + +最大长度就是```34```,```"dir/subdir10000000000000/file1.ext"``` + + +```python +class Solution(object): + def lengthLongestPath(self, input): + """ + :type input: str + :rtype: int + """ + maxlen = 0 + pathlen = {0 : 0} + for line in input.splitlines(): + name = line.lstrip('\t') + depth = len(line) - len(name) # 前面有几个'\t', depth就是几 + if '.' in name: + maxlen = max(maxlen, pathlen[depth] + len(name)) + else: + pathlen[depth+1] = pathlen[depth] + len(name) + 1 #加1是为了加上'\t'的长度 + return maxlen +``` + + From 7f53fcdc2d3000f9c9d2c25a610e58bb9ddda581 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 15:58:43 -0600 Subject: [PATCH 098/473] =?UTF-8?q?Update=20Binary=20Search=20=E4=B8=8D?= =?UTF-8?q?=E6=98=93=E5=86=99.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "Binary Search \344\270\215\346\230\223\345\206\231.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Binary Search \344\270\215\346\230\223\345\206\231.md" "b/Binary Search \344\270\215\346\230\223\345\206\231.md" index 9a09b8ac9..bd65c3c65 100644 --- "a/Binary Search \344\270\215\346\230\223\345\206\231.md" +++ "b/Binary Search \344\270\215\346\230\223\345\206\231.md" @@ -55,7 +55,7 @@ def binarySearch(nums, target): mid = l + ((r-l) >> 2) if nums[mid] > target: r = mid - 1 - elif: + elif nums[mid] < target: l = mid + 1 else: return mid From a3d49e9a076424a2f7e7faad7759b64da1ed4003 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 18:28:17 -0600 Subject: [PATCH 099/473] Update 070. Climbing Stairs.md --- 070. Climbing Stairs.md | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/070. Climbing Stairs.md b/070. Climbing Stairs.md index 10df88fcc..0b80b4419 100644 --- a/070. Climbing Stairs.md +++ b/070. Climbing Stairs.md @@ -1,4 +1,4 @@ -###70. Climbing Stairs +### 70. Climbing Stairs 题目: @@ -12,10 +12,10 @@ Easy Fibonacci 的DP版本 -对于DP的不同理解造成不同的写法 - -- memoize - +对于DP的不同理解造成不同的写法 +Memoization will usually add on your time-complexity to your space-complexity (e.g. with tabulation you have more liberty to throw away calculations, like using tabulation with Fib lets you use O(1) space, but memoization with Fib uses O(N) stack space). +详看[Dynamic programming and memoization: bottom-up vs top-down approaches](https://stackoverflow.com/questions/6164629/dynamic-programming-and-memoization-bottom-up-vs-top-down-approaches) +- top-down(memorize) ``` memo = {} @@ -27,26 +27,23 @@ def fib(n): memo[n] = f return f ``` -- bottom up +- bottom up(tabulation) ``` fib = {} for k in range(n): if k <= 2 : f = 1 - else: f = fib[n-1] + fib[n-2] + else: f = fib[k-1] + fib[k-2] fib[k] = f -return fib(n) +return fib[n] ``` - -感觉针对这个问题,我觉得bottom up更容易理解一点,其实就是倒着往大的长树, - 这里memo用dict,用array也一样。当然用bottom up还有一点,可以只存每次最后两个数,可以save space.,这样就只用到constant space. AC 代码 -``` +```python class Solution(object): def climbStairs(self, n): """ @@ -54,12 +51,12 @@ class Solution(object): :rtype: int """ memo = {} + memo[2] = 2 memo[1] = 1 - memo[0] = 1 - for i in range(2,n+1): - f = memo[i-1] + memo[i-2] - memo[i] = f + for i in range(3,n+1): + f = memo[i-1] + memo[i-2] # 这里用一个临时变量f来存储值,所以不用像memorize方法一样一直保存着 + memo[i] = f # 因此永远只存每次最后两个数,save space return memo[n] ``` From 8b96d7ed852705288f2aa293293e6e00ea2049a9 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 18:55:55 -0600 Subject: [PATCH 100/473] Update 070. Climbing Stairs.md --- 070. Climbing Stairs.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/070. Climbing Stairs.md b/070. Climbing Stairs.md index 0b80b4419..079c2ae10 100644 --- a/070. Climbing Stairs.md +++ b/070. Climbing Stairs.md @@ -59,6 +59,13 @@ class Solution(object): memo[i] = f # 因此永远只存每次最后两个数,save space return memo[n] ``` +- Complexity Analysis + - Time complexity : O(log(n))O(log(n)). powpow method takes log(n)log(n) time. + + - Space complexity : O(1)O(1). Constant space is used. +另外还有一个公式法: +$F_{n} = \cfrac{1}{\sqrt{5}}$ +质能方程$$E = mc^2$$ From d190a8ef8a7ade8293b6ddb2d235b564ed53e0f2 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 19:58:26 -0600 Subject: [PATCH 101/473] Update 070. Climbing Stairs.md --- 070. Climbing Stairs.md | 82 ++++++++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 30 deletions(-) diff --git a/070. Climbing Stairs.md b/070. Climbing Stairs.md index 079c2ae10..6572b7ca8 100644 --- a/070. Climbing Stairs.md +++ b/070. Climbing Stairs.md @@ -14,34 +14,46 @@ Fibonacci 的DP版本 对于DP的不同理解造成不同的写法 Memoization will usually add on your time-complexity to your space-complexity (e.g. with tabulation you have more liberty to throw away calculations, like using tabulation with Fib lets you use O(1) space, but memoization with Fib uses O(N) stack space). -详看[Dynamic programming and memoization: bottom-up vs top-down approaches](https://stackoverflow.com/questions/6164629/dynamic-programming-and-memoization-bottom-up-vs-top-down-approaches) +详看 + +[Dynamic programming and memoization: bottom-up vs top-down approaches](https://awjin.me/algos-js/dp/tab-memo.html) + +[Tabulation vs Memoizatation](http://www.geeksforgeeks.org/tabulation-vs-memoizatation/) - top-down(memorize) ``` -memo = {} -def fib(n): - if n in memo: return memo[n] - else: - if n <= 2 : f = 1 - else: f = fib(n-1) + fib(n-2) - memo[n] = f - return f +def memorize_fib(n): # n为第几个Fibonacci数 + memo = {1:1, 2:1} + if n in memo: + return memo[n] + else: + memo[n] = memorize_fib(n-1) + memorize_fib(n-2) + return memo[n] + +print(memorize_fib(4)) ``` +输出```3``` + + - bottom up(tabulation) ``` -fib = {} -for k in range(n): - if k <= 2 : f = 1 - else: f = fib[k-1] + fib[k-2] - fib[k] = f -return fib[n] +def tabulation_fib(n): # n为第几个Fibonacci数 + fib = [1, 1, 2] + if n < 4: + return fib[n-1] + for k in range(3, n+1): + fib[2] = fib[0] + fib[1] + fib[0], fib[1] = fib[1], fib[2] + return fib[2] + +print(tabulation_fib(4)) ``` - +输出```3``` 这里memo用dict,用array也一样。当然用bottom up还有一点,可以只存每次最后两个数,可以save space.,这样就只用到constant space. -AC 代码 +AC 代码(这里采用bottom up思想) ```python class Solution(object): @@ -50,22 +62,32 @@ class Solution(object): :type n: int :rtype: int """ - memo = {} - memo[2] = 2 - memo[1] = 1 - - for i in range(3,n+1): - f = memo[i-1] + memo[i-2] # 这里用一个临时变量f来存储值,所以不用像memorize方法一样一直保存着 - memo[i] = f # 因此永远只存每次最后两个数,save space - return memo[n] + fib = [1, 1, 2] + if n < 4: + return fib[n-1] + for k in range(3, n+1): + fib[2] = fib[0] + fib[1] + fib[0], fib[1] = fib[1], fib[2] + return fib[2] ``` - Complexity Analysis - - Time complexity : O(log(n))O(log(n)). powpow method takes log(n)log(n) time. + - Time complexity : O(n) - - Space complexity : O(1)O(1). Constant space is used. + - Space complexity : O(1). Constant space is used. 另外还有一个公式法: -$F_{n} = \cfrac{1}{\sqrt{5}}$ -质能方程$$E = mc^2$$ - +![]() +由于这里面相当于```standard Fibonacci```函数向前进了一步,排列为1,2,3,5而非原本的1,1,2,3,所以用```n+1``` +```python +class Solution(object): + def climbStairs(self, n): + """ + :type n: int + :rtype: int + """ + import math + sqrt5 = math.sqrt(5) + fibn = pow((1 + sqrt5) / 2, n+1) - pow((1 - sqrt5) / 2, n+1) + return int(float(fibn/sqrt5)) +``` From 060e65ea4835a1733821b04eeb607ddeda841a60 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 20:00:31 -0600 Subject: [PATCH 102/473] Update 070. Climbing Stairs.md --- 070. Climbing Stairs.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/070. Climbing Stairs.md b/070. Climbing Stairs.md index 6572b7ca8..71e4937ad 100644 --- a/070. Climbing Stairs.md +++ b/070. Climbing Stairs.md @@ -66,8 +66,8 @@ class Solution(object): if n < 4: return fib[n-1] for k in range(3, n+1): - fib[2] = fib[0] + fib[1] - fib[0], fib[1] = fib[1], fib[2] +            fib[2] = fib[0] + fib[1]             # 永远只存3个元素,save space +            fib[0], fib[1] = fib[1], fib[2] return fib[2] ``` - Complexity Analysis @@ -90,4 +90,8 @@ class Solution(object): fibn = pow((1 + sqrt5) / 2, n+1) - pow((1 - sqrt5) / 2, n+1) return int(float(fibn/sqrt5)) ``` +- Complexity Analysis + + - Time complexity : O(lg(n)). pow method takes log(n) time. + - Space complexity : O(1). Constant space is used. From a2ba81282d6437d1c482bb454388f3ee41bcb425 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 20:04:58 -0600 Subject: [PATCH 103/473] Update 070. Climbing Stairs.md --- 070. Climbing Stairs.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/070. Climbing Stairs.md b/070. Climbing Stairs.md index 71e4937ad..7e6a216a8 100644 --- a/070. Climbing Stairs.md +++ b/070. Climbing Stairs.md @@ -76,8 +76,10 @@ class Solution(object): - Space complexity : O(1). Constant space is used. 另外还有一个公式法: -![]() -由于这里面相当于```standard Fibonacci```函数向前进了一步,排列为1,2,3,5而非原本的1,1,2,3,所以用```n+1``` + +![](https://github.com/Lisanaaa/myTODOs/blob/master/41512784914_.pic.jpg) + +由于这里面相当于```standard Fibonacci```函数向前进了一步,排列为1,2,3,5而非原本的1,1,2,3,所以代码中使用```n+1``` ```python class Solution(object): def climbStairs(self, n): From ae41f7e2ca3c775f4402d903329190b0cc1def31 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 8 Dec 2017 20:16:29 -0600 Subject: [PATCH 104/473] Update 070. Climbing Stairs.md --- 070. Climbing Stairs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/070. Climbing Stairs.md b/070. Climbing Stairs.md index 7e6a216a8..890b2f338 100644 --- a/070. Climbing Stairs.md +++ b/070. Climbing Stairs.md @@ -62,7 +62,7 @@ class Solution(object): :type n: int :rtype: int """ - fib = [1, 1, 2] + fib = [1, 2, 3] if n < 4: return fib[n-1] for k in range(3, n+1): From 07f2fb0fd0242542d7480c6c52b09ad47810a1cb Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 9 Dec 2017 17:15:52 -0600 Subject: [PATCH 105/473] Update 100._same_tree.md --- 100._same_tree.md | 51 ++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/100._same_tree.md b/100._same_tree.md index 47dc25545..ecc8c94f8 100644 --- a/100._same_tree.md +++ b/100._same_tree.md @@ -1,19 +1,26 @@ -###100. Same Tree - -题目: - - - - -难度: - -Easy - - -递归 - - -``` +### 100. Same Tree + +题目: + + + + +难度: + +Easy + + +太简单了,递归一行! + + +```python +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + class Solution(object): def isSameTree(self, p, q): """ @@ -21,12 +28,6 @@ class Solution(object): :type q: TreeNode :rtype: bool """ - if p == None or q == None: - if p == None and q == None: - return True - else: - return False - else: - return p.val == q.val and self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right) -``` - + return p.val == q.val and all(map(self.isSameTree, (p.left, p.right), (q.left, q.right))) if p and q else p is q +``` + From 7efe665f296e9490e37eac5fd81e85808d5cfa76 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 9 Dec 2017 17:41:46 -0600 Subject: [PATCH 106/473] Update 111._minimum_depth_of_binary_tree.md --- 111._minimum_depth_of_binary_tree.md | 57 ++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/111._minimum_depth_of_binary_tree.md b/111._minimum_depth_of_binary_tree.md index a04d4164e..9fae7348e 100644 --- a/111._minimum_depth_of_binary_tree.md +++ b/111._minimum_depth_of_binary_tree.md @@ -1,4 +1,4 @@ -###111. Minimum Depth of Binary Tree +### 111. Minimum Depth of Binary Tree 题目: @@ -8,7 +8,24 @@ Easy -注意leaf node反正就是没有left和right的 + +思路,看完题目我想当然的认为就是直接递归取最小的值,代码如下: +``` +class Solution(object): + def minDepth(self, root): + """ + :type root: TreeNode + :rtype: int + """ + if not root: + return 0 + return 1 + min(map(self.minDepth, (root.left, root.right))) +``` + + +但是没过,有一种特殊情况就是 + +注意```leaf node```反正就是没有```left```和```right```的 比如下图 @@ -19,10 +36,42 @@ Easy 2 ``` -2是一个孩子节点 +```2```是一个孩子节点 + +这种情况应该输出```2```而不是```1``` + +唯一的特殊情况就是上面这种了,因为```root```下只有一个左节点或者是右节点,这样另外一边的空节点并不算是```leaf node``` + +```leaf node: itself is not null but it has both children null``` + +因此要避免这种情况,代码改成下面: + + +```python +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def minDepth(self, root): + """ + :type root: TreeNode + :rtype: int + """ + if not root: + return 0 + len_under_root = map(self.minDepth, (root.left, root.right)) + return 1 + (min(len_under_root) or max(len_under_root)) ``` + + +所以还是要养成多写edge case的好习惯,也许就帮你避免了general写法的特例,代码如下 +```python class Solution(object): def minDepth(self, root): """ @@ -41,4 +90,4 @@ class Solution(object): else: return min(1+ self.minDepth(root.left), 1+ self.minDepth(root.right)) -``` \ No newline at end of file +``` From de42d32ec8a2d2b7a8e8e12ba28190a457686144 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 9 Dec 2017 20:56:58 -0600 Subject: [PATCH 107/473] Update 111._minimum_depth_of_binary_tree.md --- 111._minimum_depth_of_binary_tree.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/111._minimum_depth_of_binary_tree.md b/111._minimum_depth_of_binary_tree.md index 9fae7348e..d84421b0c 100644 --- a/111._minimum_depth_of_binary_tree.md +++ b/111._minimum_depth_of_binary_tree.md @@ -51,6 +51,7 @@ class Solution(object): ```python # Definition for a binary tree node. +# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x @@ -65,8 +66,8 @@ class Solution(object): """ if not root: return 0 - len_under_root = map(self.minDepth, (root.left, root.right)) - return 1 + (min(len_under_root) or max(len_under_root)) + depth_under_root = map(self.minDepth, (root.left, root.right)) + return 1 + (min(depth_under_root) or max(depth_under_root)) ``` From 1fe5dd18188c9a2425171e83b56c5d6d6390fab6 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 10 Dec 2017 00:45:12 -0600 Subject: [PATCH 108/473] Update 033._search_in_rotated_sorted_array.md --- 033._search_in_rotated_sorted_array.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/033._search_in_rotated_sorted_array.md b/033._search_in_rotated_sorted_array.md index c3e076259..8505bcfee 100644 --- a/033._search_in_rotated_sorted_array.md +++ b/033._search_in_rotated_sorted_array.md @@ -11,15 +11,16 @@ Medium 思路: -最直观的是O(N)解法 -but tag是binary search,应该和find min in rotated array类似。 -判断是否有序,然后做二分。 -最容易理解的写法 +下面是rotated-array图解, +![rotated-array图解](https://github.com/Lisanaaa/myTODOs/blob/master/rotated-array12:09:2017.jpg) + + +所以直接用二分,O(lg(n)) - 如果是mid,return mid -- 左边有序,判断是否在左边,否则在右边中寻找 -- 右边有序,判断是否在右边,否则在左边寻找 +- 如果mid在绿色线上,就对绿色线进行二分 +- 如果mid在红色线上,就对红色线进行二分 - 都没找到,return -1 From ccefaaf09964b38b6aa34a2ad16808947af95ba3 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 10 Dec 2017 00:45:20 -0600 Subject: [PATCH 109/473] Update 033._search_in_rotated_sorted_array.md --- 033._search_in_rotated_sorted_array.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/033._search_in_rotated_sorted_array.md b/033._search_in_rotated_sorted_array.md index 8505bcfee..a66bec92e 100644 --- a/033._search_in_rotated_sorted_array.md +++ b/033._search_in_rotated_sorted_array.md @@ -1,4 +1,4 @@ -###33. Search in Rotated Sorted Array +### 33. Search in Rotated Sorted Array 题目: From ed0204bee2a3db11b789cbbba16476e34e3f6316 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 10 Dec 2017 00:53:41 -0600 Subject: [PATCH 110/473] Update 033._search_in_rotated_sorted_array.md --- 033._search_in_rotated_sorted_array.md | 33 +++++++++++++------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/033._search_in_rotated_sorted_array.md b/033._search_in_rotated_sorted_array.md index a66bec92e..c2e6eb74c 100644 --- a/033._search_in_rotated_sorted_array.md +++ b/033._search_in_rotated_sorted_array.md @@ -24,7 +24,7 @@ Medium - 都没找到,return -1 -``` +```python class Solution(object): def search(self, nums, target): """ @@ -32,22 +32,21 @@ class Solution(object): :type target: int :rtype: int """ - l,r = 0, len(nums) - 1 - - while l <= r : - mid = (l+r)/2 - if target == nums[mid]: - return mid - if nums[mid] < nums[r]: - if nums[mid] < target <= nums[r]: - l = mid + 1 - else: - r = mid - 1 - else: - if nums[l] <= target < nums[mid]: - r = mid - 1 - else: - l = mid + 1 + l, r = 0, len(nums) - 1 + while l <= r: + mid = l + ((r - l) >> 2) + if nums[mid] == target: + return mid + if nums[mid] < nums[r]: + if nums[mid] < target <= nums[r]: + l = mid + 1 + else: + r = mid - 1 + else: + if nums[l] <= target < nums[mid]: + r = mid - 1 + else: + l = mid + 1 return -1 ``` From bff7fa99628fd4b586f71e4ac90c4c4ebf9963db Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 10 Dec 2017 10:31:30 -0600 Subject: [PATCH 111/473] Rename 034. Search for a Range.md to 034._Search for a Range.md --- 034. Search for a Range.md => 034._Search for a Range.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 034. Search for a Range.md => 034._Search for a Range.md (100%) diff --git a/034. Search for a Range.md b/034._Search for a Range.md similarity index 100% rename from 034. Search for a Range.md rename to 034._Search for a Range.md From fcaec8c452a77e3cb5a790f5a0659d3cf1880ac3 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 10 Dec 2017 22:36:16 -0600 Subject: [PATCH 112/473] Update 034._Search for a Range.md --- 034._Search for a Range.md | 42 ++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/034._Search for a Range.md b/034._Search for a Range.md index 99685e45d..06d2ae990 100644 --- a/034._Search for a Range.md +++ b/034._Search for a Range.md @@ -33,11 +33,14 @@ - middle的计算不能写在while循环外,否则无法得到更新。 - ​ +------------------------------------- AC 代码 -``` + + + +```python class Solution(object): def searchRange(self, nums, target): """ @@ -47,33 +50,32 @@ class Solution(object): """ if not nums : return [-1, -1] - result = [] - l, r = 0, len(nums) - - while l < r: - mid = (l + r) // 2 + res = [] + l, r = 0, len(nums)-1 + # search for left bound + while l <= r: + mid = l + ((r - l) >> 2) if nums[mid] == target and (mid == 0 or nums[mid-1] != target): - result.append(mid) + res.append(mid) break if nums[mid] < target: l = mid + 1 else: - r = mid - if not result: + r = mid - 1 + if not res: return [-1, -1] - - l,r = 0, len(nums) - while l < r: - mid = ( l + r )// 2 + # search for right bound + r = len(nums)-1 + while l <= r: + mid = l + ((r - l) >> 2) if nums[mid] == target and (mid == len(nums)-1 or nums[mid+1] != target): - result.append(mid) + res.append(mid) break - if nums[mid] <= target: - l = mid + 1 + if nums[mid] > target: + r = mid - 1 else: - r = mid - - return result + l = mid + 1 + return res ``` From daccf9bfce9bcefccebc1892a206fc681db76392 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 10 Dec 2017 23:06:51 -0600 Subject: [PATCH 113/473] Update 034._Search for a Range.md --- 034._Search for a Range.md | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/034._Search for a Range.md b/034._Search for a Range.md index 06d2ae990..b351b937f 100644 --- a/034._Search for a Range.md +++ b/034._Search for a Range.md @@ -14,27 +14,20 @@ 思路: -一开始想啊想,觉得虽然用到了二分,但都不是O(logN) +二分法,先找```target```出现的左边界,判断是否有```target```后再判断右边界 -后来看到hint: +- 1. 找左边界:二分,找到一个```index``` + - 1.1 该```index```对应的值为```target``` +    - 1.2 并且它左边```index-1```对应的值不是```target```(如果index为0则此不需要判断此条件) +    - 1.3 如果存在```index```就将其```append```到```res```中 +- 2. 判断此时res是否为空,如果为空,说明压根不存在target,返回```[-1, -1]``` +- 3. 找右边界:二分,找到一个```index```(但是此时用于二分循环的```l```可以保持不变,```r```重置为```len(nums)-1```,这样程序可以更快一些) +    - 3.1 该```index```对应的值为```target``` +    - 3.2 并且它右边```index-1```对应的值不是```target```(如果```index```为```len(nums)-1```则此不需要判断此条件) +    - 3.3 如果存在```index```就将其```append```到```res```中 -> 采用两次二分查找。首先二分找到第一个该值出现的位置,譬如m,然后在[m, n)区间内第二次二分找到最后一个该值出现的位置。 - -二分查找其实不容易写对,看到哪里写的,其实是的,有要点: - - - -- 关于right的赋值 - -- - right = n-1 => while(left <= right) => right = middle-1; - - right = n => while(left < right) => right = middle; - -- middle的计算不能写在while循环外,否则无法得到更新。 - -------------------------------------- - AC 代码 From 51cdc8b1cf7c42d89ba90827dd5f00b89eff1ca1 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 10 Dec 2017 23:09:24 -0600 Subject: [PATCH 114/473] Update 034._Search for a Range.md --- 034._Search for a Range.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/034._Search for a Range.md b/034._Search for a Range.md index b351b937f..2a0813478 100644 --- a/034._Search for a Range.md +++ b/034._Search for a Range.md @@ -16,15 +16,15 @@ 二分法,先找```target```出现的左边界,判断是否有```target```后再判断右边界 -- 1. 找左边界:二分,找到一个```index``` - - 1.1 该```index```对应的值为```target``` -    - 1.2 并且它左边```index-1```对应的值不是```target```(如果index为0则此不需要判断此条件) -    - 1.3 如果存在```index```就将其```append```到```res```中 -- 2. 判断此时res是否为空,如果为空,说明压根不存在target,返回```[-1, -1]``` -- 3. 找右边界:二分,找到一个```index```(但是此时用于二分循环的```l```可以保持不变,```r```重置为```len(nums)-1```,这样程序可以更快一些) -    - 3.1 该```index```对应的值为```target``` -    - 3.2 并且它右边```index-1```对应的值不是```target```(如果```index```为```len(nums)-1```则此不需要判断此条件) -    - 3.3 如果存在```index```就将其```append```到```res```中 +- 找左边界:二分,找到一个```index``` + - 该```index```对应的值为```target``` + - 并且它左边```index-1```对应的值不是```target```(如果```index```为```0```则此不需要判断此条件) + - 如果存在```index```就将其```append```到```res```中 +- 判断此时```res```是否为空,如果为空,说明压根不存在```target```,返回```[-1, -1]``` +- 找右边界:二分,找到一个```index```(但是此时用于二分循环的```l```可以保持不变,```r```重置为```len(nums)-1```,这样程序可以更快一些) + - 该```index```对应的值为```target``` + - 并且它右边```index-1```对应的值不是```target```(如果```index```为```len(nums)-1```则此不需要判断此条件) + - 如果存在```index```就将其```append```到```res```中 From ebbf48ba07d4af200940d527208d1fb2d5b765e7 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 24 Dec 2017 12:19:31 -0600 Subject: [PATCH 115/473] Update 007._Reverse_Integer.md --- 007._Reverse_Integer.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/007._Reverse_Integer.md b/007._Reverse_Integer.md index 3b9b58273..f4120c1ea 100644 --- a/007._Reverse_Integer.md +++ b/007._Reverse_Integer.md @@ -41,8 +41,8 @@ class Solution(object): :type x: int :rtype: int """ - x = -int(str(x)[::-1][:-1]) if x < 0 else int(str(x)[::-1]) - x = 0 if abs(x) > 0x7FFFFFFF else x +        x = -int(str(x)[::-1][:-1]) if x < 0 else int(str(x)[::-1]) # [:-1]相当于把负号去掉 +        x = 0 if abs(x) > 0x7FFFFFFF else x return x ``` #### 解法3(StefanPochmann大神): From a306867bf5525663c02d18fd0a618155c2381e6d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 24 Dec 2017 12:44:05 -0600 Subject: [PATCH 116/473] Update 388._Longest_Absolute_File_Path.md --- 388._Longest_Absolute_File_Path.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/388._Longest_Absolute_File_Path.md b/388._Longest_Absolute_File_Path.md index b241055f7..7d92da63a 100644 --- a/388._Longest_Absolute_File_Path.md +++ b/388._Longest_Absolute_File_Path.md @@ -86,7 +86,7 @@ class Solution(object): if '.' in name: maxlen = max(maxlen, pathlen[depth] + len(name)) else: - pathlen[depth+1] = pathlen[depth] + len(name) + 1 #加1是为了加上'\t'的长度 +                pathlen[depth+1] = pathlen[depth] + len(name) + 1   #加1是为了加上一个path分隔符'/'的长度 return maxlen ``` From 3aa960f05f33b682091a85eee08b1bef9bfdaf0d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 24 Dec 2017 14:31:44 -0600 Subject: [PATCH 117/473] Update 034._Search for a Range.md --- 034._Search for a Range.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/034._Search for a Range.md b/034._Search for a Range.md index 2a0813478..e5a7048b1 100644 --- a/034._Search for a Range.md +++ b/034._Search for a Range.md @@ -18,12 +18,12 @@ - 找左边界:二分,找到一个```index``` - 该```index```对应的值为```target``` - - 并且它左边```index-1```对应的值不是```target```(如果```index```为```0```则此不需要判断此条件) + - 并且它左边```index-1```对应的值不是```target```(如果```index```为```0```则不需要判断此条件) - 如果存在```index```就将其```append```到```res```中 - 判断此时```res```是否为空,如果为空,说明压根不存在```target```,返回```[-1, -1]``` - 找右边界:二分,找到一个```index```(但是此时用于二分循环的```l```可以保持不变,```r```重置为```len(nums)-1```,这样程序可以更快一些) - 该```index```对应的值为```target``` - - 并且它右边```index-1```对应的值不是```target```(如果```index```为```len(nums)-1```则此不需要判断此条件) + - 并且它右边```index+1```对应的值不是```target```(如果```index```为```len(nums)-1```则不需要判断此条件) - 如果存在```index```就将其```append```到```res```中 From 7e2d1238ff4e86824965e3ac954135c1f7a969e6 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 26 Dec 2017 16:01:25 -0600 Subject: [PATCH 118/473] Update 011._container_with_most_water.md --- 011._container_with_most_water.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/011._container_with_most_water.md b/011._container_with_most_water.md index ef6efbc71..218045aa7 100644 --- a/011._container_with_most_water.md +++ b/011._container_with_most_water.md @@ -1,4 +1,4 @@ -###11. Container With Most Water +### 11. Container With Most Water @@ -23,7 +23,7 @@ height = [3,2,1,3] | | | | | | | | | - 1 2 3 4 + 1 2 3 4 一开始我的理解走偏的地方是这个9是如何得到的,因为根据最短板原理,明显不可能得到9啊,后来发现是·Find two lines, which together with x-axis forms a container, such that the container contains the most water. ``` @@ -106,4 +106,4 @@ class Solution(object): return mostWater -``` \ No newline at end of file +``` From aae1a243663017295ecdea5b47893b434778e3b5 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 26 Dec 2017 16:04:40 -0600 Subject: [PATCH 119/473] Update 011._container_with_most_water.md --- 011._container_with_most_water.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/011._container_with_most_water.md b/011._container_with_most_water.md index 218045aa7..9c6a3bed9 100644 --- a/011._container_with_most_water.md +++ b/011._container_with_most_water.md @@ -25,7 +25,7 @@ height = [3,2,1,3] | | | | 1 2 3 4 - 一开始我的理解走偏的地方是这个9是如何得到的,因为根据最短板原理,明显不可能得到9啊,后来发现是·Find two lines, which together with x-axis forms a container, such that the container contains the most water. + 一开始我的理解走偏的地方是这个9是如何得到的,因为根据最短板原理,明显不可能得到9,后来发现是·Find two lines, which together with x-axis forms a container, such that the container contains the most water. ``` 所以代码写起来就简单了,AC无能,超时,时间复杂度O(N^2) From 32681bc30a5afc4f6a32d111519ff98323892334 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 26 Dec 2017 16:05:04 -0600 Subject: [PATCH 120/473] Update 011._container_with_most_water.md --- 011._container_with_most_water.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/011._container_with_most_water.md b/011._container_with_most_water.md index 9c6a3bed9..218045aa7 100644 --- a/011._container_with_most_water.md +++ b/011._container_with_most_water.md @@ -25,7 +25,7 @@ height = [3,2,1,3] | | | | 1 2 3 4 - 一开始我的理解走偏的地方是这个9是如何得到的,因为根据最短板原理,明显不可能得到9,后来发现是·Find two lines, which together with x-axis forms a container, such that the container contains the most water. + 一开始我的理解走偏的地方是这个9是如何得到的,因为根据最短板原理,明显不可能得到9啊,后来发现是·Find two lines, which together with x-axis forms a container, such that the container contains the most water. ``` 所以代码写起来就简单了,AC无能,超时,时间复杂度O(N^2) From 4d4282fa3decaec4b0c18f6f50843ad98f126bb9 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 26 Dec 2017 16:05:33 -0600 Subject: [PATCH 121/473] Update 011._container_with_most_water.md --- 011._container_with_most_water.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/011._container_with_most_water.md b/011._container_with_most_water.md index 218045aa7..3e5341855 100644 --- a/011._container_with_most_water.md +++ b/011._container_with_most_water.md @@ -23,7 +23,7 @@ height = [3,2,1,3] | | | | | | | | | - 1 2 3 4 + 1 2 3 4 一开始我的理解走偏的地方是这个9是如何得到的,因为根据最短板原理,明显不可能得到9啊,后来发现是·Find two lines, which together with x-axis forms a container, such that the container contains the most water. ``` From e81ff76f92fe2ebb05c484d7a4063d2e38e5a6db Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 26 Dec 2017 16:06:21 -0600 Subject: [PATCH 122/473] Update 011._container_with_most_water.md --- 011._container_with_most_water.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/011._container_with_most_water.md b/011._container_with_most_water.md index 3e5341855..be51b2dca 100644 --- a/011._container_with_most_water.md +++ b/011._container_with_most_water.md @@ -20,10 +20,10 @@ height = [3,2,1,3] 解是 9 - | | - | | | - | | | | - 1 2 3 4 +| | +| | | +| | | | +1 2 3 4 一开始我的理解走偏的地方是这个9是如何得到的,因为根据最短板原理,明显不可能得到9啊,后来发现是·Find two lines, which together with x-axis forms a container, such that the container contains the most water. ``` From e9837d5008aba1596cd09efb70629d616443ff9d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 26 Dec 2017 16:06:54 -0600 Subject: [PATCH 123/473] Update 011._container_with_most_water.md --- 011._container_with_most_water.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/011._container_with_most_water.md b/011._container_with_most_water.md index be51b2dca..784c0bc1e 100644 --- a/011._container_with_most_water.md +++ b/011._container_with_most_water.md @@ -23,7 +23,7 @@ height = [3,2,1,3] | | | | | | | | | -1 2 3 4 +1 2 3 4 一开始我的理解走偏的地方是这个9是如何得到的,因为根据最短板原理,明显不可能得到9啊,后来发现是·Find two lines, which together with x-axis forms a container, such that the container contains the most water. ``` From c70b03c7b358821c0d068d9d8c9b3456f35e6fd8 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 26 Dec 2017 16:17:10 -0600 Subject: [PATCH 124/473] Update 011._container_with_most_water.md --- 011._container_with_most_water.md | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/011._container_with_most_water.md b/011._container_with_most_water.md index 784c0bc1e..61ee3719d 100644 --- a/011._container_with_most_water.md +++ b/011._container_with_most_water.md @@ -62,20 +62,26 @@ class Solution(object): 由于ai和aj (i=i, j'<=j) >= S(i,j),由于j'-i' <= j-i,必然要有min(ai',aj')>=min(ai,aj)才行。同样可以采用头尾双指针向中间移动: +所以对于任何```S(i'>=i, j'<=j) >= S(i,j)```,由于```j'-i' <= j-i```,必然要有```min(ai',aj')>=min(ai,aj)```才行。同样可以采用头尾双指针向中间移动: -当a(left) < a(right)时,对任何j S(left, j a(right)时,需要左移right`。`而当a(left) = a(right)时,需要同时移动left和right。` +所以S(left, right) > S(left, j a(right)时,需要左移right`。 + +`而当a(left) = a(right)时,需要同时移动left和right。` 思路整理: left = 0, right = n-1 -(1) a[left] < a[right], left++ -(2) a[left] > a[right], right-- -(3) a[left] = a[right], left++, right-- +1. a[left] < a[right], left++ +2. a[left] > a[right], right-- +3. a[left] = a[right], left++, right-- 终止条件:left >= right 这个证明大快人心 @@ -104,6 +110,5 @@ class Solution(object): else: right -= 1 - return mostWater ``` From c0347da957052470ea0bda13d3153a90721ecd65 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 26 Dec 2017 16:34:55 -0600 Subject: [PATCH 125/473] Update 011._container_with_most_water.md --- 011._container_with_most_water.md | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/011._container_with_most_water.md b/011._container_with_most_water.md index 61ee3719d..5fe3476a8 100644 --- a/011._container_with_most_water.md +++ b/011._container_with_most_water.md @@ -90,7 +90,7 @@ left = 0, right = n-1 这样写也能过: -``` +```python class Solution(object): def maxArea(self, height): """ @@ -98,17 +98,18 @@ class Solution(object): :rtype: int """ n = len(height) - left, right = 0, n - 1 - - mostWater = 0 - while left < right: - water = min(height[left], height[right]) * (right - left) - mostWater = max(water, mostWater) - - if height[left] < height[right]: - left += 1 - else: - right -= 1 - - return mostWater + left, right = 0, n-1 + most_water = 0 + while left <= right: + water = (right - left) * min(height[left], height[right]) + most_water = max(water, most_water) + if height[left] < height[right]: + left += 1 + elif height[left] > height[right]: + right -= 1 + else: + left += 1 + right -= 1 + return most_water + ``` From 6f8b0b6b3b07401f6913a4bda931db48be28ce2c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 26 Dec 2017 16:35:47 -0600 Subject: [PATCH 126/473] Update 011._container_with_most_water.md --- 011._container_with_most_water.md | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/011._container_with_most_water.md b/011._container_with_most_water.md index 5fe3476a8..4fac0f11c 100644 --- a/011._container_with_most_water.md +++ b/011._container_with_most_water.md @@ -32,22 +32,19 @@ height = [3,2,1,3] ``` -class Solution(object): +class Solution(object): # 此法超时 def maxArea(self, height): """ :type height: List[int] :rtype: int """ n = len(height) - mostWater = 0 - + most_water = 0 for i in range(n-1): - for j in range(i,n): - lowest = min(height[i], height[j]) - water = (j - i) * lowest - if water > mostWater: - mostWater = water - return mostWater + for j in range(i, n): + water = (j-i) * min(height[i], height[j]) + most_water = max(water, most_water) + return most_water ``` From 2f1e7c6050ba93291ca66cbe60d0ef1098a8178f Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 26 Dec 2017 23:12:26 -0600 Subject: [PATCH 127/473] Update 015._3sum.md --- 015._3sum.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/015._3sum.md b/015._3sum.md index 7db404066..92a4f7020 100644 --- a/015._3sum.md +++ b/015._3sum.md @@ -33,12 +33,12 @@ class Solution(object): ``` -然后查了一下2sum,用2sum的花样,因为要排除重复以及输出是按照从小到大的输出: +然后查了一下2sum,用2sum的花样,因为要排除重复以及输出是按照从小到大的输出:但是还是超时 ``` -class Solution(object): - def threeSum(self, nums): +class Solution(object): # 此法也超时 +    def threeSum(self, nums): """ :type nums: List[int] :rtype: List[List[int]] From 6f21df72ec45389e27538b1c35154aa749e98531 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 26 Dec 2017 23:28:28 -0600 Subject: [PATCH 128/473] Update 015._3sum.md --- 015._3sum.md | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/015._3sum.md b/015._3sum.md index 92a4f7020..72a73cb31 100644 --- a/015._3sum.md +++ b/015._3sum.md @@ -81,24 +81,26 @@ class Solution(object): :type nums: List[int] :rtype: List[List[int]] """ - n = len(nums) + n, res = len(nums), [] nums.sort() - ans = [] for i in range(n): -            if i > 0 and nums[i] == nums[i-1] : continue   #因为i=0这个元素会直接往下执行 -            l, r = i+1, n -1 + if i > 0 and nums[i] == nums[i-1]: # 因为i=0这个元素会直接往下执行 + continue + l, r = i+1, n-1 while l < r: - temp = nums[i] + nums[l] + nums[r] - if temp == 0: - ans.append([nums[i],nums[l],nums[r]]) - l += 1 + tmp = nums[i] + nums[l] + nums[r] + if tmp == 0: + res.append([nums[i], nums[l], nums[r]]) + l += 1 r -= 1 - while l < r and nums[l] == nums[l-1]: l += 1 - while l < r and nums[r] == nums[r+1]: r -= 1 - elif temp > 0: + while l < r and nums[l] == nums[l-1]: + l += 1 + while l < r and nums[r] == nums[r+1]: + r -= 1 + elif tmp > 0: r -= 1 else: l += 1 - return ans + return res ``` From 3f0aa41bc5fdc9bf443e6093fd50d4c444c1c170 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 26 Dec 2017 23:41:54 -0600 Subject: [PATCH 129/473] Update 016._3sum_closest.md --- 016._3sum_closest.md | 53 ++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/016._3sum_closest.md b/016._3sum_closest.md index 75304fb4c..96b012ad2 100644 --- a/016._3sum_closest.md +++ b/016._3sum_closest.md @@ -1,4 +1,4 @@ -###16. 3Sum Closest +### 16. 3Sum Closest 题目: @@ -15,38 +15,37 @@ Medium 用两个指针来循环 -``` - +```python class Solution(object): def threeSumClosest(self, nums, target): """ :type nums: List[int] - :type target: int - :rtype: int + :rtype: List[List[int]] """ - n = len(nums) + n, res, diff = len(nums), None, float('inf') nums.sort() - ans = None - diff = float('inf') # infinity for i in range(n): - if i > 0 and nums[i] == nums[i-1] : continue - l, r = i+1, n -1 + if i > 0 and nums[i] == nums[i-1]: + continue + l, r = i+1, n-1 while l < r: - temp = nums[i] + nums[l] + nums[r] - if temp == target: + tmp = nums[i] + nums[l] + nums[r] + if tmp == target: return target - if temp < target: - l += 1 - if abs(temp - target) < diff: - diff = abs(temp - target) - ans = temp - while l < r and nums[l] == nums[l-1]: l += 1 - elif temp > target : - r -= 1 - if abs(temp - target) < diff: - diff = abs(temp - target) - ans = temp - while l < r and nums[r] == nums[r+1]: r -= 1 - return ans - -``` \ No newline at end of file + elif tmp > target: + r -= 1 + if abs(tmp-target) < diff: + diff = abs(tmp-target) + res = tmp + while l < r and nums[r] == nums[r+1]: + r -= 1 + else: + l += 1 + if abs(tmp-target) < diff: + diff = abs(tmp-target) + res = tmp + while l < r and nums[l] == nums[l-1]: + l += 1 + return res + +``` From 69c033fa988ade3e881ee27734d6c22569afa560 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 27 Dec 2017 15:25:55 -0600 Subject: [PATCH 130/473] Update 021._merge_two_sorted_lists.md --- 021._merge_two_sorted_lists.md | 94 +++++++++++++++++----------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/021._merge_two_sorted_lists.md b/021._merge_two_sorted_lists.md index 79619e9d7..40517726c 100644 --- a/021._merge_two_sorted_lists.md +++ b/021._merge_two_sorted_lists.md @@ -1,48 +1,48 @@ -###21. Merge Two Sorted Lists - -题目: - - - - -难度: Easy - - -同样适用dummy head - +### 21. Merge Two Sorted Lists + +题目: + + + + +难度: Easy + + +同样适用dummy head + +```python +class Solution(object): + def mergeTwoLists(self, l1, l2): + """ + :type l1: ListNode + :type l2: ListNode + :rtype: ListNode + """ + if l1 == None: + return l2 + if l2 == None: + return l1 + + dummy = ListNode(-1) + cur = dummy + + while l1 and l2: + if l1.val < l2.val: + cur.next = l1 + l1 = l1.next + else: + cur.next = l2 + l2 = l2.next + cur = cur.next + + if l1: + cur.next = l1 + else: + cur.next = l2 + return dummy.next + ``` -class Solution(object): - def mergeTwoLists(self, l1, l2): - """ - :type l1: ListNode - :type l2: ListNode - :rtype: ListNode - """ - if l1 == None: - return l2 - if l2 == None: - return l1 - - dummy = ListNode(-1) - cur = dummy - - while l1 and l2: - if l1.val < l2.val: - cur.next = l1 - l1 = l1.next - else: - cur.next = l2 - l2 = l2.next - cur = cur.next - - if l1: - cur.next = l1 - else: - cur.next = l2 - return dummy.next - -``` - - - - + + + + From 34af9d8190f052b772ec80301f5e193807a4e9db Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 27 Dec 2017 18:12:03 -0600 Subject: [PATCH 131/473] Update 104._maximum_depth_of_binary_tree.md --- 104._maximum_depth_of_binary_tree.md | 34 ++++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/104._maximum_depth_of_binary_tree.md b/104._maximum_depth_of_binary_tree.md index a11c7d872..9e0bc626a 100644 --- a/104._maximum_depth_of_binary_tree.md +++ b/104._maximum_depth_of_binary_tree.md @@ -1,18 +1,18 @@ -###104. Maximum Depth of Binary Tree - -题目: - - - -难度: - -Easy - - -简单题 - - -``` +### 104. Maximum Depth of Binary Tree + +题目: + + + +难度: + +Easy + + +简单题 + + +```python class Solution(object): def maxDepth(self, root): @@ -23,5 +23,5 @@ class Solution(object): if root == None: return 0 elif root.right == None and root.left == None: return 1 else: - return max(1 + self.maxDepth(root.left), 1+ self.maxDepth(root.right)) -``` + return max(1 + self.maxDepth(root.left), 1+ self.maxDepth(root.right)) +``` From 110056a305fb54852232f72f7d02bd0b1d257c72 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 27 Dec 2017 18:18:10 -0600 Subject: [PATCH 132/473] Update 104._maximum_depth_of_binary_tree.md --- 104._maximum_depth_of_binary_tree.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/104._maximum_depth_of_binary_tree.md b/104._maximum_depth_of_binary_tree.md index 9e0bc626a..451160d32 100644 --- a/104._maximum_depth_of_binary_tree.md +++ b/104._maximum_depth_of_binary_tree.md @@ -9,19 +9,15 @@ Easy -简单题 +简单题,但是这道题跟[leetcode111](https://github.com/Lisanaaa/thinking_in_lc/blob/master/111._minimum_depth_of_binary_tree.md)不一样,这道题没有特殊情况,所以一行就够了 ```python - class Solution(object): def maxDepth(self, root): """ :type root: TreeNode :rtype: int """ - if root == None: return 0 - elif root.right == None and root.left == None: return 1 - else: - return max(1 + self.maxDepth(root.left), 1+ self.maxDepth(root.right)) + return 1 + max(map(self.maxDepth, (root.left, root.right))) if root else 0 ``` From f1e2223adbbfe40dabbbd7792a1c0088e499a358 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 27 Dec 2017 18:51:47 -0600 Subject: [PATCH 133/473] Update 053._maximum_subarray.md --- 053._maximum_subarray.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/053._maximum_subarray.md b/053._maximum_subarray.md index c3d8cce5b..984552d8f 100644 --- a/053._maximum_subarray.md +++ b/053._maximum_subarray.md @@ -39,7 +39,7 @@ ms(i) = max(ms[i-1]+ a[i],a[i]) 到i处的最大值两个可能,一个是加上a[i],另一个从a[i]起头,重新开始。可以AC -``` +```python class Solution(object): def maxSubArray(self, nums): """ @@ -77,7 +77,7 @@ return max_so_far AC代码: -``` +```python class Solution(object): def maxSubArray(self, nums): """ @@ -143,4 +143,4 @@ class Solution(object): return find_max_subarray(nums, 0, len(nums)-1) -``` \ No newline at end of file +``` From a608ba0bdb06ee0e2905d37d16a4df5bfd76078a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 28 Dec 2017 00:44:33 -0600 Subject: [PATCH 134/473] Update 136._single_number.md --- 136._single_number.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/136._single_number.md b/136._single_number.md index 67fdc7dcf..3035c08fa 100644 --- a/136._single_number.md +++ b/136._single_number.md @@ -1,4 +1,4 @@ -###136. Single Number +### 136. Single Number From 40892dc628420c32b141f049cb87dd8bf7bde3f7 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 28 Dec 2017 00:44:42 -0600 Subject: [PATCH 135/473] Update 136._single_number.md --- 136._single_number.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/136._single_number.md b/136._single_number.md index 3035c08fa..b591f4d11 100644 --- a/136._single_number.md +++ b/136._single_number.md @@ -27,7 +27,7 @@ Python的位操作: 神奇的解法: -``` +```python class Solution(object): def singleNumber(self, nums): """ From b2035cd9cbc80fb52f8a9424336a6b2a0231bba5 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 28 Dec 2017 00:48:07 -0600 Subject: [PATCH 136/473] Update 136._single_number.md --- 136._single_number.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/136._single_number.md b/136._single_number.md index b591f4d11..18540da0f 100644 --- a/136._single_number.md +++ b/136._single_number.md @@ -34,10 +34,9 @@ class Solution(object): :type nums: List[int] :rtype: int """ - result = nums[0] - + res = nums[0] for i in nums[1:]: - result ^= i - return result + res ^= i + return res ``` From fd57ad86cdef0ee99ab6179528f185efcffdd1fe Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 28 Dec 2017 00:56:41 -0600 Subject: [PATCH 137/473] Update 101._symmetric_tree.md --- 101._symmetric_tree.md | 91 ++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 47 deletions(-) diff --git a/101._symmetric_tree.md b/101._symmetric_tree.md index 58651ac01..404acfa56 100644 --- a/101._symmetric_tree.md +++ b/101._symmetric_tree.md @@ -1,48 +1,45 @@ -###101. Symmetric Tree - -题目: - - - - -难度: - -Easy - - -两棵树symmetric, 有几种可能: - -- 均为none ,symmetric -- 左孩子,右孩子都不存在,并且值相等, symmetric -- 右子树 和 另一棵树的左子树相等,左子树 和另一颗树的右子树相等 🌲 - - +### 101. Symmetric Tree + +题目: + + + + +难度: + +Easy + + +两棵树symmetric, 有几种可能: + +- 均为none ,symmetric +- 左孩子,右孩子都不存在,并且值相等, symmetric +- 右子树 和 另一棵树的左子树相等,左子树 和另一颗树的右子树相等 🌲 + + ``` -class Solution(object): - def isSymmetric(self, root): - """ - :type root: TreeNode - :rtype: bool - """ - if root == None : - return True - return self.symmetric(root.left, root.right) - - - def symmetric(self,t1, t2): - # empty tree - if t1 == None or t2 == None: - if t1 == t2 == None: - return True - else: - return False - elif t1.val == t2.val: - return self.symmetric(t1.left,t2.right) and self.symmetric(t1.right, t2.left) - else: - return False -``` - -其实函数不应该定义为symmetric,应该定义为qual?更合适。 - - - +class Solution(object): + def isSymmetric(self, root): + """ + :type root: TreeNode + :rtype: bool + """ + if not root: + return True + return self.symmetric(root.left, root.right) + + def symmetric(self, l1, l2): + if not l1 or not l2: + if not l1 and not l2: + return True + else: + return False + if l1.val == l2.val: + return self.symmetric(l1.left, l2.right) and self.symmetric(l1.right, l2.left) + else: + return False +``` + + + + From 243ef381c54d07ab3a988b9f0bd5d8023869c7e0 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 28 Dec 2017 00:56:50 -0600 Subject: [PATCH 138/473] Update 101._symmetric_tree.md --- 101._symmetric_tree.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/101._symmetric_tree.md b/101._symmetric_tree.md index 404acfa56..cb6f5219b 100644 --- a/101._symmetric_tree.md +++ b/101._symmetric_tree.md @@ -17,7 +17,7 @@ Easy - 右子树 和 另一棵树的左子树相等,左子树 和另一颗树的右子树相等 🌲 -``` +```python class Solution(object): def isSymmetric(self, root): """ From 7c153d25d2cb9f40ca2da457d6dcdb38a479a1cb Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 28 Dec 2017 15:36:19 -0600 Subject: [PATCH 139/473] Update 438._Find_All_Anagrams_in_a_String.md --- 438._Find_All_Anagrams_in_a_String.md | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/438._Find_All_Anagrams_in_a_String.md b/438._Find_All_Anagrams_in_a_String.md index f7427756d..10e1da070 100644 --- a/438._Find_All_Anagrams_in_a_String.md +++ b/438._Find_All_Anagrams_in_a_String.md @@ -17,10 +17,10 @@ Easy -```python -python -class Solution(object): - def findAnagrams(self, s, p): +``` + +class Solution(object): # 此法超时 +    def findAnagrams(self, s, p): """ :type s: str :type p: str @@ -32,6 +32,7 @@ class Solution(object): res.append(i) return res ``` + 于是用双指针,left和right都从0开始往后遍历 ```python class Solution(object): @@ -62,8 +63,3 @@ class Solution(object): -Author: Keqi Huang - -If you like it, please spread your support - -![Support](https://github.com/Lisanaaa/myTODOs/blob/master/WechatIMG17.jpeg) From 24c53d3d4acfe5b3584f4766ddde4ddad37d03a9 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 28 Dec 2017 15:45:33 -0600 Subject: [PATCH 140/473] Update 438._Find_All_Anagrams_in_a_String.md --- 438._Find_All_Anagrams_in_a_String.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/438._Find_All_Anagrams_in_a_String.md b/438._Find_All_Anagrams_in_a_String.md index 10e1da070..47417e197 100644 --- a/438._Find_All_Anagrams_in_a_String.md +++ b/438._Find_All_Anagrams_in_a_String.md @@ -42,23 +42,19 @@ class Solution(object): :type p: str :rtype: List[int] """ - result = [] - - cnts = [0] * 26 + res, cnts = [], [0] * 26 for c in p: cnts[ord(c) - ord('a')] += 1 - - left, right = 0, 0 + left, right = 0, 0 while right < len(s): cnts[ord(s[right]) - ord('a')] -= 1 while left <= right and cnts[ord(s[right]) - ord('a')] < 0: cnts[ord(s[left]) - ord('a')] += 1 left += 1 if right - left + 1 == len(p): - result.append(left) + res.append(left) right += 1 - - return result + return res ``` From cdc3bb80bdcee0251001f6cbee0d199cd7beb967 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 28 Dec 2017 16:16:50 -0600 Subject: [PATCH 141/473] Update 102._binary_tree_level_order_traversal.md --- 102._binary_tree_level_order_traversal.md | 71 +++++++++++------------ 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/102._binary_tree_level_order_traversal.md b/102._binary_tree_level_order_traversal.md index 80f7145d3..7d4ac4efb 100644 --- a/102._binary_tree_level_order_traversal.md +++ b/102._binary_tree_level_order_traversal.md @@ -1,4 +1,4 @@ -###102. Binary Tree Level Order Traversal +### 102. Binary Tree Level Order Traversal 题目: @@ -7,57 +7,56 @@ 难度: -Easy +Medium +第一种做法:利用curLevel和nextLevel来记录,然后按层append. -我觉得并不easy -两种做法,利用curLevel和nextLevel来记录,然后按层append. - - -``` +```python class Solution(object): def levelOrder(self, root): """ :type root: TreeNode :rtype: List[List[int]] """ - res = [] - - if root == None: return [] - - curLevel = [root] - while curLevel: - nextLevel = [] - tmpRes = [] - for node in curLevel: - tmpRes.append(node.val) - if node.left: nextLevel.append(node.left) - if node.right: nextLevel.append(node.right) - res.append(tmpRes) - curLevel = nextLevel - + if not root: + return [] + res, cur_level = [], [root] + while cur_level: + next_level, tmp_res = [], [] + for node in cur_level: + tmp_res.append(node.val) + if node.left: + next_level.append(node.left) + if node.right: + next_level.append(node.right) + res.append(tmp_res) + cur_level = next_level return res ``` -第二种做法: +第二种做法:递归 -``` -class Solution: - # @param root, a tree node - # @return a list of lists of integers - def preorder(self, root, level, res): - if root: - if len(res) < level+1: res.append([]) - res[level].append(root.val) - self.preorder(root.left, level+1, res) - self.preorder(root.right, level+1, res) +```python +class Solution(object): def levelOrder(self, root): - res=[] - self.preorder(root, 0, res) + """ + :type root: TreeNode + :rtype: List[List[int]] + """ + res = [] + self.iter_order(root, 0, res) return res + + def iter_order(self, root, level, res): + if not root: return + if len(res) < level + 1: + res.append([]) + res[level].append(root.val) + self.iter_order(root.left, level+1, res) + self.iter_order(root.right, level+1, res) ``` -用递归来记录每一层,需要更加学习,不算easy \ No newline at end of file +用递归来记录每一层,需要更加学习,不算easy From 7bff88c54383657ef3e2c472de7f9b03caf67e47 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 16:12:18 -0600 Subject: [PATCH 142/473] Update 103._binary_tree_zigzag_level_order_traversal.md --- ...inary_tree_zigzag_level_order_traversal.md | 77 +++++++++---------- 1 file changed, 36 insertions(+), 41 deletions(-) diff --git a/103._binary_tree_zigzag_level_order_traversal.md b/103._binary_tree_zigzag_level_order_traversal.md index 3598fd91e..edc9b3986 100644 --- a/103._binary_tree_zigzag_level_order_traversal.md +++ b/103._binary_tree_zigzag_level_order_traversal.md @@ -1,48 +1,43 @@ -###103. Binary Tree Zigzag Level Order Traversal - -题目: - - - - -难度: - -Medium - - -继续用102 的算法作弊 - -使用102作弊的题目都需要再努力寻求一下别家解法 - -``` +### 103. Binary Tree Zigzag Level Order Traversal + +题目: + + + + +难度: + +Medium + + +```python class Solution(object): def zigzagLevelOrder(self, root): """ :type root: TreeNode :rtype: List[List[int]] """ - res = [] - if root == None: return [] - - curLevel = [root] - levelCount = 0 - while curLevel: - nextLevel = [] - tmpRes = [] - for node in curLevel: - tmpRes.append(node.val) - if node.left: nextLevel.append(node.left) - if node.right: nextLevel.append(node.right) - if levelCount % 2 == 0: - res.append(tmpRes) - else : - tmpRes.reverse() - res.append(tmpRes) - levelCount += 1 - curLevel = nextLevel - - return res -``` - - + if not root: + return [] + res, cur_level, level_count = [], [root], 0 + while cur_level: + next_level, tmp_res = [], [] + for node in cur_level: + tmp_res.append(node.val) + if node.left: + next_level.append(node.left) + if node.right: + next_level.append(node.right) + if level_count % 2 == 0: + res.append(tmp_res) + else: + tmp_res.reverse() + res.append(tmp_res) + level_count += 1 + cur_level = next_level + + return res +``` + + From caf6cb678fd98b8a24f67711f463f7771592db02 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 16:25:47 -0600 Subject: [PATCH 143/473] Update 094._binary_tree_inorder_traversal.md --- 094._binary_tree_inorder_traversal.md | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/094._binary_tree_inorder_traversal.md b/094._binary_tree_inorder_traversal.md index 6056c4b47..85366edfd 100644 --- a/094._binary_tree_inorder_traversal.md +++ b/094._binary_tree_inorder_traversal.md @@ -1,4 +1,4 @@ -###94. Binary Tree Inorder Traversal +### 94. Binary Tree Inorder Traversal 题目: @@ -9,9 +9,30 @@ Medium -递归 +递归版本1⃣️:自己瞬秒的 + + + +```python +class Solution(object): + def inorderTraversal(self, root): + """ + :type root: TreeNode + :rtype: List[int] + """ + res = [] + if not root: + return res + if root.left: + res.extend(self.inorderTraversal(root.left)) + res.append(root.val) + if root.right: + res.extend(self.inorderTraversal(root.right)) + return res ``` + +```python class Solution(object): def inorderTraversal(self, root): """ @@ -67,4 +88,4 @@ iterativeInorder(node) node ← s.pop() visit(node) node ← node.right -``` \ No newline at end of file +``` From 4c5f4436b871e1221c44b8c97fb323ec12f84bd0 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 16:26:12 -0600 Subject: [PATCH 144/473] Update 094._binary_tree_inorder_traversal.md --- 094._binary_tree_inorder_traversal.md | 1 + 1 file changed, 1 insertion(+) diff --git a/094._binary_tree_inorder_traversal.md b/094._binary_tree_inorder_traversal.md index 85366edfd..dc288f127 100644 --- a/094._binary_tree_inorder_traversal.md +++ b/094._binary_tree_inorder_traversal.md @@ -32,6 +32,7 @@ class Solution(object): return res ``` +递归版本2⃣️: ```python class Solution(object): def inorderTraversal(self, root): From 8950be4377cedd6fb7506e12fdc68802ee201c4d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 16:45:57 -0600 Subject: [PATCH 145/473] Update 144._binary_tree_preorder_traversal.md --- 144._binary_tree_preorder_traversal.md | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/144._binary_tree_preorder_traversal.md b/144._binary_tree_preorder_traversal.md index 805a59dca..8f5e21689 100644 --- a/144._binary_tree_preorder_traversal.md +++ b/144._binary_tree_preorder_traversal.md @@ -1,4 +1,4 @@ -###144. Binary Tree Preorder Traversal +### 144. Binary Tree Preorder Traversal 题目: @@ -9,10 +9,28 @@ Medium -Recursive +Recursive,瞬秒 +```python +class Solution(object): + def preorderTraversal(self, root): + """ + :type root: TreeNode + :rtype: List[int] + """ + res = [] + if not root: + return res + res.append(root.val) + if root.left: + res.extend(self.preorderTraversal(root.left)) + if root.right: + res.extend(self.preorderTraversal(root.right)) + return res ``` + +```python class Solution(object): def preorderTraversal(self, root): """ @@ -38,7 +56,7 @@ class Solution(object): Iterative -``` +```python class Solution(object): def preorderTraversal(self, root): """ @@ -60,4 +78,4 @@ class Solution(object): stack.append(node.left) return res -``` \ No newline at end of file +``` From dfcf9159c8ddc6cc0ce376de12e84c664f6053fe Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 17:16:44 -0600 Subject: [PATCH 146/473] Create 255._ --- 255._ | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 255._ diff --git a/255._ b/255._ new file mode 100644 index 000000000..149fb0564 --- /dev/null +++ b/255._ @@ -0,0 +1,27 @@ +### 255. Verify Preorder Sequence in Binary Search Tree + +题目: + + + +难度: + +Medium + + +思路: +思路 +二叉搜索树先序遍历序列的特点是降序的部分一定是向左走的,一旦开始升序说明开始向右走了, +则上一个降序的点则限定了后面的数的最小值。如果继续降序,说明又向左走了,这样等到下次向右走得时候也要再次更新最小值。 + + +> 10 +> / \ +> 5 12 +> / \ +> 2 6 + + +```python + +``` From 283e4af60b823e77e31a3d57f1a054e63f9be4ef Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 17:17:49 -0600 Subject: [PATCH 147/473] Rename 255._ to 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md --- 255._ => 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 255._ => 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md (100%) diff --git a/255._ b/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md similarity index 100% rename from 255._ rename to 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md From 1df70d64c060376fdbb288777a5da3cf0c28f384 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 17:18:22 -0600 Subject: [PATCH 148/473] Update 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md --- 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md b/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md index 149fb0564..e98d95de1 100644 --- a/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md +++ b/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md @@ -16,10 +16,10 @@ Medium > 10 -> / \ -> 5 12 -> / \ -> 2 6 + / \ + 5 12 + / \ + 2 6 ```python From dc55687134baec8a3b44743258dc551d258ece23 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 17:19:59 -0600 Subject: [PATCH 149/473] Update 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md --- ...Preorder_Sequence_in_Binary_Search_Tree.md | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md b/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md index e98d95de1..c7e921472 100644 --- a/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md +++ b/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md @@ -14,14 +14,30 @@ Medium 二叉搜索树先序遍历序列的特点是降序的部分一定是向左走的,一旦开始升序说明开始向右走了, 则上一个降序的点则限定了后面的数的最小值。如果继续降序,说明又向左走了,这样等到下次向右走得时候也要再次更新最小值。 - -> 10 +``` + 10 / \ 5 12 / \ 2 6 +``` +如这个例子,我们在10的位置是没有最小值限定的,然后降序走到5,依然没有最小值,降序走到2,依然没有,然后开始升序了,遇到6,这时候之后的数字一定大于2,同时也大于5,所以最小值更新为之前遍历过的,且比当前数稍微小一点的那个数。这里我们可以用一个栈来暂存之前的路径,所以升序时就是将栈中元素不断pop出来直到栈顶大于当前数,而最小值就是最后一个pop出来的数,最后再把该数push进去。对于降序的时候,直接向里面push就行了。这样,序列无效的条件就是违反了这个最小值的限定。 ```python - +class Solution(object): + def verifyPreorder(self, preorder): + """ + :type preorder: List[int] + :rtype: bool + """ + stack = [] + lower = -1 << 31 + for x in preorder: + if x < lower: + return False + while stack and x > stack[-1]: + lower = stack.pop() + stack.append(x) + return True ``` From e053e2fc53b787103d17231c7b9785dba94308d7 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 17:21:36 -0600 Subject: [PATCH 150/473] Update 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md --- 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md b/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md index c7e921472..5d5f98aa7 100644 --- a/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md +++ b/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md @@ -24,6 +24,8 @@ Medium 如这个例子,我们在10的位置是没有最小值限定的,然后降序走到5,依然没有最小值,降序走到2,依然没有,然后开始升序了,遇到6,这时候之后的数字一定大于2,同时也大于5,所以最小值更新为之前遍历过的,且比当前数稍微小一点的那个数。这里我们可以用一个栈来暂存之前的路径,所以升序时就是将栈中元素不断pop出来直到栈顶大于当前数,而最小值就是最后一个pop出来的数,最后再把该数push进去。对于降序的时候,直接向里面push就行了。这样,序列无效的条件就是违反了这个最小值的限定。 + +参考[Ethan Li 的技术专栏](https://segmentfault.com/a/1190000003874375) ```python class Solution(object): def verifyPreorder(self, preorder): From a35dd9935df79d03a2b6f02aa470edb49805e58d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 17:22:47 -0600 Subject: [PATCH 151/473] Update 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md --- 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md b/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md index 5d5f98aa7..dd02e42e6 100644 --- a/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md +++ b/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md @@ -34,12 +34,12 @@ class Solution(object): :rtype: bool """ stack = [] - lower = -1 << 31 + lower = -1 << 31 # 初始化最小值为最小整数 for x in preorder: - if x < lower: - return False - while stack and x > stack[-1]: + if x < lower: # 违反最小值限定则是无效的 + return False + while stack and x > stack[-1]: # 将路径中所有小于当前的数pop出来并更新最小值 lower = stack.pop() - stack.append(x) + stack.append(x) # 将当前值push进去 return True ``` From 6daa16d6d3377dfc5f2ae10da1a796b3828b45f3 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 17:48:52 -0600 Subject: [PATCH 152/473] Update 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md --- ...Preorder_Sequence_in_Binary_Search_Tree.md | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md b/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md index dd02e42e6..04b0e9ad4 100644 --- a/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md +++ b/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md @@ -20,6 +20,8 @@ Medium 5 12 / \ 2 6 + + preorder:[10, 5, 2, 6, 12] ``` 如这个例子,我们在10的位置是没有最小值限定的,然后降序走到5,依然没有最小值,降序走到2,依然没有,然后开始升序了,遇到6,这时候之后的数字一定大于2,同时也大于5,所以最小值更新为之前遍历过的,且比当前数稍微小一点的那个数。这里我们可以用一个栈来暂存之前的路径,所以升序时就是将栈中元素不断pop出来直到栈顶大于当前数,而最小值就是最后一个pop出来的数,最后再把该数push进去。对于降序的时候,直接向里面push就行了。这样,序列无效的条件就是违反了这个最小值的限定。 @@ -34,12 +36,35 @@ class Solution(object): :rtype: bool """ stack = [] - lower = -1 << 31 # 初始化最小值为最小整数 + min_num = -1 << 31 # 初始化最小值为最小整数 for x in preorder: - if x < lower: # 违反最小值限定则是无效的 + if x < min_num: # 违反最小值限定则是无效的 return False while stack and x > stack[-1]: # 将路径中所有小于当前的数pop出来并更新最小值 - lower = stack.pop() + min_num = stack.pop() stack.append(x) # 将当前值push进去 return True ``` + +Follow up: O(1) space +we realize that the preorder array can be reused as the stack thus achieve O(1) extra space, since the scanned items of preorder array is always more than or equal to the length of the stack. +```python +class Solution(object): + def verifyPreorder(self, preorder): + """ + :type preorder: List[int] + :rtype: bool + """ + # stack = preorder[:i], reuse preorder as stack + lower = -1 << 31 + i = 0 + for x in preorder: + if x < lower: + return False + while i > 0 and x > preorder[i - 1]: + lower = preorder[i - 1] + i -= 1 + preorder[i] = x + i += 1 + return True +``` From a07a93f0faffdb519ef1731c99664e2dac24e930 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 17:54:20 -0600 Subject: [PATCH 153/473] Update 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md --- ...Verify_Preorder_Sequence_in_Binary_Search_Tree.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md b/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md index 04b0e9ad4..fef130c8e 100644 --- a/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md +++ b/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md @@ -10,10 +10,8 @@ Medium 思路: -思路 -二叉搜索树先序遍历序列的特点是降序的部分一定是向左走的,一旦开始升序说明开始向右走了, -则上一个降序的点则限定了后面的数的最小值。如果继续降序,说明又向左走了,这样等到下次向右走得时候也要再次更新最小值。 +这道题让给了我们一个一维数组,让我们验证其是否为一个二叉搜索树的先序遍历出的顺序,我们都知道二叉搜索树的性质是左<根<右,如果用中序遍历得到的结果就是有序数组,而先序遍历的结果就不是有序数组了,但是难道一点规律都没有了吗,其实规律还是有的,根据二叉搜索树的性质,当前节点的值一定大于其左子树中任何一个节点值,而且其右子树中的任何一个节点值都不能小于当前节点值,那么我们可以用这个性质来验证,举个例子,比如下面这棵二叉搜索树: ``` 10 / \ @@ -24,7 +22,7 @@ Medium preorder:[10, 5, 2, 6, 12] ``` -如这个例子,我们在10的位置是没有最小值限定的,然后降序走到5,依然没有最小值,降序走到2,依然没有,然后开始升序了,遇到6,这时候之后的数字一定大于2,同时也大于5,所以最小值更新为之前遍历过的,且比当前数稍微小一点的那个数。这里我们可以用一个栈来暂存之前的路径,所以升序时就是将栈中元素不断pop出来直到栈顶大于当前数,而最小值就是最后一个pop出来的数,最后再把该数push进去。对于降序的时候,直接向里面push就行了。这样,序列无效的条件就是违反了这个最小值的限定。 +如这个例子,我们先设一个最小值min_num,然后遍历数组,如果当前值小于这个最小值min_num,返回false,对于根节点,我们将其压入栈中,然后往后遍历,如果遇到的数字比栈顶元素小,说明是其左子树的点,继续压入栈中,直到遇到的数字比栈顶元素大,那么就是右边的值了,我们需要找到是哪个节点的右子树,所以我们更新low值并删掉栈顶元素,然后继续和下一个栈顶元素比较,如果还是大于,则继续更新low值和删掉栈顶,直到栈为空或者当前栈顶元素大于当前值停止,压入当前值,这样如果遍历完整个数组之前都没有返回false的话,最后返回true即可 参考[Ethan Li 的技术专栏](https://segmentfault.com/a/1190000003874375) @@ -56,13 +54,13 @@ class Solution(object): :rtype: bool """ # stack = preorder[:i], reuse preorder as stack - lower = -1 << 31 + min_num = -1 << 31 i = 0 for x in preorder: - if x < lower: + if x < min_num: return False while i > 0 and x > preorder[i - 1]: - lower = preorder[i - 1] + min_num = preorder[i - 1] i -= 1 preorder[i] = x i += 1 From 76ecc55c0289630f1f731cd890bac8ac8f8bb518 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 18:08:07 -0600 Subject: [PATCH 154/473] Update 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md --- 255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md b/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md index fef130c8e..dfe1f7039 100644 --- a/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md +++ b/255._Verify_Preorder_Sequence_in_Binary_Search_Tree.md @@ -26,6 +26,8 @@ Medium 参考[Ethan Li 的技术专栏](https://segmentfault.com/a/1190000003874375) + +O(n) time, O(n) space ```python class Solution(object): def verifyPreorder(self, preorder): @@ -44,7 +46,9 @@ class Solution(object): return True ``` -Follow up: O(1) space +### Follow up: +O(n) time, O(1) space + we realize that the preorder array can be reused as the stack thus achieve O(1) extra space, since the scanned items of preorder array is always more than or equal to the length of the stack. ```python class Solution(object): From 88b455f663306fb78d62acfc7099de9a9faff40e Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 18:46:18 -0600 Subject: [PATCH 155/473] Update 173._binary_search_tree_iterator.md --- 173._binary_search_tree_iterator.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/173._binary_search_tree_iterator.md b/173._binary_search_tree_iterator.md index f41778d71..6bbeac943 100644 --- a/173._binary_search_tree_iterator.md +++ b/173._binary_search_tree_iterator.md @@ -1,4 +1,4 @@ -###173. Binary Search Tree Iterator +### 173. Binary Search Tree Iterator 题目: @@ -49,7 +49,7 @@ class BSTIterator(object): 谷歌了一下,得到如何满足题目要求的hint,从root开始,往左走,把左孩子压入stack,直到左边为空。 -然后开始取node,如果node有右孩子,则同样要把node的左孩子入stack,画了一个图,可行。 +然后开始取node,如果node有右孩子,则同样要把node的右孩子append入stack,画了一个图,可行。 @@ -64,7 +64,7 @@ class BSTIterator(object): """ self.root = root self.stack = [] - self.pushLeft(root) + self.push(root) def hasNext(self): @@ -81,10 +81,10 @@ class BSTIterator(object): while self.hasNext(): cur = self.stack.pop() if cur.right: - self.pushLeft(cur.right) + self.push(cur.right) return cur.val - def pushLeft(self, node): + def push(self, node): """ :type node: TreeNode """ @@ -92,4 +92,4 @@ class BSTIterator(object): while cur: self.stack.append(cur) cur = cur.left -``` \ No newline at end of file +``` From a87d7d9f068f81cd583af485608d52e4aa0b4c84 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 18:46:41 -0600 Subject: [PATCH 156/473] Update 173._binary_search_tree_iterator.md --- 173._binary_search_tree_iterator.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/173._binary_search_tree_iterator.md b/173._binary_search_tree_iterator.md index 6bbeac943..2cfb6ebf4 100644 --- a/173._binary_search_tree_iterator.md +++ b/173._binary_search_tree_iterator.md @@ -11,7 +11,7 @@ Medium 同样没有听题目要求,一开始就取巧,用InOrder,这样得到BSF有序排列,然后使用 -``` +```python class BSTIterator(object): def __init__(self, root): @@ -55,7 +55,7 @@ class BSTIterator(object): -``` +```python class BSTIterator(object): def __init__(self, root): From 819b2bfb082e304d5020d283edc0d7f3cfb4c323 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 18:48:26 -0600 Subject: [PATCH 157/473] Update 173._binary_search_tree_iterator.md --- 173._binary_search_tree_iterator.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/173._binary_search_tree_iterator.md b/173._binary_search_tree_iterator.md index 2cfb6ebf4..f3168414b 100644 --- a/173._binary_search_tree_iterator.md +++ b/173._binary_search_tree_iterator.md @@ -64,7 +64,7 @@ class BSTIterator(object): """ self.root = root self.stack = [] - self.push(root) + self.pushAllLeft(root) def hasNext(self): @@ -81,10 +81,10 @@ class BSTIterator(object): while self.hasNext(): cur = self.stack.pop() if cur.right: - self.push(cur.right) + self.pushAllLeft(cur.right) return cur.val - def push(self, node): + def pushAllLeft(self, node): """ :type node: TreeNode """ From 32d4327bb2c9c331729b9f46c7fb6bcd8116ee7c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 18:54:27 -0600 Subject: [PATCH 158/473] Update 173._binary_search_tree_iterator.md --- 173._binary_search_tree_iterator.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/173._binary_search_tree_iterator.md b/173._binary_search_tree_iterator.md index f3168414b..e5d69606e 100644 --- a/173._binary_search_tree_iterator.md +++ b/173._binary_search_tree_iterator.md @@ -78,7 +78,7 @@ class BSTIterator(object): """ :rtype: int """ - while self.hasNext(): + if self.hasNext(): cur = self.stack.pop() if cur.right: self.pushAllLeft(cur.right) From 1e061003fa9e8f27357179180bda8e6a9d21dc8c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 18:57:54 -0600 Subject: [PATCH 159/473] Update 173._binary_search_tree_iterator.md --- 173._binary_search_tree_iterator.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/173._binary_search_tree_iterator.md b/173._binary_search_tree_iterator.md index e5d69606e..a8b6fd9cc 100644 --- a/173._binary_search_tree_iterator.md +++ b/173._binary_search_tree_iterator.md @@ -49,7 +49,7 @@ class BSTIterator(object): 谷歌了一下,得到如何满足题目要求的hint,从root开始,往左走,把左孩子压入stack,直到左边为空。 -然后开始取node,如果node有右孩子,则同样要把node的右孩子append入stack,画了一个图,可行。 +然后开始取node,如果node有右孩子,则同样要把node的右孩子的所有左孩子全部append入stack,画了一个图,可行。 From f6a1067b870528d1319ad94f774ae7d3a1f7f0f0 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 19:08:05 -0600 Subject: [PATCH 160/473] Update 412._fizz_buzz.md --- 412._fizz_buzz.md | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/412._fizz_buzz.md b/412._fizz_buzz.md index 7d9ee87f5..7b5057c7d 100644 --- a/412._fizz_buzz.md +++ b/412._fizz_buzz.md @@ -1,4 +1,4 @@ -###412. Fizz Buzz +### 412. Fizz Buzz 题目: @@ -7,29 +7,31 @@ 难度: Easy +一行 +```python +class Solution(object): + def fizzBuzz(self, n): + """ + :type n: int + :rtype: List[str] + """ + return [(not i%3)*"Fizz" + (not i%5)*"Buzz" or str(i) for i in range(1, n+1)] ``` +```python class Solution(object): def fizzBuzz(self, n): """ :type n: int :rtype: List[str] """ - res = [] - - for i in range(1,n+1): - item = '' - if i % 3 == 0: - item += 'Fizz' - if i % 5 == 0: - item += 'Buzz' - res.append(item || str(n)) - return res + return [str(i) if (i%3!=0 and i%5!=0) else (('Fizz'*(i%3==0)) + ('Buzz'*(i%5==0))) for i in range(1,n+1)] ``` + 就是easy,不过可以参见这里,有一些讨论 -我觉得这里一个用yield的想法还蛮不错 \ No newline at end of file +我觉得这里一个用yield的想法还蛮不错 From a23a2085560a5df3db40689558afa3e062d2b09f Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 19:11:56 -0600 Subject: [PATCH 161/473] Update 412._fizz_buzz.md --- 412._fizz_buzz.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/412._fizz_buzz.md b/412._fizz_buzz.md index 7b5057c7d..76551be9f 100644 --- a/412._fizz_buzz.md +++ b/412._fizz_buzz.md @@ -35,3 +35,34 @@ class Solution(object): 我觉得这里一个用yield的想法还蛮不错 +``` +# the fizbuz logic, returns an iterator object that +# calculates one value at a time, not all ot them at once +def fiz(numbers): + for i in numbers: + if i % 15 == 0: + yield 'fizbuz' + elif i % 5 == 0: + yield 'buz' + elif i % 3 == 0: + yield 'fiz' + else: + yield str(i) + +# xrange evaluates lazily, good for big numbers +# matches well with the lazy-eval generator function +numbers = xrange(1,2**20) + +# this gets one number, turns that one number into fuz, repeat +print ' '.join(fiz(numbers)) + +# returns: 1 2 fiz 4 buz fiz [...] fiz 1048573 1048574 fizbuz +``` +- clearly separates fizbuz logic from concatenation +- is as plain and readeable as possible +- generator iterator does not keep all the array in memory +- so that you can do it on arbitrary numbers (see Euler problem #10) + +What I do not like in this solution is the three ifs, whereas the problem can be solved with two. + +Answer: because yield is efficient when you do not want to keep big arrays in memory just to iterate through them. But this question is not about big arrays. From 826c784df14af9832d0e8c30479e692411274f43 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 19:34:24 -0600 Subject: [PATCH 162/473] Update 319._Bulb_Switcher.md --- 319._Bulb_Switcher.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/319._Bulb_Switcher.md b/319._Bulb_Switcher.md index c39b68392..840cce518 100644 --- a/319._Bulb_Switcher.md +++ b/319._Bulb_Switcher.md @@ -1,4 +1,4 @@ -###319. Bulb Switcher +### 319. Bulb Switcher 题目: @@ -20,7 +20,7 @@ Last executed input: 999999 -```python +``` class Solution(object): def bulbSwitch(self, n): """ @@ -29,11 +29,8 @@ class Solution(object): """ bulb = [1] * n for i in range(2,n+1): - if i == n: - bulb[n-1] = 1 if bulb[n-1] == 0 else 0 - else: - for x in range(i-1, n, i): - bulb[x] = 1 if bulb[x] == 0 else 0 + for x in range(i-1, n, i): + bulb[x] = 1 if bulb[x] == 0 else 0 return bulb.count(1) ``` @@ -49,7 +46,7 @@ and double divisor 6. So bulb >i ends up on iff and only if i is a square. So ju 大概解释一下,当一个灯泡被执行偶数次switch操作时它是灭着的,当被执行奇数次switch操作时它是亮着的,那么这题就是要找出哪些编号的灯泡会被执行奇数次操作。 现在假如我们执行第i次操作,即从编号i开始对编号每次+i进行switch操作,对于这些灯来说, -如果其编号j(j=1,2,3,⋯,n)能够整除i,则编号j的灯需要执switch操作。 +如果其编号j(j=1,2,3,⋯,n)能够整除i,则编号j的灯需要执行switch操作。 具备这样性质的i是成对出现的,比如: - 12 = 1 * 12, - 12 = 2 * 6 From ad319ae4fa7482c8c31566a7d4c1fec2e2c87753 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 19:40:18 -0600 Subject: [PATCH 163/473] Update 672._Bulb_Switcher_II.md --- 672._Bulb_Switcher_II.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/672._Bulb_Switcher_II.md b/672._Bulb_Switcher_II.md index 08f5d0584..e48f5cdd0 100644 --- a/672._Bulb_Switcher_II.md +++ b/672._Bulb_Switcher_II.md @@ -1,4 +1,4 @@ -###672. Bulb Switcher II +### 672. Bulb Switcher II 题目: @@ -15,14 +15,18 @@ Medium 我们只需要考虑当 n<=2 and m < 3 的特殊情形。因为当 n >2 and m >=3, 结果肯定是 8. The four buttons: -Flip all the lights. -Flip lights with even numbers. -Flip lights with odd numbers. -Flip lights with (3k + 1) numbers, k = 0, 1, 2, ... +- Flip all the lights. +- Flip lights with even numbers. +- Flip lights with odd numbers. +- Flip lights with (3k + 1) numbers, k = 0, 1, 2, ... + 如果我们使用了 button 1 和 2, 其效果等同于使用 button 3 。 类似的.. -1 + 2 --> 3, 1 + 3 --> 2, 2 + 3 --> 1 +- 1 + 2 --> 3 +- 1 + 3 --> 2 +- 2 + 3 --> 1 + 所以,只有 8 种情形。 ***All_on, 1, 2, 3, 4, 1+4, 2+4, 3+4*** @@ -30,7 +34,7 @@ Flip lights with (3k + 1) numbers, k = 0, 1, 2, ... 并且当 n>2 and m>=3 时,我们就能够获得所有的情形。 | m\n | 0 | 1 | 2 | 3 | 4 | - --- | ---|--- |----|---|---| + --- |----|--- |----|---|---| | 0 | 1 | 1 | 1 | 1 | 8 | | 1 | 1 | 2 | 3 | 4 | 8 | | 2 | 1 | 2 | 4 | 7 | 8 | From 0fde5496050535ea55feeeb265ad11a6b58c4d0f Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 19:57:03 -0600 Subject: [PATCH 164/473] Update 672._Bulb_Switcher_II.md --- 672._Bulb_Switcher_II.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/672._Bulb_Switcher_II.md b/672._Bulb_Switcher_II.md index e48f5cdd0..2441178f4 100644 --- a/672._Bulb_Switcher_II.md +++ b/672._Bulb_Switcher_II.md @@ -29,16 +29,16 @@ The four buttons: 所以,只有 8 种情形。 -***All_on, 1, 2, 3, 4, 1+4, 2+4, 3+4*** +***灯全亮, 操作1, 操作2, 操作3, 操作4, 操作1+4, 操作2+4, 操作3+4*** 并且当 n>2 and m>=3 时,我们就能够获得所有的情形。 | m\n | 0 | 1 | 2 | 3 | 4 | --- |----|--- |----|---|---| -| 0 | 1 | 1 | 1 | 1 | 8 | -| 1 | 1 | 2 | 3 | 4 | 8 | -| 2 | 1 | 2 | 4 | 7 | 8 | -| 3 | 8 | 8 | 8 | 8 | 8 | +| 0 | 1 | 1 | 1 | 1 | 1 | +| 1 | 1 | 2 | 3 | 4 | 4 | +| 2 | 1 | 2 | 4 | 7 | 7 | +| 3 | 1 | 2 | 3 | 8 | 8 | ```python class Solution(object): From 726c73f4f5a6d8e1cfbb9e57eb9305b0f74d169b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 21:56:24 -0600 Subject: [PATCH 165/473] Update 039._combination_sum.md --- 039._combination_sum.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/039._combination_sum.md b/039._combination_sum.md index 147d5da68..1ea31c837 100644 --- a/039._combination_sum.md +++ b/039._combination_sum.md @@ -1,4 +1,4 @@ -###39. Combination Sum +### 39. Combination Sum 题目: @@ -40,7 +40,7 @@ Out[9]: [[2, 2, 3], [2, 3, 2], [3, 2, 2], [7]] 所以最终的除重大法如下,根据hint做出: -``` +```python class Solution(object): def combinationSum(self, candidates, target): """ @@ -48,19 +48,19 @@ class Solution(object): :type target: int :rtype: List[List[int]] """ - candidates = list(set(candidates)) - candidates.sort() - self.res = [] - self.combSum(candidates, target, 0, []) - return self.res - - - def combSum(self, candidates, target, start, valueList): - length = len(candidates) - if target == 0: - self.res.append(valueList) - for i in range(start, length): - if target < candidates[i]: + def dfs(remain, combo, index): + if remain == 0: + result.append(combo) return - self.combSum(candidates, target - candidates[i], i, valueList + [candidates[i]]) + for i in range(index, len(candy)): + if candy[i] > remain: + # exceeded the sum with candidate[i] + break #the for loop + + dfs(remain - candy[i], combo + [candy[i]], i) + + candy = sorted(candidates) + result = [] + dfs(target, [], 0) + return result ``` From 4e25cd7ed3ae572dfe7bea7c91e5575237b8b615 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 22:04:42 -0600 Subject: [PATCH 166/473] Update 039._combination_sum.md --- 039._combination_sum.md | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/039._combination_sum.md b/039._combination_sum.md index 1ea31c837..6bb8614bb 100644 --- a/039._combination_sum.md +++ b/039._combination_sum.md @@ -50,17 +50,15 @@ class Solution(object): """ def dfs(remain, combo, index): if remain == 0: - result.append(combo) + res.append(combo) return - for i in range(index, len(candy)): - if candy[i] > remain: - # exceeded the sum with candidate[i] - break #the for loop + for i in range(index, len(candidates)): + if candidates[i] > remain: + break + dfs(remain - candidates[i], combo + [candidates[i]], i) - dfs(remain - candy[i], combo + [candy[i]], i) - - candy = sorted(candidates) - result = [] + candidates.sort() + res = [] dfs(target, [], 0) - return result + return res ``` From 7e38fdf81c95b253b6877ffd12839b8c31fe8655 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 22:36:47 -0600 Subject: [PATCH 167/473] Update 039._combination_sum.md --- 039._combination_sum.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/039._combination_sum.md b/039._combination_sum.md index 6bb8614bb..b5579c25d 100644 --- a/039._combination_sum.md +++ b/039._combination_sum.md @@ -56,7 +56,7 @@ class Solution(object): if candidates[i] > remain: break dfs(remain - candidates[i], combo + [candidates[i]], i) - + candidates = list(set(candidates)) candidates.sort() res = [] dfs(target, [], 0) From 901777f3e790199ffab98f8de6c7ddfb75003a50 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 22:58:54 -0600 Subject: [PATCH 168/473] Update 040._combination_sum_ii.md --- 040._combination_sum_ii.md | 66 ++++++-------------------------------- 1 file changed, 10 insertions(+), 56 deletions(-) diff --git a/040._combination_sum_ii.md b/040._combination_sum_ii.md index 8ebce3aa6..b6a82ee57 100644 --- a/040._combination_sum_ii.md +++ b/040._combination_sum_ii.md @@ -1,4 +1,4 @@ -###40. Combination Sum II +### 40. Combination Sum II 题目: @@ -12,43 +12,7 @@ Medium Combination Sum 已经AC,做了minor change. -``` -class Solution(object): - def combinationSum2(self, candidates, target): - """ - :type candidates: List[int] - :type target: int - :rtype: List[List[int]] - """ - candidates.sort() - self.res = [] - self.combSum(candidates, target, 0, []) - return self.res - - def combSum(self, candidates, target, start, valueList): - length = len(candidates) - if target == 0: - if valueList not in self.res: - self.res.append(valueList) - if length == 0: - return - for i in range(start, length): - if target < candidates[i]: - return - self.combSum(candidates[:i] + candidates[i+1:], target - candidates[i], i, valueList + [candidates[i]]) - -``` - - - -以上是偷懒解法, 优化就是碰到已经碰到过的元素我们直接略过. - -这里的‘碰到’是比如我们已经有它,举个例子 - -然后也不用担心两个相同的放不进去,因为当我们处理第一个的时候,它并没拿来跟已经放入的元素比较了,只是在和还没放入的元素比较. - - -``` +```python class Solution(object): def combinationSum2(self, candidates, target): """ @@ -56,27 +20,17 @@ class Solution(object): :type target: int :rtype: List[List[int]] """ - def combSum(candidates, target, start, valueList): - length = len(candidates) - if target < 0 : + def dfs(remain, combo, index): + if remain == 0 and combo not in res: + res.append(combo) return - if target == 0 : - res.append(valueList) - for i in range(start, length): - if candidates[i] > target: return - if i > 0 and candidates[i] == candidates[i-1]: continue - combSum(candidates[i+1:], target - candidates[i], 0, valueList + [candidates[i]]) - - + for i in range(index, len(candidates)): + if candidates[i] > remain: + break + dfs(remain - candidates[i], combo + [candidates[i]], i+1) candidates.sort() res = [] - combSum(candidates, target, 0, []) + dfs(target, [], 0) return res - - ``` - - - -多重优化 \ No newline at end of file From 97faa8ecf8d209332faed24c20e375a53aa5c0b0 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 23:02:49 -0600 Subject: [PATCH 169/473] Update 040._combination_sum_ii.md --- 040._combination_sum_ii.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/040._combination_sum_ii.md b/040._combination_sum_ii.md index b6a82ee57..7abb448f3 100644 --- a/040._combination_sum_ii.md +++ b/040._combination_sum_ii.md @@ -11,6 +11,9 @@ Medium Combination Sum 已经AC,做了minor change. +- 现在不需要```set```化```candidates```了 +- 但是递归的时候```index```要从```i+1```开始了 +- 要判断```combo not in res```才```append```到```res```中去 ```python class Solution(object): From 8bc54a3f4d9c90c59bf65b7df563ec21a64881b9 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 23:34:24 -0600 Subject: [PATCH 170/473] Update and rename 013.Roman to Integer.md to 013._Roman_to_Integer.md --- 013.Roman to Integer.md | 80 ---------------------------------------- 013._Roman_to_Integer.md | 70 +++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 80 deletions(-) delete mode 100644 013.Roman to Integer.md create mode 100644 013._Roman_to_Integer.md diff --git a/013.Roman to Integer.md b/013.Roman to Integer.md deleted file mode 100644 index f8ddb8667..000000000 --- a/013.Roman to Integer.md +++ /dev/null @@ -1,80 +0,0 @@ -### 13.Roman to Integer - - - -题目: - - -难度: -Easy - -思路: - -integer to Roman 是 Medium,这个roman to integer是easy - -所以用的傻方法,特殊处理4,9,40,90,400,900,再加上剩下的数字 - - - -AC代码 - -``` -class Solution(object): - def romanToInt(self, s): - """ - :type s: str - :rtype: int - """ - lookup1 = {'CM':900,'CD':400,'XC':90,'XL':40,'IX':9,'IV':4} - lookup2 = {'M':1000, 'D':500, 'C':100, 'L':50, 'X':10, 'V':5, 'I':1} - - num = 0 - for i in lookup1.keys(): - if i in s: - num += lookup1[i] - s = s.replace(i,'') - - for char in s: - num += lookup2[char] - - return num -``` - - - - - -然后可以有更好的方法: - -> 从前往后扫描,用一个临时变量记录分段数字。 -> -> 如果当前比前一个大,说明这一段的值应当是这个值减去上一个值。比如IV = 5-1 =4; 否则,将当前值加入到结果中,然后开始下一段记录,比如VI = 5 + 1, II = 1 +1 - - - -所以这也就是罗马数字的基础,感觉?这样才不会读串? - - - -AC代码 - -``` -class Solution(object): - def romanToInt(self, s): - """ - :type s: str - :rtype: int - """ - lookup = {'M':1000, 'D':500, 'C':100, 'L':50, 'X':10, 'V':5, 'I':1} - - num = 0 - - for i in range(len(s)): - if i > 0 and lookup[s[i]] > lookup[s[i-1]]: - num += lookup[s[i]] - 2 * lookup[s[i-1]] - else: - num += lookup[s[i]] - - return num -``` - diff --git a/013._Roman_to_Integer.md b/013._Roman_to_Integer.md new file mode 100644 index 000000000..ca7579f93 --- /dev/null +++ b/013._Roman_to_Integer.md @@ -0,0 +1,70 @@ +### 13.Roman to Integer + + + +题目: + + +难度: +Easy + +思路: + + +``` +罗马数字是最古老的数字表示方式,比阿拉伯数组早2000多年,起源于罗马 + +罗马数字有如下符号: + +基本字符 I V X L C D M +对应阿拉伯数字 1 5 10 50 100 500 1000 +计数规则: +相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3 +小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8 +小的数字,限于(I、X和C)在大的数字左边,所表示的数等于大数减去小数所得的数,例如:IV = 4,这条规则好像这题不管 +正常使用时,连续的数字重复不得超过三次 +在一个数的上面画横线,表示这个数扩大1000倍(本题只考虑3999以内的数,所以用不到这条规则) +从前向后遍历罗马数字,如果某个数比前一个数小,则加上该数。反之,减去前一个数的两倍然后加上该数 +``` + + + +integer to Roman 是 Medium,这个roman to integer是easy + + +> 从前往后扫描,用一个临时变量记录分段数字。 +> +> 如果当前比前一个大,说明这一段的值应当是这个值减去上一个值。比如IV = 5-1 =4; 否则,将当前值加入到结果中,然后开始下一段记录,比如VI = 5 + 1, II = 1 +1 + + +所以这也就是罗马数字的基础,感觉?这样才不会读串? + + + +AC代码 + +```python +class Solution(object): + def romanToInt(self, s): + """ + :type s: str + :rtype: int + """ + lookup = { + 'M': 1000, + 'D': 500, + 'C': 100, + 'L': 50, + 'X': 10, + 'V': 5, + 'I': 1 + } + res = 0 + for i in range(len(s)): + if i > 0 and lookup[s[i]] > lookup[s[i-1]]: + res = res + lookup[s[i]] - 2 * lookup[s[i-1]] + else: + res += lookup[s[i]] + return res +``` + From babf713861f3fb71618ab7876d037cda15941993 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 23:35:12 -0600 Subject: [PATCH 171/473] Update 013._Roman_to_Integer.md --- 013._Roman_to_Integer.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/013._Roman_to_Integer.md b/013._Roman_to_Integer.md index ca7579f93..cb0c771e6 100644 --- a/013._Roman_to_Integer.md +++ b/013._Roman_to_Integer.md @@ -18,6 +18,7 @@ Easy 基本字符 I V X L C D M 对应阿拉伯数字 1 5 10 50 100 500 1000 + 计数规则: 相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3 小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8 @@ -32,9 +33,8 @@ Easy integer to Roman 是 Medium,这个roman to integer是easy -> 从前往后扫描,用一个临时变量记录分段数字。 -> -> 如果当前比前一个大,说明这一段的值应当是这个值减去上一个值。比如IV = 5-1 =4; 否则,将当前值加入到结果中,然后开始下一段记录,比如VI = 5 + 1, II = 1 +1 +- 从前往后扫描,用一个临时变量记录分段数字。 +- 如果当前比前一个大,说明这一段的值应当是这个值减去上一个值。比如IV = 5-1 =4; 否则,将当前值加入到结果中,然后开始下一段记录,比如VI = 5 + 1, II = 1 +1 所以这也就是罗马数字的基础,感觉?这样才不会读串? From 10c0c348ea09f023633479d00dcf7b3e3b9ab905 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 23:37:50 -0600 Subject: [PATCH 172/473] Update 013._Roman_to_Integer.md --- 013._Roman_to_Integer.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/013._Roman_to_Integer.md b/013._Roman_to_Integer.md index cb0c771e6..d226c3a32 100644 --- a/013._Roman_to_Integer.md +++ b/013._Roman_to_Integer.md @@ -67,4 +67,16 @@ class Solution(object): res += lookup[s[i]] return res ``` - +或者甚至可以建立一个新函数用于取对应数值: +``` + def table(x): + return { + 'I':1, + 'V':5, + 'X':10, + 'L':50, + 'C':100, + 'D':500, + 'M':1000 + }.get(x) +``` From 5ff7ea686cbf687d0b9fa8e2fea8b348d60dbdf6 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 23:38:13 -0600 Subject: [PATCH 173/473] Update 013._Roman_to_Integer.md --- 013._Roman_to_Integer.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/013._Roman_to_Integer.md b/013._Roman_to_Integer.md index d226c3a32..fd4fa933f 100644 --- a/013._Roman_to_Integer.md +++ b/013._Roman_to_Integer.md @@ -20,12 +20,12 @@ Easy 对应阿拉伯数字 1 5 10 50 100 500 1000 计数规则: -相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3 -小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8 -小的数字,限于(I、X和C)在大的数字左边,所表示的数等于大数减去小数所得的数,例如:IV = 4,这条规则好像这题不管 -正常使用时,连续的数字重复不得超过三次 -在一个数的上面画横线,表示这个数扩大1000倍(本题只考虑3999以内的数,所以用不到这条规则) -从前向后遍历罗马数字,如果某个数比前一个数小,则加上该数。反之,减去前一个数的两倍然后加上该数 +- 相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3 +- 小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8 +- 小的数字,限于(I、X和C)在大的数字左边,所表示的数等于大数减去小数所得的数,例如:IV = 4,这条规则好像这题不管 +- 正常使用时,连续的数字重复不得超过三次 +- 在一个数的上面画横线,表示这个数扩大1000倍(本题只考虑3999以内的数,所以用不到这条规则) +- 从前向后遍历罗马数字,如果某个数比前一个数小,则加上该数。反之,减去前一个数的两倍然后加上该数 ``` From c2738ae3abfbf03565fb9723d50c31429b0a230d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 29 Dec 2017 23:40:51 -0600 Subject: [PATCH 174/473] Update 013._Roman_to_Integer.md --- 013._Roman_to_Integer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/013._Roman_to_Integer.md b/013._Roman_to_Integer.md index fd4fa933f..4f1184b8a 100644 --- a/013._Roman_to_Integer.md +++ b/013._Roman_to_Integer.md @@ -16,7 +16,7 @@ Easy 罗马数字有如下符号: -基本字符 I V X L C D M +基本字符 I V X L C D M 对应阿拉伯数字 1 5 10 50 100 500 1000 计数规则: From 90861cc00b4a139c25a3adb68005f59821e41d61 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 00:09:27 -0600 Subject: [PATCH 175/473] Create 26._md --- 26._md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 26._md diff --git a/26._md b/26._md new file mode 100644 index 000000000..fc7982c4b --- /dev/null +++ b/26._md @@ -0,0 +1,51 @@ +### 26. Remove Duplicates from Sorted Array + + + +题目: + + + +难度: +Easy + +思路: +因为题目说了是```sorted array```,所以只需要不停判断当前位置值和下一位置是否相等,若相等则```remove当前值```,否则```move```到下一位置做重复判断 + + +```python +class Solution(object): + def removeDuplicates(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + i = 0 + while i < (len(nums) - 1): + if nums[i] == nums[i+1]: + nums.remove(nums[i]) + else: + i += 1 + return len(nums) +``` + + +这里代码用```while loop```而不用```for loop```是因为```remove```操作之后```nums```的长度会变化 + + + + + + + + + + + + + + + + + + From 05f278277fa7e423e1e8ec4358c723066cbecdce Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 00:10:10 -0600 Subject: [PATCH 176/473] Rename 26._md to 26._Remove_Duplicates_from_Sorted_Array.md --- 26._md => 26._Remove_Duplicates_from_Sorted_Array.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 26._md => 26._Remove_Duplicates_from_Sorted_Array.md (100%) diff --git a/26._md b/26._Remove_Duplicates_from_Sorted_Array.md similarity index 100% rename from 26._md rename to 26._Remove_Duplicates_from_Sorted_Array.md From 7639cdb1426b74b7a9d461a8ea84e873fdb4d09b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 00:11:55 -0600 Subject: [PATCH 177/473] Update and rename 26._Remove_Duplicates_from_Sorted_Array.md to 026._Remove_Duplicates_from_Sorted_Array.md --- ...rted_Array.md => 026._Remove_Duplicates_from_Sorted_Array.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename 26._Remove_Duplicates_from_Sorted_Array.md => 026._Remove_Duplicates_from_Sorted_Array.md (83%) diff --git a/26._Remove_Duplicates_from_Sorted_Array.md b/026._Remove_Duplicates_from_Sorted_Array.md similarity index 83% rename from 26._Remove_Duplicates_from_Sorted_Array.md rename to 026._Remove_Duplicates_from_Sorted_Array.md index fc7982c4b..44172a326 100644 --- a/26._Remove_Duplicates_from_Sorted_Array.md +++ b/026._Remove_Duplicates_from_Sorted_Array.md @@ -30,7 +30,7 @@ class Solution(object): ``` -这里代码用```while loop```而不用```for loop```是因为```remove```操作之后```nums```的长度会变化 +这里代码用```while loop```而不用```for loop```是因为```remove```操作之后```nums```的长度会变化, ```for i in range(len(nums)-1)```实际上固定了```range```里面的值了,不会二次判断 From 390cf2a92798ee2bcfba5e04f65990957d6b03e0 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 00:15:17 -0600 Subject: [PATCH 178/473] Update 026._Remove_Duplicates_from_Sorted_Array.md --- 026._Remove_Duplicates_from_Sorted_Array.md | 24 ++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/026._Remove_Duplicates_from_Sorted_Array.md b/026._Remove_Duplicates_from_Sorted_Array.md index 44172a326..bed57dc42 100644 --- a/026._Remove_Duplicates_from_Sorted_Array.md +++ b/026._Remove_Duplicates_from_Sorted_Array.md @@ -30,7 +30,29 @@ class Solution(object): ``` -这里代码用```while loop```而不用```for loop```是因为```remove```操作之后```nums```的长度会变化, ```for i in range(len(nums)-1)```实际上固定了```range```里面的值了,不会二次判断 +这里代码用```while loop```而不用```for loop```是因为```remove```操作之后```nums```的长度会变化 + +如:```for i in range(len(nums)-1)```实际上固定了```range```里面的值了,不会二次判断 + +``` +n = 10 +for i in range(n): + n = n - 1 # 尽管n在变化 + print(i) + +上面这段代码的输出结果为: + +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +``` From 97d15b45883d17760023fa94ae7c672c9d37e5de Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 00:17:16 -0600 Subject: [PATCH 179/473] Update 026._Remove_Duplicates_from_Sorted_Array.md --- 026._Remove_Duplicates_from_Sorted_Array.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/026._Remove_Duplicates_from_Sorted_Array.md b/026._Remove_Duplicates_from_Sorted_Array.md index bed57dc42..23b43561c 100644 --- a/026._Remove_Duplicates_from_Sorted_Array.md +++ b/026._Remove_Duplicates_from_Sorted_Array.md @@ -10,7 +10,7 @@ Easy 思路: -因为题目说了是```sorted array```,所以只需要不停判断当前位置值和下一位置是否相等,若相等则```remove当前值```,否则```move```到下一位置做重复判断 +因为题目说了是```sorted array```,所以只需要不停判断当前位置值和下一位置是否相等,若相等则```pop掉当前值```,否则```move```到下一位置做重复判断 ```python @@ -30,7 +30,7 @@ class Solution(object): ``` -这里代码用```while loop```而不用```for loop```是因为```remove```操作之后```nums```的长度会变化 +这里代码用```while loop```而不用```for loop```是因为```pop```操作之后```nums```的长度会变化 如:```for i in range(len(nums)-1)```实际上固定了```range```里面的值了,不会二次判断 From dbb912f361b4a93f113122e459f616796f01b188 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 00:22:15 -0600 Subject: [PATCH 180/473] Create 27._Remove_Element.md --- 27._Remove_Element.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 27._Remove_Element.md diff --git a/27._Remove_Element.md b/27._Remove_Element.md new file mode 100644 index 000000000..6aefeee1d --- /dev/null +++ b/27._Remove_Element.md @@ -0,0 +1,26 @@ +### 27. Remove Element + + + +题目: + + + +难度: +Easy + +瞬秒 + +```python +class Solution(object): + def removeElement(self, nums, val): + """ + :type nums: List[int] + :type val: int + :rtype: int + """ + + while val in nums: + nums.remove(val) + return len(nums) +``` From 3ea1aa0087b28881040c21112a51689621b0ef08 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 00:22:39 -0600 Subject: [PATCH 181/473] Update and rename 27._Remove_Element.md to 027._Remove_Element.md --- 27._Remove_Element.md => 027._Remove_Element.md | 1 - 1 file changed, 1 deletion(-) rename 27._Remove_Element.md => 027._Remove_Element.md (97%) diff --git a/27._Remove_Element.md b/027._Remove_Element.md similarity index 97% rename from 27._Remove_Element.md rename to 027._Remove_Element.md index 6aefeee1d..3603a5b3d 100644 --- a/27._Remove_Element.md +++ b/027._Remove_Element.md @@ -19,7 +19,6 @@ class Solution(object): :type val: int :rtype: int """ - while val in nums: nums.remove(val) return len(nums) From 95b68a8a976ba573f6da6bcb4594cdbeb96a235e Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 00:31:32 -0600 Subject: [PATCH 182/473] Update 283._move_zeroes.md --- 283._move_zeroes.md | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/283._move_zeroes.md b/283._move_zeroes.md index 239b57188..67572ade8 100644 --- a/283._move_zeroes.md +++ b/283._move_zeroes.md @@ -1,4 +1,4 @@ -###283. Move Zeroes +### 283. Move Zeroes 题目: @@ -11,9 +11,25 @@ Easy 思路: -思路一: +思路一:暴力 -这个题我很笨,但是思路是可以朝逆天的方向走的,一旦遇到不是0的就把它往前移动,移动非0完成,剩下的全部填0,看例子 +```python +class Solution(object): + def moveZeroes(self, nums): + """ + :type nums: List[int] + :rtype: void Do not return anything, modify nums in-place instead. + """ + i = 0 + while 0 in nums: + nums.remove(0) + i += 1 + nums.extend([0]*i) +``` + +思路二: + +一旦遇到不是0的就把它往前移动,移动非0完成,剩下的全部填0,看例子 @@ -37,7 +53,7 @@ Easy 这样知道变换完成,简直逆天啊,因为cur 总是小于idx,所以总可以保持这样的稳定性 -``` +```python class Solution(object): def moveZeroes(self, nums): """ @@ -67,14 +83,14 @@ class Solution(object): -``` +```python class Solution(object): def moveZeroes(self, nums): """ :type nums: List[int] :rtype: void Do not return anything, modify nums in-place instead. """ - p0, p1 = 0,0 + p0, p1 = 0, 0 while p0 < len(nums) and p1 < len(nums): if nums[p0] != 0: p0 += 1 From c27f3513af9777a3ec9311607aee39ffc619e8b9 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 00:42:10 -0600 Subject: [PATCH 183/473] Update 283._move_zeroes.md --- 283._move_zeroes.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/283._move_zeroes.md b/283._move_zeroes.md index 67572ade8..ded5c9818 100644 --- a/283._move_zeroes.md +++ b/283._move_zeroes.md @@ -75,7 +75,7 @@ class Solution(object): ``` -思路二: +思路三: 传统的双指针,参考这里 @@ -106,4 +106,18 @@ class Solution(object): 相反,我觉得这样双指针反而没有上面的代码容易理解 +思路四: + +一个比较巧妙的方法: +```python +class Solution(object): + def moveZeroes(self, nums): + """ + :type nums: List[int] + :rtype: void Do not return anything, modify nums in-place instead. + """ + nums.sort(key= lambda x: 1 if x == 0 else 0) +``` +原理就是原先为0的数优先级在此次sort中更高了,所以全部升序排列排到后面去了 + From 5a8b90c8961d43265a4a2d5a856960018adcd61d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 00:47:06 -0600 Subject: [PATCH 184/473] Update 283._move_zeroes.md --- 283._move_zeroes.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/283._move_zeroes.md b/283._move_zeroes.md index ded5c9818..dfd4beebe 100644 --- a/283._move_zeroes.md +++ b/283._move_zeroes.md @@ -120,4 +120,6 @@ class Solution(object): ``` 原理就是原先为0的数优先级在此次sort中更高了,所以全部升序排列排到后面去了 +但是这个解法被人说是没有满足题目```no extra space```的条件,详见[Sayo](https://leetcode.com/problems/move-zeroes/discuss/72074/) + From bcb8f898192addfd22c66d353507a62d413b2bf4 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 00:47:41 -0600 Subject: [PATCH 185/473] Update 283._move_zeroes.md --- 283._move_zeroes.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/283._move_zeroes.md b/283._move_zeroes.md index dfd4beebe..52917fd11 100644 --- a/283._move_zeroes.md +++ b/283._move_zeroes.md @@ -121,5 +121,8 @@ class Solution(object): 原理就是原先为0的数优先级在此次sort中更高了,所以全部升序排列排到后面去了 但是这个解法被人说是没有满足题目```no extra space```的条件,详见[Sayo](https://leetcode.com/problems/move-zeroes/discuss/72074/) +``` +timsort can require a temp array containing as many as N//2 pointers, which means as many as 2*N extra bytes on 32-bit boxes. +``` From c354b8b37fcf129880db41aa861fba4dbdd64efa Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 00:50:39 -0600 Subject: [PATCH 186/473] Update 283._move_zeroes.md --- 283._move_zeroes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/283._move_zeroes.md b/283._move_zeroes.md index 52917fd11..62702fc9f 100644 --- a/283._move_zeroes.md +++ b/283._move_zeroes.md @@ -81,7 +81,7 @@ class Solution(object): - +此法最快,```beats 90.50%``` ```python class Solution(object): From c5dfd169ecf1c85729adda323f1bc2337553adde Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 00:51:28 -0600 Subject: [PATCH 187/473] Update 283._move_zeroes.md --- 283._move_zeroes.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/283._move_zeroes.md b/283._move_zeroes.md index 62702fc9f..4be3f76ea 100644 --- a/283._move_zeroes.md +++ b/283._move_zeroes.md @@ -11,7 +11,7 @@ Easy 思路: -思路一:暴力 +### 思路一:暴力 ```python class Solution(object): @@ -27,7 +27,7 @@ class Solution(object): nums.extend([0]*i) ``` -思路二: +### 思路二: 一旦遇到不是0的就把它往前移动,移动非0完成,剩下的全部填0,看例子 @@ -75,13 +75,13 @@ class Solution(object): ``` -思路三: +### 思路三: 传统的双指针,参考这里 -此法最快,```beats 90.50%``` +```此法最快,beats 90.50%``` ```python class Solution(object): @@ -106,7 +106,7 @@ class Solution(object): 相反,我觉得这样双指针反而没有上面的代码容易理解 -思路四: +### 思路四: 一个比较巧妙的方法: ```python From 9ac213b487a59c132a6584bf4a94fe08b14007df Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 00:54:31 -0600 Subject: [PATCH 188/473] Update 283._move_zeroes.md --- 283._move_zeroes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/283._move_zeroes.md b/283._move_zeroes.md index 4be3f76ea..a5e887c05 100644 --- a/283._move_zeroes.md +++ b/283._move_zeroes.md @@ -90,8 +90,8 @@ class Solution(object): :type nums: List[int] :rtype: void Do not return anything, modify nums in-place instead. """ - p0, p1 = 0, 0 - while p0 < len(nums) and p1 < len(nums): +        p0, p1 = 0, 0 # P1指向非0,p0指向0 +        while p0 < len(nums) and p1 < len(nums): if nums[p0] != 0: p0 += 1 p1 = p0 From 912d94ac8b044cbdf833da1e7daa2452d93b17ff Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 01:14:21 -0600 Subject: [PATCH 189/473] Update 028._implement_strstr().md --- 028._implement_strstr().md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/028._implement_strstr().md b/028._implement_strstr().md index d1470c30b..cecd6a5e5 100644 --- a/028._implement_strstr().md +++ b/028._implement_strstr().md @@ -1,4 +1,4 @@ -###28. Implement strStr() +### 28. Implement strStr() 题目: @@ -10,12 +10,23 @@ Easy -这个题目其实可以引来一大类,那就是关于string的算法,但是此处先用暴力算法来AC,然后再来细读/品味别的string相关算法吧。 +一行解法如何? +```python +class Solution(object): + def strStr(self, haystack, needle): + """ + :type haystack: str + :type needle: str + :rtype: int + """ + return haystack.find(needle) +``` -虽然是暴力算法,但是也不容易写对啊 +这个题目其实可以引来一大类,那就是关于string的算法,但是此处先用暴力算法来AC,然后再来细读/品味别的string相关算法吧。 -``` +虽然是暴力算法,但是也不容易写对啊 +```python class Solution(object): def strStr(self, haystack, needle): """ @@ -33,4 +44,4 @@ class Solution(object): if j == len(needle): return i return -1 -``` \ No newline at end of file +``` From 0f4cc3652c08b8e2919f05261dcceee5271d2e15 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 01:20:37 -0600 Subject: [PATCH 190/473] Update 035._search_insert_position.md --- 035._search_insert_position.md | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/035._search_insert_position.md b/035._search_insert_position.md index a45141cbe..ba17f3497 100644 --- a/035._search_insert_position.md +++ b/035._search_insert_position.md @@ -1,4 +1,4 @@ -###35. Search Insert Position +### 35. Search Insert Position 题目: @@ -8,10 +8,9 @@ Medium +找到第一个比```target```大的值的```index```,如果没找到则返回```len(nums)```,但是代码中直接返回```i```值就行了 -递归 - -``` +```python class Solution(object): def searchInsert(self, nums, target): """ @@ -19,14 +18,10 @@ class Solution(object): :type target: int :rtype: int """ - n = len(nums) - if target <= nums[0]: - return 0 - if target > nums[n-1]: - return n - for i in range(1,n): - if target == nums[i]: + i = 0 + while nums[i] < target: + i += 1 + if i == len(nums): return i - elif target > nums[i-1] and target < nums[i]: - return i -``` \ No newline at end of file + return i +``` From 75e9f5a7da1c6f60a31ba336f2e983ac1f2964d7 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 01:32:16 -0600 Subject: [PATCH 191/473] Update 035._search_insert_position.md --- 035._search_insert_position.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/035._search_insert_position.md b/035._search_insert_position.md index ba17f3497..1b14c88ce 100644 --- a/035._search_insert_position.md +++ b/035._search_insert_position.md @@ -10,6 +10,8 @@ Medium 找到第一个比```target```大的值的```index```,如果没找到则返回```len(nums)```,但是代码中直接返回```i```值就行了 +### 思路一:暴力 + ```python class Solution(object): def searchInsert(self, nums, target): @@ -25,3 +27,22 @@ class Solution(object): return i return i ``` +### 思路二:二分 + +```python +class Solution(object): + def searchInsert(self, nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: int + """ + left, right = 0, len(nums) - 1 + while left <= right: + mid = left + ((right - left) >> 2) + if nums[mid] < target: + left = mid + 1 + else: + right = mid - 1 + return left +``` From bad2f35d3ecc5605d20395460588dc2fd7f45bcf Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 01:45:28 -0600 Subject: [PATCH 192/473] Update 038._Count_and_Say.md --- 038._Count_and_Say.md | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/038._Count_and_Say.md b/038._Count_and_Say.md index ac4542b5b..8a61793a7 100644 --- a/038._Count_and_Say.md +++ b/038._Count_and_Say.md @@ -1,4 +1,4 @@ -###38. Count and Say +### 38. Count and Say 题目: @@ -13,7 +13,7 @@ Easy 1. i代表字符下标,从0开始取值,也就是从第一个字符开始,因为要让i取到最后一个字符,并且后面还要进行i+1的操作,所以将原字符串随意加上一个‘*’字符防止溢出 -2. sum代表此时已经连续相同的字符个数 +2. count代表此时已经连续相同的字符个数 3. res代表最终输出的字符串 - 只要i下标对应的字符等于下一个字符,则sum和i都加1,无限循环 @@ -45,15 +45,13 @@ class Solution(object): if n == 1: return '1' s = self.countAndSay(n-1) + '*' - res = '' - i, sum = 0, 1 - while i < len(s) - 1: + res, count = '', 1 + for i in range(len(s)-1): if s[i] == s[i+1]: - sum += 1 + count += 1 else: - res += (str(sum) + s[i]) - sum = 1 - i += 1 + res += str(count) + str(s[i]) + count = 1 return res ``` ```python @@ -65,7 +63,7 @@ class Solution(object): :rtype: str """ res = '1' - for i in xrange(n-1): + for i in range(n-1): res = ''.join([str(len(list(group))) + digit for digit, group in itertools.groupby(res)]) return res ``` From 9fd87adf34176bb6aa1e74a9b61631695a08186c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 01:51:26 -0600 Subject: [PATCH 193/473] Update 038._Count_and_Say.md --- 038._Count_and_Say.md | 1 + 1 file changed, 1 insertion(+) diff --git a/038._Count_and_Say.md b/038._Count_and_Say.md index 8a61793a7..02444e098 100644 --- a/038._Count_and_Say.md +++ b/038._Count_and_Say.md @@ -68,6 +68,7 @@ class Solution(object): return res ``` + ```java 解法3 class Solution { From 469d806e8f90efcd9a7746b1b7238215a4a6ad70 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 01:55:40 -0600 Subject: [PATCH 194/473] Update 038._Count_and_Say.md --- 038._Count_and_Say.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/038._Count_and_Say.md b/038._Count_and_Say.md index 02444e098..c735ca188 100644 --- a/038._Count_and_Say.md +++ b/038._Count_and_Say.md @@ -67,7 +67,7 @@ class Solution(object): res = ''.join([str(len(list(group))) + digit for digit, group in itertools.groupby(res)]) return res ``` - +详见[python进阶-ITERTOOLS模块小结](http://www.wklken.me/posts/2013/08/20/python-extra-itertools.html#itertoolsgroupbyiterable-key) ```java 解法3 From 37b5d1d03d3bc5a40ae9c0dc562c602c581ec7aa Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 02:01:59 -0600 Subject: [PATCH 195/473] Update 049._group_anagrams_python.md --- 049._group_anagrams_python.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/049._group_anagrams_python.md b/049._group_anagrams_python.md index aa6962957..1371afdb4 100644 --- a/049._group_anagrams_python.md +++ b/049._group_anagrams_python.md @@ -1,4 +1,4 @@ -###49. Group Anagrams python +### 49. Group Anagrams python 题目: From 0a948882016508b230e39f3e9f4ee862fae78746 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 02:06:20 -0600 Subject: [PATCH 196/473] Update 058._length_of_last_word.md --- 058._length_of_last_word.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/058._length_of_last_word.md b/058._length_of_last_word.md index 82eadabe5..bb6029a34 100644 --- a/058._length_of_last_word.md +++ b/058._length_of_last_word.md @@ -1,4 +1,4 @@ -###58. Length of Last Word +### 58. Length of Last Word 题目: @@ -45,7 +45,7 @@ class Solution(object): ``` 作弊式做法 -``` +```python class Solution(object): def lengthOfLastWord(self, s): """ From ee48ad601af947ac83b8d1a409c78c6438b2d747 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 02:33:34 -0600 Subject: [PATCH 197/473] Update 058._length_of_last_word.md --- 058._length_of_last_word.md | 31 +++---------------------------- 1 file changed, 3 insertions(+), 28 deletions(-) diff --git a/058._length_of_last_word.md b/058._length_of_last_word.md index bb6029a34..b9ec0160c 100644 --- a/058._length_of_last_word.md +++ b/058._length_of_last_word.md @@ -7,6 +7,7 @@ 难度 : Easy 我的解法: + ```python class Solution(object): def lengthOfLastWord(self, s): @@ -14,34 +15,8 @@ class Solution(object): :type s: str :rtype: int """ - if not s: - return 0 - string = list(s) - i = len(s)-1 - res = [] - while i >= 0 and string[i] == ' ': - i -= 1 - while i >= 0 and string[i] != ' ': - res.append(string[i]) - i -= 1 - return len(res) -``` -上面这个判断可以精简成下面的代码: -```python -class Solution(object): - def lengthOfLastWord(self, s): - """ - :type s: str - :rtype: int - """ - length = 0 - for i in reversed(s): - if i == ' ': - if length: - break - else: - length += 1 - return length + s = s[::-1].strip() + return s.find(' ') if s.find(' ') != -1 else len(s) ``` 作弊式做法 From d73fbeeb8b76fda10afc7c68d1131c9725fb53df Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 02:44:15 -0600 Subject: [PATCH 198/473] Update 069._sqrt(x).md --- 069._sqrt(x).md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/069._sqrt(x).md b/069._sqrt(x).md index 47f0363e7..04bda77bb 100644 --- a/069._sqrt(x).md +++ b/069._sqrt(x).md @@ -1,4 +1,4 @@ -###69. Sqrt(x) +### 69. Sqrt(x) 题目: @@ -43,15 +43,15 @@ class Solution(object): """ if x == 1 : return 1 if x == 0 : return 0 - l,r = 0, x - while l < r: - mid = (l+r)/2 + l, r = 0, x -1 + while l <= r: + mid = l + ((r - l) >> 2) if mid * mid <= x and (mid+1)*(mid+1) > x: return mid elif mid * mid > x: - r = mid + r = mid - 1 else: - l = mid + l = mid + 1 ``` 其实这个else感觉是没有意义的,因为其root不可能比它的一半还大吧? @@ -70,9 +70,9 @@ class Solution(object): :type x: int :rtype: int """ - result = 1.0 - while abs(result * result - x) > 0.1: - result = (result + x / result) / 2 - return int(result) + res = 1.0 + while abs(res * res - x) > 0.1: + res = (res + x / res) / 2 + return int(res) ``` From e0fa9784f548d88c2fb734737b9c0d2242c53038 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 02:44:31 -0600 Subject: [PATCH 199/473] Update 069._sqrt(x).md --- 069._sqrt(x).md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/069._sqrt(x).md b/069._sqrt(x).md index 04bda77bb..7cb2bc698 100644 --- a/069._sqrt(x).md +++ b/069._sqrt(x).md @@ -34,7 +34,7 @@ class Solution(object): 莫名其妙过了的代码: -``` +```python class Solution(object): def mySqrt(self, x): """ @@ -63,7 +63,7 @@ class Solution(object): -``` +```python class Solution(object): def mySqrt(self, x): """ From 8d683ad393d3b6c5e445fb97e8264b5731d6a7e4 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 02:49:10 -0600 Subject: [PATCH 200/473] Update 069._sqrt(x).md --- 069._sqrt(x).md | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/069._sqrt(x).md b/069._sqrt(x).md index 7cb2bc698..70c28f6e2 100644 --- a/069._sqrt(x).md +++ b/069._sqrt(x).md @@ -43,7 +43,7 @@ class Solution(object): """ if x == 1 : return 1 if x == 0 : return 0 - l, r = 0, x -1 + l, r = 0, x - 1 while l <= r: mid = l + ((r - l) >> 2) if mid * mid <= x and (mid+1)*(mid+1) > x: @@ -54,7 +54,30 @@ class Solution(object): l = mid + 1 ``` -其实这个else感觉是没有意义的,因为其root不可能比它的一半还大吧? +或者 +```python +class Solution(object): + def mySqrt(self, x): + """ + :type x: int + :rtype: int + """ + if x == 1: + return 1 + if x == 0: + return 0 + l, r = 0, x-1 + while l <= r: + mid = l + ((r - l) >> 2) + if (mid * mid - x == 0): + return mid + elif (mid * mid - x > 0): + r = mid - 1 + else: + l = mid + 1 + return r +``` + 牛顿法 From 0eea087a4d982dac1899dc21cb33e3dfe4d5b5b3 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 02:55:35 -0600 Subject: [PATCH 201/473] Update 088._merge_sorted_array.md --- 088._merge_sorted_array.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/088._merge_sorted_array.md b/088._merge_sorted_array.md index dc8815e67..029b3c330 100644 --- a/088._merge_sorted_array.md +++ b/088._merge_sorted_array.md @@ -11,10 +11,10 @@ 给的数组可能是这样的 -nums1 : [0] -m : 0 -nums2 : [1] -n : 1 +- nums1 : [0] +- m : 0 +- nums2 : [1] +- n : 1 所以要判断m和n是不是仍然大于0 @@ -23,7 +23,7 @@ n : 1 AC代码 -``` +```python class Solution: def merge(self, nums1, m, nums2, n): """ From e9d9e19972923ec1eee96f52db87f9264b5f7aa7 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 03:03:31 -0600 Subject: [PATCH 202/473] Update 125._valid_palindrome.md --- 125._valid_palindrome.md | 45 +++++++--------------------------------- 1 file changed, 7 insertions(+), 38 deletions(-) diff --git a/125._valid_palindrome.md b/125._valid_palindrome.md index f79899e2d..0850af088 100644 --- a/125._valid_palindrome.md +++ b/125._valid_palindrome.md @@ -1,4 +1,4 @@ -###125. Valid Palindrome +### 125. Valid Palindrome 题目: @@ -8,42 +8,12 @@ Easy -根据这个palindrome原理来看,running time比较慢 -``` -class Solution(object): - def isPalindrome(self,s): - """ - :type s: str - :rtype: bool - """ - Alphabets = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9'] - i = 0 - j = len(s) - 1 - palindrome = True - lowerS = s.lower() - while i < j: - if lowerS[i] not in Alphabets: - i += 1 - continue - if lowerS[j] not in Alphabets: - j -= 1 - continue - if lowerS[i] != lowerS[j]: - print(i,lowerS[i],j,lowerS[j]) - return False - # s[i] == s[j] - else: - i += 1 - j -= 1 - return palindrome - -``` -当然也有取巧的办法,就是比较reversed string 和原本的是否相等. -Running time 提升了一点 +就是比较reversed string 和原本的是否相等. -``` + +```python class Solution(object): def isPalindrome(self,s): """ @@ -52,12 +22,11 @@ class Solution(object): """ new=[] - - s=s.lower() + s = s.lower() for i in s: if '0'<=i<='9' or 'a'<=i<='z': new.append(i) - return new==new[::-1] -``` \ No newline at end of file + return new == new[::-1] +``` From 5e85047f842aff6d886229207a90fa8d475adf3c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 03:08:24 -0600 Subject: [PATCH 203/473] Update 125._valid_palindrome.md --- 125._valid_palindrome.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/125._valid_palindrome.md b/125._valid_palindrome.md index 0850af088..7b29f6621 100644 --- a/125._valid_palindrome.md +++ b/125._valid_palindrome.md @@ -30,3 +30,16 @@ class Solution(object): return new == new[::-1] ``` + +或者用re正则 +```python +class Solution(object): + def isPalindrome(self, s): + """ + :type s: str + :rtype: bool + """ + newString = re.sub("[^0-9a-zA-Z]+", "", s) + return newString.lower() == newString.lower()[::-1] +``` + From 2a7e37f2c5627a59802e270187dbb03c22fe117b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 03:15:50 -0600 Subject: [PATCH 204/473] Update 125._valid_palindrome.md --- 125._valid_palindrome.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/125._valid_palindrome.md b/125._valid_palindrome.md index 7b29f6621..b09773b57 100644 --- a/125._valid_palindrome.md +++ b/125._valid_palindrome.md @@ -31,7 +31,7 @@ class Solution(object): return new == new[::-1] ``` -或者用re正则 +或者用正则,详见[re.sub()用法](http://blog.csdn.net/geekleee/article/details/75309433) ```python class Solution(object): def isPalindrome(self, s): From 03a6559bf11fc4f44466db0b403aa59443baa22b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 03:17:28 -0600 Subject: [PATCH 205/473] Update 125._valid_palindrome.md --- 125._valid_palindrome.md | 1 + 1 file changed, 1 insertion(+) diff --git a/125._valid_palindrome.md b/125._valid_palindrome.md index b09773b57..d3e09f6c2 100644 --- a/125._valid_palindrome.md +++ b/125._valid_palindrome.md @@ -32,6 +32,7 @@ class Solution(object): ``` 或者用正则,详见[re.sub()用法](http://blog.csdn.net/geekleee/article/details/75309433) +瞬间```beats 97.71%``` ```python class Solution(object): def isPalindrome(self, s): From 57a075f75093476c37d952ab6db47ea1f5a54f89 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 03:36:41 -0600 Subject: [PATCH 206/473] Create 142_Linked_List_Cycle_II.md --- 142_Linked_List_Cycle_II.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 142_Linked_List_Cycle_II.md diff --git a/142_Linked_List_Cycle_II.md b/142_Linked_List_Cycle_II.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/142_Linked_List_Cycle_II.md @@ -0,0 +1 @@ + From 5ec032c4902dcf8bbd213c9824c46f2f6ba6d019 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 03:38:25 -0600 Subject: [PATCH 207/473] Update 142_Linked_List_Cycle_II.md --- 142_Linked_List_Cycle_II.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/142_Linked_List_Cycle_II.md b/142_Linked_List_Cycle_II.md index 8b1378917..8f6f74324 100644 --- a/142_Linked_List_Cycle_II.md +++ b/142_Linked_List_Cycle_II.md @@ -1 +1,37 @@ +### 141. Linked List Cycle + +题目: + + + + +难度: + +Medium + +思路: +稍微改了一下[141](),这里稍微注意一下```while-else clause```就行 + + +```python +class Solution(object): + def detectCycle(self, head): + """ + :type head: ListNode + :rtype: bool + """ + slow = fast = head + while fast and fast.next: + slow = slow.next + fast = fast.next.next + if slow == fast: + break + else: + return None + while head != slow: + slow = slow.next + head = head.next + return head +``` + From 943488350987b714a21cd7bc8a775952c2db16e2 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 03:38:42 -0600 Subject: [PATCH 208/473] Update 142_Linked_List_Cycle_II.md --- 142_Linked_List_Cycle_II.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/142_Linked_List_Cycle_II.md b/142_Linked_List_Cycle_II.md index 8f6f74324..953ddc645 100644 --- a/142_Linked_List_Cycle_II.md +++ b/142_Linked_List_Cycle_II.md @@ -10,7 +10,7 @@ Medium 思路: -稍微改了一下[141](),这里稍微注意一下```while-else clause```就行 +稍微改了一下[141](https://github.com/Lisanaaa/thinking_in_lc/blob/master/141._linked_list_cycle.md),这里稍微注意一下```while-else clause```就行 ```python From 46706218007480d519632301884a5efef08f5c67 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 03:54:52 -0600 Subject: [PATCH 209/473] Update 142_Linked_List_Cycle_II.md --- 142_Linked_List_Cycle_II.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/142_Linked_List_Cycle_II.md b/142_Linked_List_Cycle_II.md index 953ddc645..7ca9e24d3 100644 --- a/142_Linked_List_Cycle_II.md +++ b/142_Linked_List_Cycle_II.md @@ -12,7 +12,26 @@ Medium 思路: 稍微改了一下[141](https://github.com/Lisanaaa/thinking_in_lc/blob/master/141._linked_list_cycle.md),这里稍微注意一下```while-else clause```就行 +Let’s say, the first node is node 0, the cycle starts at node L, and the length of the cycle is C; +Moreover, after t steps, fast catches slow. +Now we know that fast totally traveled 2t nodes, and slow traveled t nodes + +Then we have: +2t - t = nC (where n is an positive integer.) +i.e. t=nC + +Now, think about that, at step t, if we travels L more steps, where are we? +i.e. if we travel L+t = L + nC steps in total, where are we? + +Absolutely, at the start of the cycle, because we have covered the first L nodes once and the entire cycle n times. + +So, if we travel L more steps at time t, then we get the start of the cycle. + +However, how can we travel exactly L step? +The answer is to use an other pointer to travel from node 0, and when they meet together, it is exactly L steps and both of them are at the start of the cycle. + +参考[LostSummer233的解答](https://leetcode.com/problems/linked-list-cycle-ii/discuss/44833) ```python class Solution(object): def detectCycle(self, head): From 57f61d4746b7332864b8100df4926ac2bf39b635 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 03:57:27 -0600 Subject: [PATCH 210/473] Update 142_Linked_List_Cycle_II.md --- 142_Linked_List_Cycle_II.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/142_Linked_List_Cycle_II.md b/142_Linked_List_Cycle_II.md index 7ca9e24d3..0952995be 100644 --- a/142_Linked_List_Cycle_II.md +++ b/142_Linked_List_Cycle_II.md @@ -12,24 +12,24 @@ Medium 思路: 稍微改了一下[141](https://github.com/Lisanaaa/thinking_in_lc/blob/master/141._linked_list_cycle.md),这里稍微注意一下```while-else clause```就行 -Let’s say, the first node is node 0, the cycle starts at node L, and the length of the cycle is C; -Moreover, after t steps, fast catches slow. +Let’s say, the first node is node ```0```, the cycle starts at node ```L```, and the length of the cycle is ```C```; +Moreover, after ```t``` steps, ```fast``` catches ```slow```. -Now we know that fast totally traveled 2t nodes, and slow traveled t nodes +Now we know that fast totally traveled ```2t``` nodes, and slow traveled ```t``` nodes Then we have: -2t - t = nC (where n is an positive integer.) -i.e. t=nC +```2t - t = nC``` (where ```n``` is an positive integer.) +i.e. ```t=nC``` -Now, think about that, at step t, if we travels L more steps, where are we? -i.e. if we travel L+t = L + nC steps in total, where are we? +Now, think about that, at step ```t```, if we travels ```L``` more steps, where are we? +i.e. if we travel ```L+t = L + nC``` steps in total, where are we? -Absolutely, at the start of the cycle, because we have covered the first L nodes once and the entire cycle n times. +Absolutely, at the start of the cycle, because we have covered the first ```L``` nodes once and the entire cycle ```n``` times. -So, if we travel L more steps at time t, then we get the start of the cycle. +So, if we travel ```L``` more steps at time ```t```, then we get the start of the cycle. -However, how can we travel exactly L step? -The answer is to use an other pointer to travel from node 0, and when they meet together, it is exactly L steps and both of them are at the start of the cycle. +However, how can we travel exactly ```L``` step? +The answer is to use an other pointer to travel from node ```0```, and when they meet together, it is exactly ```L``` steps and both of them are at the start of the cycle. 参考[LostSummer233的解答](https://leetcode.com/problems/linked-list-cycle-ii/discuss/44833) ```python From 8b4afb2ac90c40c1e4155ecb4976cd68d85a1c67 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 03:57:58 -0600 Subject: [PATCH 211/473] Update 141._linked_list_cycle.md --- 141._linked_list_cycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/141._linked_list_cycle.md b/141._linked_list_cycle.md index 2cf604e4e..2d50901e9 100644 --- a/141._linked_list_cycle.md +++ b/141._linked_list_cycle.md @@ -73,7 +73,7 @@ class Solution(object): """ slow = head fast = head - while slow and fast and fast.next: + while fast and fast.next: slow = slow.next fast = fast.next.next if slow == fast: From 3fa2df23fc2816ca231e06c5ac39358359e09491 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 03:58:45 -0600 Subject: [PATCH 212/473] Update 142_Linked_List_Cycle_II.md --- 142_Linked_List_Cycle_II.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/142_Linked_List_Cycle_II.md b/142_Linked_List_Cycle_II.md index 0952995be..cd8875929 100644 --- a/142_Linked_List_Cycle_II.md +++ b/142_Linked_List_Cycle_II.md @@ -1,8 +1,8 @@ -### 141. Linked List Cycle +### 142. Linked List Cycle II 题目: - + 难度: From 90456850eb9b5a317a6d158e06eeaebdff88a165 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 14:09:56 -0600 Subject: [PATCH 213/473] Update 160._intersection_of_two_linked_lists.md --- 160._intersection_of_two_linked_lists.md | 57 ++++-------------------- 1 file changed, 8 insertions(+), 49 deletions(-) diff --git a/160._intersection_of_two_linked_lists.md b/160._intersection_of_two_linked_lists.md index 689528c48..7f8f5bf24 100644 --- a/160._intersection_of_two_linked_lists.md +++ b/160._intersection_of_two_linked_lists.md @@ -1,4 +1,4 @@ -###160. Intersection of Two Linked Lists +### 160. Intersection of Two Linked Lists 题目: @@ -24,62 +24,21 @@ B: b1 → b2 → b3 ``` -然后这个题AC也花了一点时间,因为Python有recursion的limit限制,一开始用的一个求linkedlist len的报错 - -用这个会导致我无法AC,recursion limit达到上限 - -``` -def len(self, head): - if head == None: - return 0 - else: - return 1 + self.len(head.next) -``` AC代码如下: - - -``` +```python class Solution(object): def getIntersectionNode(self, headA, headB): """ :type head1, head1: ListNode :rtype: ListNode """ - lenA = self.len(headA) - lenB = self.len(headB) + pointer_a, pointer_b = headA, headB - if lenA == 0 or lenB == 0: - return None - - pA = headA - pB = headB - - if lenA > lenB: - for i in range(lenA - lenB): - pA = pA.next - else: - for i in range(lenB - lenA): - pB = pB.next - - while pA and pB: - if pA == pB: - return pA - else: - pA = pA.next - pB = pB.next - - return None - - - def len(self, head): - p = head - count = 0 - while p: - count += 1 - p = p.next - return count - -``` \ No newline at end of file + while pointer_a is not pointer_b: + pointer_a = headB if pointer_a is None else pointer_a.next + pointer_b = headA if pointer_b is None else pointer_b.next + return pointer_a +``` From 5f7574b0aadf8c484c8daec232c8ee37084a8549 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 14:21:20 -0600 Subject: [PATCH 214/473] Update 160._intersection_of_two_linked_lists.md --- 160._intersection_of_two_linked_lists.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/160._intersection_of_two_linked_lists.md b/160._intersection_of_two_linked_lists.md index 7f8f5bf24..6b0a85ffd 100644 --- a/160._intersection_of_two_linked_lists.md +++ b/160._intersection_of_two_linked_lists.md @@ -11,8 +11,6 @@ Easy 如果两个linkedlist有intersection的话,可以看到,其实如果一开始我们就走到b2的话,那么我们就可以两个pointer一个一个的对比,到哪一个地址一样,接下来就是intersection部分。 -就一开始把长的那条list走掉多余部分。 - ``` From 09f2bacf85fdb3e8e619523089c710d72ac38389 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 14:43:28 -0600 Subject: [PATCH 215/473] Update 160._intersection_of_two_linked_lists.md --- 160._intersection_of_two_linked_lists.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/160._intersection_of_two_linked_lists.md b/160._intersection_of_two_linked_lists.md index 6b0a85ffd..2d6a916e2 100644 --- a/160._intersection_of_two_linked_lists.md +++ b/160._intersection_of_two_linked_lists.md @@ -33,10 +33,11 @@ class Solution(object): :type head1, head1: ListNode :rtype: ListNode """ - pointer_a, pointer_b = headA, headB - - while pointer_a is not pointer_b: - pointer_a = headB if pointer_a is None else pointer_a.next - pointer_b = headA if pointer_b is None else pointer_b.next - return pointer_a + pA, pB = headA, headB + while pA is not pB: + pA = pA.next if pA else headB + pB = pB.next if pB else headA + return pA ``` +Just count the number of moves by each pointer before they meet. One pointer will traverse entire list1 for N moves and then jump to the head of list1 to move (M-K) steps to intersection, where K represents the length of common part. Now the other pointer must also moved the same number of steps since they are both moved at the same time. The second pointer traverses the entire list2 for M steps and jumped to the head of list1 to move (N-K) steps. So the loop finished with M+N-K times. +详见[zzg_zzm的评论](https://leetcode.com/problems/intersection-of-two-linked-lists/discuss/49799) From 4519aed6dd46f6f94e1ee493ff1c0b6914a244a5 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 14:47:23 -0600 Subject: [PATCH 216/473] Update 160._intersection_of_two_linked_lists.md --- 160._intersection_of_two_linked_lists.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/160._intersection_of_two_linked_lists.md b/160._intersection_of_two_linked_lists.md index 2d6a916e2..da7df31a2 100644 --- a/160._intersection_of_two_linked_lists.md +++ b/160._intersection_of_two_linked_lists.md @@ -41,3 +41,19 @@ class Solution(object): ``` Just count the number of moves by each pointer before they meet. One pointer will traverse entire list1 for N moves and then jump to the head of list1 to move (M-K) steps to intersection, where K represents the length of common part. Now the other pointer must also moved the same number of steps since they are both moved at the same time. The second pointer traverses the entire list2 for M steps and jumped to the head of list1 to move (N-K) steps. So the loop finished with M+N-K times. 详见[zzg_zzm的评论](https://leetcode.com/problems/intersection-of-two-linked-lists/discuss/49799) + +This algorithm is sooooo perfect! + +I was wonder if the running time is O(n+m), but later I figured out that the actually running time is just: + +- m+n for non-intersection case + +With intersection: + +- Suppose for LL-A, it’s a+b=n, a is the # of nodes before intersection + +- Suppose for LL-B, it’s c+b=m, c is the # of nodes before intersection + +Thus the actual running time is a+b+c = n+c = m+a. + +Actually, when b=0, this just stands for the case with no intersection with a+b+c=n+m From d718b79764e4f143b5c537d6fa31fbed6dd551ad Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 14:50:04 -0600 Subject: [PATCH 217/473] Update 160._intersection_of_two_linked_lists.md --- 160._intersection_of_two_linked_lists.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/160._intersection_of_two_linked_lists.md b/160._intersection_of_two_linked_lists.md index da7df31a2..b403f01f9 100644 --- a/160._intersection_of_two_linked_lists.md +++ b/160._intersection_of_two_linked_lists.md @@ -20,7 +20,7 @@ A: a1 → a2 ↗ B: b1 → b2 → b3 ``` - +比较巧妙的数学解法,看下面的解释和代码 From e6852503f3442608b6763dd6a3aede7a835f5f0b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 14:56:00 -0600 Subject: [PATCH 218/473] Update 167._two_sum_ii_-_input_array_is_sorted.md --- 167._two_sum_ii_-_input_array_is_sorted.md | 28 ++++++++++------------ 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/167._two_sum_ii_-_input_array_is_sorted.md b/167._two_sum_ii_-_input_array_is_sorted.md index b0ded8c46..841181264 100644 --- a/167._two_sum_ii_-_input_array_is_sorted.md +++ b/167._two_sum_ii_-_input_array_is_sorted.md @@ -1,4 +1,4 @@ -###167. Two Sum II - Input array is sorted +### 167. Two Sum II - Input array is sorted @@ -12,12 +12,12 @@ Medium 思路: -作为2sum, 3sum, 4sum 的姐妹题,明显我一上来被误导了一下,非要想用binary search(|||因为不小心看了tag),但素其实人家就是用的两个指针,一个指头,一个指尾巴,如果大了就尾巴左移,小了就头部右移,没看出来哪里用了binary 的思想 +双指针 AC Code -``` +```python class Solution(object): def twoSum(self, numbers, target): """ @@ -25,15 +25,13 @@ class Solution(object): :type target: int :rtype: List[int] """ - left, right = 0, len(numbers) - 1 - while left < right: - temp = numbers[left] + numbers[right] - if temp == target: - return [left + 1, right + 1] - elif temp < target: - left += 1 - else: - right -= 1 - return [] - -``` \ No newline at end of file + l, r = 0, len(numbers) - 1 + while l < r: + if numbers[l] + numbers[r] == target: + return [l+1, r+1] + elif numbers[l] + numbers[r] > target: + r -= 1 + else: + l += 1 + +``` From 7084754d14263a652fd0ff9459d36bb994ad0936 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 14:56:20 -0600 Subject: [PATCH 219/473] Update 167._two_sum_ii_-_input_array_is_sorted.md --- 167._two_sum_ii_-_input_array_is_sorted.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/167._two_sum_ii_-_input_array_is_sorted.md b/167._two_sum_ii_-_input_array_is_sorted.md index 841181264..8fcd51708 100644 --- a/167._two_sum_ii_-_input_array_is_sorted.md +++ b/167._two_sum_ii_-_input_array_is_sorted.md @@ -9,14 +9,12 @@ 难度: Medium + 思路: 双指针 - -AC Code - ```python class Solution(object): def twoSum(self, numbers, target): From 948d99964908bdec3402f61ab6346acaeeccb09d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 15:41:02 -0600 Subject: [PATCH 220/473] Update 218._The _Skyline_Problem .md --- 218._The _Skyline_Problem .md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/218._The _Skyline_Problem .md b/218._The _Skyline_Problem .md index 8c80c5f24..3ee9b8721 100644 --- a/218._The _Skyline_Problem .md +++ b/218._The _Skyline_Problem .md @@ -19,7 +19,7 @@ Hard 接下来考虑更多建筑物的情况,从左到右扫描,当我们遇到一个楼的左边界时,把它push到一个heap中。如果后面扫描的楼的高度比heap中最高的楼还高,那么它的左上顶点一定会被加入到skyline中。当我们遇到一个building的右边界时,我们需要将其从heap中pop掉,如果heap中max height有变化,则push到结果中。 - +参考[Brian Gordon的blog](https://briangordon.github.io/2014/08/the-skyline-problem.html) #### 程序代码解释 From 44e0a27489809103e2d4aa17d140187b6ec81e83 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 19:36:30 -0600 Subject: [PATCH 221/473] Update 218._The _Skyline_Problem .md --- 218._The _Skyline_Problem .md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/218._The _Skyline_Problem .md b/218._The _Skyline_Problem .md index 3ee9b8721..096c7c455 100644 --- a/218._The _Skyline_Problem .md +++ b/218._The _Skyline_Problem .md @@ -38,8 +38,8 @@ class Solution(object): """ idx, n = 0, len(buildings) liveBuildings, skyline = [], [] - while idx < n or len(liveBuildings) > 0: - if len(liveBuildings) == 0 or (idx < n and buildings[idx][0] <= -liveBuildings[0][1]): +        while idx < n or len(liveBuildings) > 0: # 只要所有的点没处理完就一直循环 +            if len(liveBuildings) == 0 or (idx < n and buildings[idx][0] <= -liveBuildings[0][1]): start = buildings[idx][0] while idx < n and buildings[idx][0] == start: heapq.heappush(liveBuildings, [-buildings[idx][2], -buildings[idx][1]]) From b51bc130568443f9758cb55797166fbcb9904dfe Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 20:17:28 -0600 Subject: [PATCH 222/473] Update 218._The _Skyline_Problem .md --- 218._The _Skyline_Problem .md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/218._The _Skyline_Problem .md b/218._The _Skyline_Problem .md index 096c7c455..050f5c3ef 100644 --- a/218._The _Skyline_Problem .md +++ b/218._The _Skyline_Problem .md @@ -15,7 +15,7 @@ Hard 开始,假设只有2个建筑物,拿出第一个buiding B1,我们先把它的左上顶点加进我们的output结果skyline中,然后继续拿下一个building B2,我们现在需要将B2的左上顶点对应的x coordinate与B1的右上顶点所对应的x coordinate做比较: - 如果前者小且B2的高度大于B1的高度,则我们将B2的左上顶点也加入skyline中去。 -- 如果前者小且B2的高度小于于B1的高度,则忽略B2的左上顶点 +- 如果前者小且B2的高度小于等于B1的高度,则忽略B2的左上顶点 接下来考虑更多建筑物的情况,从左到右扫描,当我们遇到一个楼的左边界时,把它push到一个heap中。如果后面扫描的楼的高度比heap中最高的楼还高,那么它的左上顶点一定会被加入到skyline中。当我们遇到一个building的右边界时,我们需要将其从heap中pop掉,如果heap中max height有变化,则push到结果中。 From cbdd922a5639ba927caf706310550c609e22eaff Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 20:19:14 -0600 Subject: [PATCH 223/473] Update 218._The _Skyline_Problem .md --- 218._The _Skyline_Problem .md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/218._The _Skyline_Problem .md b/218._The _Skyline_Problem .md index 050f5c3ef..c44680872 100644 --- a/218._The _Skyline_Problem .md +++ b/218._The _Skyline_Problem .md @@ -17,7 +17,7 @@ Hard - 如果前者小且B2的高度大于B1的高度,则我们将B2的左上顶点也加入skyline中去。 - 如果前者小且B2的高度小于等于B1的高度,则忽略B2的左上顶点 -接下来考虑更多建筑物的情况,从左到右扫描,当我们遇到一个楼的左边界时,把它push到一个heap中。如果后面扫描的楼的高度比heap中最高的楼还高,那么它的左上顶点一定会被加入到skyline中。当我们遇到一个building的右边界时,我们需要将其从heap中pop掉,如果heap中max height有变化,则push到结果中。 +接下来考虑更多建筑物的情况,从左到右扫描,当我们遇到第一个楼的左边界时,把它push到一个heap中。如果后面扫描的楼的高度比heap中最高的楼还高,那么它的左上顶点一定会被加入到skyline中。当我们遇到一个building的右边界时,我们需要将其从heap中pop掉,如果heap中max height有变化,则push到结果中。 参考[Brian Gordon的blog](https://briangordon.github.io/2014/08/the-skyline-problem.html) From 3f34c3653088ffff5346d0cc75916b1659fe9b85 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 20:54:43 -0600 Subject: [PATCH 224/473] Update 218._The _Skyline_Problem .md --- 218._The _Skyline_Problem .md | 1 + 1 file changed, 1 insertion(+) diff --git a/218._The _Skyline_Problem .md b/218._The _Skyline_Problem .md index c44680872..78e9efba6 100644 --- a/218._The _Skyline_Problem .md +++ b/218._The _Skyline_Problem .md @@ -20,6 +20,7 @@ Hard 接下来考虑更多建筑物的情况,从左到右扫描,当我们遇到第一个楼的左边界时,把它push到一个heap中。如果后面扫描的楼的高度比heap中最高的楼还高,那么它的左上顶点一定会被加入到skyline中。当我们遇到一个building的右边界时,我们需要将其从heap中pop掉,如果heap中max height有变化,则push到结果中。 参考[Brian Gordon的blog](https://briangordon.github.io/2014/08/the-skyline-problem.html) +[Stefan大神的题解](https://leetcode.com/problems/the-skyline-problem/discuss/61194) #### 程序代码解释 From 9e2a17d1573a03896d730b8561989ff68db062b8 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 30 Dec 2017 20:55:21 -0600 Subject: [PATCH 225/473] Update 218._The _Skyline_Problem .md --- 218._The _Skyline_Problem .md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/218._The _Skyline_Problem .md b/218._The _Skyline_Problem .md index 78e9efba6..34d9c9176 100644 --- a/218._The _Skyline_Problem .md +++ b/218._The _Skyline_Problem .md @@ -20,7 +20,7 @@ Hard 接下来考虑更多建筑物的情况,从左到右扫描,当我们遇到第一个楼的左边界时,把它push到一个heap中。如果后面扫描的楼的高度比heap中最高的楼还高,那么它的左上顶点一定会被加入到skyline中。当我们遇到一个building的右边界时,我们需要将其从heap中pop掉,如果heap中max height有变化,则push到结果中。 参考[Brian Gordon的blog](https://briangordon.github.io/2014/08/the-skyline-problem.html) -[Stefan大神的题解](https://leetcode.com/problems/the-skyline-problem/discuss/61194) + 和 [Stefan大神的题解](https://leetcode.com/problems/the-skyline-problem/discuss/61194) #### 程序代码解释 From 148db54a46c4487ba97685a8fb526adf32a5059b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 15:55:19 -0600 Subject: [PATCH 226/473] Update 230._kth_smallest_element_in_a_bst.md --- 230._kth_smallest_element_in_a_bst.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/230._kth_smallest_element_in_a_bst.md b/230._kth_smallest_element_in_a_bst.md index c583cdca1..058951853 100644 --- a/230._kth_smallest_element_in_a_bst.md +++ b/230._kth_smallest_element_in_a_bst.md @@ -1,4 +1,4 @@ -###230. Kth Smallest Element in a BST +### 230. Kth Smallest Element in a BST 题目: From 85c4eb8dafff0a23bd8c1876173a20fa214c6e0a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 15:55:32 -0600 Subject: [PATCH 227/473] Update 230._kth_smallest_element_in_a_bst.md --- 230._kth_smallest_element_in_a_bst.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/230._kth_smallest_element_in_a_bst.md b/230._kth_smallest_element_in_a_bst.md index 058951853..b51fc7a07 100644 --- a/230._kth_smallest_element_in_a_bst.md +++ b/230._kth_smallest_element_in_a_bst.md @@ -13,7 +13,7 @@ Medium InOrder排序,输出,当然也完全可以用昨天的binary tree iterator,入stack,出stack,直到输出第k位 -``` +```python class Solution(object): def kthSmallest(self, root, k): """ From a46178784c9e868f7337ce0fb82e38bb5ae282ef Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 15:59:48 -0600 Subject: [PATCH 228/473] Update 237._delete_node_in_a_linked_list.md --- 237._delete_node_in_a_linked_list.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/237._delete_node_in_a_linked_list.md b/237._delete_node_in_a_linked_list.md index 8c1ed5e28..d401e090d 100644 --- a/237._delete_node_in_a_linked_list.md +++ b/237._delete_node_in_a_linked_list.md @@ -1,4 +1,4 @@ -###237. Delete Node in a Linked List +### 237. Delete Node in a Linked List 题目: From b06894164178eefd2d2fbbdaf6ca13b827b86c3f Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 16:11:11 -0600 Subject: [PATCH 229/473] Update 242._valid_anagram.md --- 242._valid_anagram.md | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/242._valid_anagram.md b/242._valid_anagram.md index e2d9004b9..46d8cd269 100644 --- a/242._valid_anagram.md +++ b/242._valid_anagram.md @@ -1,4 +1,4 @@ -###242. Valid Anagram +### 242. Valid Anagram 题目: @@ -7,9 +7,8 @@ 难度 : Easy -对Python来说,又是一块蛋糕,基本不本地测试 -就是这么自信 -我的一行解法: +一行瞬秒: + ```python class Solution(object): def isAnagram(self, s, t): @@ -18,10 +17,10 @@ class Solution(object): :type t: str :rtype: bool """ - return len(s) == len(t) and collections.Counter(s) == collections.Counter(t) + return collections.Counter(s) == collections.Counter(t) ``` -``` +```python class Solution(object): def isAnagram(self, s, t): """ @@ -29,14 +28,12 @@ class Solution(object): :type t: str :rtype: bool """ - sList = sorted(list(s)) - tList = sorted(list(t)) - return sList == tList + return sorted(s) == sorted(t) ``` -作弊神奇python大法,看了看别人的解法,用字数统计,因为只可能是26个字母 +用字数统计,因为只可能是26个字母 ``` From 8ddc1b6f2773aa13146a7855f002d56bdab9acf3 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 16:17:01 -0600 Subject: [PATCH 230/473] Update 268._missing_number.md --- 268._missing_number.md | 58 ++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/268._missing_number.md b/268._missing_number.md index d86b99d54..9ca2106dd 100644 --- a/268._missing_number.md +++ b/268._missing_number.md @@ -1,37 +1,33 @@ -###268. Missing Number - -题目: - - - -难度: - -Medium - - - -等差数列前n项和 - 数组之和 - - - -``` +###268. Missing Number + +题目: + + + +难度: + +Medium + + + +等差数列前n项和减去数组之和,一行瞬秒 +```(注意题目input从0开始取值)``` + + +```python class Solution(object): def missingNumber(self, nums): """ :type nums: List[int] :rtype: int """ - m = len(nums) - res = (m+1)*m /2 - for num in nums: - res -= num - return res -``` - - - -第二种解法是位运算:位运算(异或运算) - -原理应该是就是两个数不同,这样才为True,待到研究位运算的时候扩展 - - + return len(nums) * (len(nums) + 1) / 2 - sum(nums) +``` + + + +第二种解法是位运算:位运算(异或运算) + +原理应该是就是两个数不同,这样才为True,待到研究位运算的时候扩展 + + From 46f7c88793cd6c1e467c33cdb1d30e8e1553ae05 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 16:23:00 -0600 Subject: [PATCH 231/473] Update 268._missing_number.md --- 268._missing_number.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/268._missing_number.md b/268._missing_number.md index 9ca2106dd..fbd54da5a 100644 --- a/268._missing_number.md +++ b/268._missing_number.md @@ -1,4 +1,4 @@ -###268. Missing Number +### 268. Missing Number 题目: @@ -28,6 +28,22 @@ class Solution(object): 第二种解法是位运算:位运算(异或运算) -原理应该是就是两个数不同,这样才为True,待到研究位运算的时候扩展 + + +```python +class Solution(object): + def missingNumber(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + res = n = len(nums) + for i in range(n): + res ^= i + res ^= nums[i] + return res +``` + + From b2795e5619602870f144b77c1ff682e1fb43da2c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 16:26:52 -0600 Subject: [PATCH 232/473] Update 292._nim_game.md --- 292._nim_game.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/292._nim_game.md b/292._nim_game.md index 23cad3b13..9f78914f5 100644 --- a/292._nim_game.md +++ b/292._nim_game.md @@ -1,4 +1,4 @@ -###292. Nim Game +### 292. Nim Game 题目: @@ -36,7 +36,7 @@ Easy - n == 8, 先手如何选,总可以转成5,6,7 对方总会赢 -所以 n % 4 != 0 时候,先手必胜 +所以 n % 4 == 0 时候,先手必输 简直是啊,有些游戏就是这样来必赢的啊,没想到你是这样的题目 @@ -52,4 +52,4 @@ class Solution(object): return n % 4 != 0 ``` - \ No newline at end of file + From 91c5b1121d64255c9e55fc0e7ca2a95d842cb3b1 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 16:34:41 -0600 Subject: [PATCH 233/473] =?UTF-8?q?Update=20=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\346\200\273\347\273\223.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/\346\200\273\347\273\223.md" "b/\346\200\273\347\273\223.md" index 6875cbe28..cdbdf2890 100644 --- "a/\346\200\273\347\273\223.md" +++ "b/\346\200\273\347\273\223.md" @@ -3,3 +3,18 @@ # 2 ```not fargs``` 和 ```fargs == None```不一样,前者```fargs```可能为[], '', 0, etc + +# 3 +递归问题 +Any problem can be solved using dp. Solving using a greedy strategy is harder though, since you need to prove that greedy will work for that problem. There are some tell-tale signs of a problem where greedy may be applicable, but isn’t immediately apparent. Example: + +- Choice of an element depends only on its immediate neighbours (wiggle sort). +- Answer is monotonically non-decreasing or non-increasing (sorting). This is also applicable for LIS for example. +- Anything that requires lexicographically largest or smallest of something. +- Anything where processing the input in sorted order will help. +- Anything where processing the input in forward or reverse (as given) will help. +- Anything which requires you to track the minimum or maximum of something (think of sliding window problems). + +There’s matroid theory which deal with greedy algorithms, but I don’t really understand it. If someone does, I’ll be super grateful to them to explain it to me in simple language! + +In general, try to see if for a problem, the solution doesn’t depend on a lot of history about the solution itself, but the next part of the solution is somewhat independent from the rest of the solution. These are all indicative of the fact that a greedy strategy could be applicable. From b551d02c89f7081b42dcf05541af5b6d18043698 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 20:20:52 -0600 Subject: [PATCH 234/473] Update 316._Remove_Duplicate_Letters.md --- 316._Remove_Duplicate_Letters.md | 66 +++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/316._Remove_Duplicate_Letters.md b/316._Remove_Duplicate_Letters.md index ab7f8c6ff..d8447ebf3 100644 --- a/316._Remove_Duplicate_Letters.md +++ b/316._Remove_Duplicate_Letters.md @@ -1,4 +1,4 @@ -###316. Remove Duplicate Letters +### 316. Remove Duplicate Letters 题目: @@ -22,7 +22,9 @@ Hard 做完这些后必须要把c加入到stack和res中去,代表c已经加入到最终结果中的目前应该处于的位置 -``` +参考[python的colloections之defaultdict模块](https://docs.python.org/2/library/collections.html) + +```python class Solution(object): def removeDuplicateLetters(self, s): """ @@ -42,5 +44,65 @@ class Solution(object): remaining[c] -= 1 return ''.join(res) ``` +还有别的一些优美的解法,参考[stefan的回答](https://leetcode.com/problems/remove-duplicate-letters/discuss/76787) + + + +```python +递归贪心版本 +class Solution(object): + def removeDuplicateLetters(self, s): + """ + :type s: str + :rtype: str + """ + for c in sorted(set(s)): + suffix = s[s.index(c):] + if set(suffix) == set(s): + return c + self.removeDuplicateLetters(suffix.replace(c, '')) + return '' +``` +```python +class Solution(object): + def removeDuplicateLetters(self, s): + """ + :type s: str + :rtype: str + """ + result = '' + while s: + i = min(map(s.rindex, set(s))) + c = min(s[:i+1]) + result += c + s = s[s.index(c):].replace(c, '') + return result +``` + +```python +class Solution(object): + def removeDuplicateLetters(self, s): + """ + :type s: str + :rtype: str + """ + rindex = {c: i for i, c in enumerate(s)} + result = '' + for i, c in enumerate(s): + if c not in result: + while c < result[-1:] and i < rindex[result[-1]]: + result = result[:-1] + result += c + return result +``` + + + + + + + + + + From 4d83745fb4a7cd762b435c277ab549f6982fbd8a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 20:37:44 -0600 Subject: [PATCH 235/473] Update 316._Remove_Duplicate_Letters.md --- 316._Remove_Duplicate_Letters.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/316._Remove_Duplicate_Letters.md b/316._Remove_Duplicate_Letters.md index d8447ebf3..cce1a8b43 100644 --- a/316._Remove_Duplicate_Letters.md +++ b/316._Remove_Duplicate_Letters.md @@ -34,13 +34,13 @@ class Solution(object): remaining = collections.defaultdict(int) for c in s: remaining[c] += 1 - stack, res = set(), [] + res, stack = [], set() for c in s: if c not in stack: while res and res[-1] > c and remaining[res[-1]] > 0: stack.remove(res.pop()) + res.append(c) stack.add(c) - res += c remaining[c] -= 1 return ''.join(res) ``` From 50caefd71344592ebd6459ae4c17a4b81c576e2c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 21:29:29 -0600 Subject: [PATCH 236/473] Update 344._reverse_string.md --- 344._reverse_string.md | 82 +++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/344._reverse_string.md b/344._reverse_string.md index ebaecf53c..0e4c0f4fb 100644 --- a/344._reverse_string.md +++ b/344._reverse_string.md @@ -1,47 +1,47 @@ -###344. Reverse String - - - -题目: - - - -难度: -Easy - -思路: - -不要脸的python AC code: - - -``` +### 344. Reverse String + + + +题目: + + + +难度: +Easy + +思路: + +不要脸的python AC code: + + +```python class Solution(object): def reverseString(self, s): """ :type s: str :rtype: str """ - return s[::-1] -``` - -因为python不支持item assignment - -所以如果非要用two pointer来做的话,那么会是这样 - -``` -class Solution(object): - def reverseString(self, s): - """ - :type s: str - :rtype: str - """ - lst = list(s) - n = len(lst) - start, end = 0, n - 1 - - while start < end: - lst[end], lst[start] = lst[start],lst[end] - start += 1 - end -= 1 - return ''.join(lst) -``` + return s[::-1] +``` + +因为python不支持item assignment + +所以如果非要用two pointer来做的话,那么会是这样 + +```python +class Solution(object): + def reverseString(self, s): + """ + :type s: str + :rtype: str + """ + lst = list(s) + n = len(lst) + start, end = 0, n - 1 + + while start < end: + lst[end], lst[start] = lst[start],lst[end] + start += 1 + end -= 1 + return ''.join(lst) +``` From eda7810d4be23ae9a53d7f342017326d0207efa5 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 21:30:52 -0600 Subject: [PATCH 237/473] Rename 345._Reverse_Vowels_of_a_String to 345._Reverse_Vowels_of_a_String.md --- ...verse_Vowels_of_a_String => 345._Reverse_Vowels_of_a_String.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 345._Reverse_Vowels_of_a_String => 345._Reverse_Vowels_of_a_String.md (100%) diff --git a/345._Reverse_Vowels_of_a_String b/345._Reverse_Vowels_of_a_String.md similarity index 100% rename from 345._Reverse_Vowels_of_a_String rename to 345._Reverse_Vowels_of_a_String.md From 82f7c855943bff440db675c0dff4aa2bf8ffc1fc Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 21:39:54 -0600 Subject: [PATCH 238/473] Update 345._Reverse_Vowels_of_a_String.md --- 345._Reverse_Vowels_of_a_String.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/345._Reverse_Vowels_of_a_String.md b/345._Reverse_Vowels_of_a_String.md index 41fc053c6..238022466 100644 --- a/345._Reverse_Vowels_of_a_String.md +++ b/345._Reverse_Vowels_of_a_String.md @@ -18,7 +18,6 @@ Easy ```python -python class Solution(object): def reverseVowels(self, s): """ @@ -40,15 +39,18 @@ class Solution(object): return ''.join(string) ``` +正则版本 - - - -Author: Keqi Huang - -If you like it, please spread your support - -![Support](https://github.com/Lisanaaa/myTODOs/blob/master/WechatIMG17.jpeg) +```python +class Solution(object): + def reverseVowels(self, s): + """ + :type s: str + :rtype: str + """ + vowels = re.findall('(?i)[aeiou]', s) + return re.sub('(?i)[aeiou]', lambda m: vowels.pop(), s) +``` From 30a381ae2e4624eb33d07a0917717260a4763557 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 21:41:46 -0600 Subject: [PATCH 239/473] Update 349._intersection_of_two_arrays.md --- 349._intersection_of_two_arrays.md | 36 +++++++++++++++--------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/349._intersection_of_two_arrays.md b/349._intersection_of_two_arrays.md index d3c1f5868..2f79b8dd9 100644 --- a/349._intersection_of_two_arrays.md +++ b/349._intersection_of_two_arrays.md @@ -1,18 +1,18 @@ -###349. Intersection of Two Arrays - -题目: - - - -难度: - -Easy - - - -Python一句话作弊 - -``` +### 349. Intersection of Two Arrays + +题目: + + + +难度: + +Easy + + + +Python一句话作弊 + +```python class Solution(object): def intersection(self, nums1, nums2): """ @@ -20,6 +20,6 @@ class Solution(object): :type nums2: List[int] :rtype: List[int] """ - return list(set(nums1).intersection(nums2)) -``` - + return list(set(nums1).intersection(nums2)) +``` + From 806f2994105e40b6191b1e1afbe126c28a3bdce0 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 21:46:26 -0600 Subject: [PATCH 240/473] Update 350._intersection_of_two_arrays_ii.md --- 350._intersection_of_two_arrays_ii.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/350._intersection_of_two_arrays_ii.md b/350._intersection_of_two_arrays_ii.md index 5b6c5632e..d2a444772 100644 --- a/350._intersection_of_two_arrays_ii.md +++ b/350._intersection_of_two_arrays_ii.md @@ -44,6 +44,19 @@ class Solution(object): return res ``` +两行版本 +```python +class Solution(object): + def intersect(self, nums1, nums2): + """ + :type nums1: List[int] + :type nums2: List[int] + :rtype: List[int] + """ + a, b = map(collections.Counter, (nums1, nums2)) + return list((a & b).elements()) +``` + From dc80002bf96ba0ea6b754b66cf3d929567131a35 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 21:52:27 -0600 Subject: [PATCH 241/473] =?UTF-8?q?Update=20=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\346\200\273\347\273\223.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/\346\200\273\347\273\223.md" "b/\346\200\273\347\273\223.md" index cdbdf2890..36a3c25c2 100644 --- "a/\346\200\273\347\273\223.md" +++ "b/\346\200\273\347\273\223.md" @@ -18,3 +18,6 @@ Any problem can be solved using dp. Solving using a greedy strategy is harder th There’s matroid theory which deal with greedy algorithms, but I don’t really understand it. If someone does, I’ll be super grateful to them to explain it to me in simple language! In general, try to see if for a problem, the solution doesn’t depend on a lot of history about the solution itself, but the next part of the solution is somewhat independent from the rest of the solution. These are all indicative of the fact that a greedy strategy could be applicable. + +# 4 +[Counter.elments()](https://docs.python.org/2/library/collections.html) From e28ff6f05aa6d83e4215c027bbbb920d71b69dfc Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 21:52:37 -0600 Subject: [PATCH 242/473] =?UTF-8?q?Update=20=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/\346\200\273\347\273\223.md" "b/\346\200\273\347\273\223.md" index 36a3c25c2..6cbed571c 100644 --- "a/\346\200\273\347\273\223.md" +++ "b/\346\200\273\347\273\223.md" @@ -20,4 +20,4 @@ There’s matroid theory which deal with greedy algorithms, but I don’t really In general, try to see if for a problem, the solution doesn’t depend on a lot of history about the solution itself, but the next part of the solution is somewhat independent from the rest of the solution. These are all indicative of the fact that a greedy strategy could be applicable. # 4 -[Counter.elments()](https://docs.python.org/2/library/collections.html) +[Counter.elements()](https://docs.python.org/2/library/collections.html) From 21694c520427d7cd63aa2f0cbb957076d1155c81 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 22:13:55 -0600 Subject: [PATCH 243/473] Update 378._kth_smallest_element_in_a_sorted_matrix.md --- ...kth_smallest_element_in_a_sorted_matrix.md | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/378._kth_smallest_element_in_a_sorted_matrix.md b/378._kth_smallest_element_in_a_sorted_matrix.md index 69ec45988..1cb52400f 100644 --- a/378._kth_smallest_element_in_a_sorted_matrix.md +++ b/378._kth_smallest_element_in_a_sorted_matrix.md @@ -1,4 +1,4 @@ -###378. Kth Smallest Element in a Sorted Matrix +### 378. Kth Smallest Element in a Sorted Matrix @@ -9,9 +9,26 @@ 难度: Medium -思路: +### 思路一:暴力法 + +```python +class Solution(object): + def kthSmallest(self, matrix, k): + """ + :type matrix: List[List[int]] + :type k: int + :rtype: int + """ + tmp = [] + for row in matrix: + for column in row: + tmp.append(column) + tmp.sort() + return tmp[k-1] if tmp and len(tmp)>0 else None +``` +### 思路二: 两个tag : binary search, heap ######先来heap @@ -26,8 +43,7 @@ Medium 参考: -``` -from heapq import * +```python class Solution(object): def kthSmallest(self, matrix, k): """ @@ -44,7 +60,7 @@ class Solution(object): for i in range(col): # heap store its value and location - heappush(heap, (matrix[0][i], 0, i)) + heapq.heappush(heap, (matrix[0][i], 0, i)) print heap @@ -53,9 +69,9 @@ class Solution(object): x = cur[1] y = cur[2] if x+1 < row: - heappush(heap, (matrix[x+1][y],x+1,y)) + heapq.heappush(heap, (matrix[x+1][y],x+1,y)) return heap[0][0] ``` -##### 必然还有利用binary search的算法 \ No newline at end of file +##### 必然还有利用binary search的算法 From 71ec0d26c22eecc6f2356f6746673813c57925c5 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 22:18:39 -0600 Subject: [PATCH 244/473] Update 378._kth_smallest_element_in_a_sorted_matrix.md --- 378._kth_smallest_element_in_a_sorted_matrix.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/378._kth_smallest_element_in_a_sorted_matrix.md b/378._kth_smallest_element_in_a_sorted_matrix.md index 1cb52400f..9a4bee187 100644 --- a/378._kth_smallest_element_in_a_sorted_matrix.md +++ b/378._kth_smallest_element_in_a_sorted_matrix.md @@ -74,4 +74,17 @@ class Solution(object): return heap[0][0] ``` +### 思路三: 一行 + +```python +class Solution(object): + def kthSmallest(self, matrix, k): + """ + :type matrix: List[List[int]] + :type k: int + :rtype: int + """ + return list(heapq.merge(*matrix))[k-1] +``` + ##### 必然还有利用binary search的算法 From 72419b95da029e07aa3ef2156e5f7f9ed19f32fb Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 22:22:00 -0600 Subject: [PATCH 245/473] Update 378._kth_smallest_element_in_a_sorted_matrix.md --- ...kth_smallest_element_in_a_sorted_matrix.md | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/378._kth_smallest_element_in_a_sorted_matrix.md b/378._kth_smallest_element_in_a_sorted_matrix.md index 9a4bee187..ec4e3a1da 100644 --- a/378._kth_smallest_element_in_a_sorted_matrix.md +++ b/378._kth_smallest_element_in_a_sorted_matrix.md @@ -74,7 +74,7 @@ class Solution(object): return heap[0][0] ``` -### 思路三: 一行 +### 思路三: heapq一行 ```python class Solution(object): @@ -87,4 +87,21 @@ class Solution(object): return list(heapq.merge(*matrix))[k-1] ``` -##### 必然还有利用binary search的算法 +#### binary search +```python +class Solution(object): + def kthSmallest(self, matrix, k): + """ + :type matrix: List[List[int]] + :type k: int + :rtype: int + """ + l, r = matrix[0][0], matrix[-1][-1] + while l <= r: + mid = l + ((r - l) >> 2) + if sum(bisect.bisect_right(row, mid) for row in matrix) < k: + l = mid + 1 + else: + r = mid - 1 + return l +``` From 73d9bd2482a473e48359579e3ba97486a4efec86 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 22:22:09 -0600 Subject: [PATCH 246/473] Update 378._kth_smallest_element_in_a_sorted_matrix.md --- 378._kth_smallest_element_in_a_sorted_matrix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/378._kth_smallest_element_in_a_sorted_matrix.md b/378._kth_smallest_element_in_a_sorted_matrix.md index ec4e3a1da..1998dead8 100644 --- a/378._kth_smallest_element_in_a_sorted_matrix.md +++ b/378._kth_smallest_element_in_a_sorted_matrix.md @@ -87,7 +87,7 @@ class Solution(object): return list(heapq.merge(*matrix))[k-1] ``` -#### binary search +### binary search ```python class Solution(object): def kthSmallest(self, matrix, k): From bdf3f33d4ab6f4ab60a2ed0275b1b0a02d7eba63 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 31 Dec 2017 22:27:08 -0600 Subject: [PATCH 247/473] Update 378._kth_smallest_element_in_a_sorted_matrix.md --- 378._kth_smallest_element_in_a_sorted_matrix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/378._kth_smallest_element_in_a_sorted_matrix.md b/378._kth_smallest_element_in_a_sorted_matrix.md index 1998dead8..34c267b41 100644 --- a/378._kth_smallest_element_in_a_sorted_matrix.md +++ b/378._kth_smallest_element_in_a_sorted_matrix.md @@ -87,7 +87,7 @@ class Solution(object): return list(heapq.merge(*matrix))[k-1] ``` -### binary search +### 思路四; binary search ```python class Solution(object): def kthSmallest(self, matrix, k): From 66c7fc450aebe532131c67e47468c387edbb4a47 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 08:07:58 -0600 Subject: [PATCH 248/473] Update 383._ransom_note.md --- 383._ransom_note.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/383._ransom_note.md b/383._ransom_note.md index 6d6e0cf2d..52341ba07 100644 --- a/383._ransom_note.md +++ b/383._ransom_note.md @@ -1,17 +1,17 @@ -###383. Ransom Note - -题目: - - - -难度 : Easy - - - -略微想了一下,用了一个dictionary来存magazine里面的单字出现的个数,然后来对应check是否可以用来组成ransomNote - - -``` +### 383. Ransom Note + +题目: + + + +难度 : Easy + + + +略微想了一下,用了一个dictionary来存magazine里面的单字出现的个数,然后来对应check是否可以用来组成ransomNote + + +``` class Solution(object): def canConstruct(self, ransomNote, magazine): """ @@ -29,9 +29,9 @@ class Solution(object): for i in ransomNote: if i not in mapx: return False - elif i in mapx: +            else: mapx[i] -= 1 if mapx[i] < 0: return False - return True -``` + return True +``` From 17b05af97a4f8a696c9aaa541fd7b33a5c6cfb64 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 08:16:07 -0600 Subject: [PATCH 249/473] Update 383._ransom_note.md --- 383._ransom_note.md | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/383._ransom_note.md b/383._ransom_note.md index 52341ba07..6a6ee16e7 100644 --- a/383._ransom_note.md +++ b/383._ransom_note.md @@ -11,7 +11,7 @@ 略微想了一下,用了一个dictionary来存magazine里面的单字出现的个数,然后来对应check是否可以用来组成ransomNote -``` +```python class Solution(object): def canConstruct(self, ransomNote, magazine): """ @@ -19,19 +19,35 @@ class Solution(object): :type magazine: str :rtype: bool """ - mapx = {} + maps = {} for i in magazine: - if i not in mapx: - mapx[i] = 1 + if i in maps: + maps[i] += 1 else: - mapx[i] += 1 - + maps[i] = 1 for i in ransomNote: - if i not in mapx: + if i not in maps: return False -            else: - mapx[i] -= 1 - if mapx[i] < 0: + else: + maps[i] -= 1 + if maps[i] < 0: return False return True ``` +解法2: + +```python +class Solution(object): + def canConstruct(self, ransomNote, magazine): + """ + :type ransomNote: str + :type magazine: str + :rtype: bool + """ + magCounter = collections.Counter(magazine) + ranCounter = collections.Counter(ransomNote) + for k in ranCounter: + if ranCounter.get(k) > magCounter.get(k): + return False + return True +``` From ac5db7284100eecb12ad245f952e265fe2cf27b4 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 08:18:41 -0600 Subject: [PATCH 250/473] Update 434._number_of_segments_in_a_string.md --- 434._number_of_segments_in_a_string.md | 42 +++++++++++++------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/434._number_of_segments_in_a_string.md b/434._number_of_segments_in_a_string.md index 2f478e20c..0b900c5b5 100644 --- a/434._number_of_segments_in_a_string.md +++ b/434._number_of_segments_in_a_string.md @@ -1,27 +1,27 @@ -###434. Number of Segments in a String - -题目: - - - -难度: - -Easy - - -作弊神器Python - - -``` +### 434. Number of Segments in a String + +题目: + + + +难度: + +Easy + + +作弊神器Python + + +``` class Solution(object): def countSegments(self, s): """ :type s: str :rtype: int """ - return len(s.split()) -``` - -不过对于比如C++这种语言来说,应该是O(N),扫一圈应该也能得到正确答案 - -总之拿Python做string的题目就是作弊啊 \ No newline at end of file + return len(s.split()) +``` + +不过对于比如C++这种语言来说,应该是O(N),扫一圈应该也能得到正确答案 + +总之拿Python做string的题目就是作弊啊 From edf179c36c7062b0f93125c1b2fcede5cd192dc4 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 08:21:20 -0600 Subject: [PATCH 251/473] Update 434._number_of_segments_in_a_string.md --- 434._number_of_segments_in_a_string.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/434._number_of_segments_in_a_string.md b/434._number_of_segments_in_a_string.md index 0b900c5b5..424472a5a 100644 --- a/434._number_of_segments_in_a_string.md +++ b/434._number_of_segments_in_a_string.md @@ -12,7 +12,7 @@ Easy 作弊神器Python -``` +```python class Solution(object): def countSegments(self, s): """ From 2a49150f176b75a337245ef953d4e0ad4283797e Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 09:56:28 -0600 Subject: [PATCH 252/473] Update 003._longest_substring_without_repeating_characters.md --- ..._substring_without_repeating_characters.md | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/003._longest_substring_without_repeating_characters.md b/003._longest_substring_without_repeating_characters.md index 02b5c55e8..8b8ef18eb 100644 --- a/003._longest_substring_without_repeating_characters.md +++ b/003._longest_substring_without_repeating_characters.md @@ -46,6 +46,34 @@ class Solution(object): return l ``` +```python +class Solution(object): + def lengthOfLongestSubstring(self, s): + """ + :type s: str + :rtype: int + """ + maps = {} + begin, end, counter, d = 0, 0, 0, 0 + while end < len(s): + if s[end] in maps: + maps[s[end]] += 1 + else: + maps[s[end]] = 1 + if maps[s[end]] > 1: + counter += 1 + end += 1 + while counter > 0: + if maps[s[begin]] > 1: + counter -= 1 + maps[s[begin]] -= 1 + begin += 1 + d = max(d, end - begin) + return d +``` + + + From cd251ba714ad05d40f5492100e31d1019ddbb1c7 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 10:33:49 -0600 Subject: [PATCH 253/473] Create 076._Minimum_Window_Substring.md --- 076._Minimum_Window_Substring.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 076._Minimum_Window_Substring.md diff --git a/076._Minimum_Window_Substring.md b/076._Minimum_Window_Substring.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/076._Minimum_Window_Substring.md @@ -0,0 +1 @@ + From ab8350214175b74c7eb029f43c8599704392256e Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 10:35:23 -0600 Subject: [PATCH 254/473] Update 076._Minimum_Window_Substring.md --- 076._Minimum_Window_Substring.md | 43 ++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/076._Minimum_Window_Substring.md b/076._Minimum_Window_Substring.md index 8b1378917..1407d82d3 100644 --- a/076._Minimum_Window_Substring.md +++ b/076._Minimum_Window_Substring.md @@ -1 +1,44 @@ +### 76. Minimum Window Substring +题目: + + + +难度 : Hard + + +模板大法 + + +```python +class Solution(object): + def minWindow(self, s, t): + """ + :type s: str + :type t: str + :rtype: str + """ + if len(t) > len(s): + return '' + maps = collections.Counter(t) + counter = len(maps.keys()) + begin, end, head, length = 0, 0, 0, float('inf') + while end < len(s): + if s[end] in maps: + maps[s[end]] -= 1 + if maps[s[end]] == 0: + counter -= 1 + end += 1 + while counter == 0: + if s[begin] in maps: + maps[s[begin]] += 1 + if maps[s[begin]] > 0: + counter += 1 + if end - begin < length: + length = end - begin + head = begin + begin += 1 + if length == float('inf'): + return '' + return s[head:head+length] +``` From 42507d7f437c370fe9a643b705e5c15de53d5ce4 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 10:56:15 -0600 Subject: [PATCH 255/473] Create slide_windows_template.md --- slide_windows_template.md | 82 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 slide_windows_template.md diff --git a/slide_windows_template.md b/slide_windows_template.md new file mode 100644 index 000000000..dcd6f2df4 --- /dev/null +++ b/slide_windows_template.md @@ -0,0 +1,82 @@ +带注释版本 +```python +class Solution(object): + def slideWindowTemplate(self, s, t): + """ + :type s: str + :type t: str + :rtype: 具体题目具体分析 + """ + # init a collection or int value to save the result according the question. + res = [] + if len(t) > len(s): + return res + + # create a hashmap to save the Characters of the target substring. + # (K, V) = (Character, Frequence of the Characters) + maps = collections.Counter(t) + + # maintain a counter to check whether match the target string. + # must be the map size, NOT the string size because the char may be duplicate. + counter = len(maps.keys()) + + # Two Pointers: begin - left pointer of the window; end - right pointer of the window + begin, end = 0, 0 + + # the length of the substring which match the target string. + length = sys.maxint + + # loop at the begining of the source string + while end < len(s): + if s[end] in maps: + maps[s[end]] += 1 # plus or minus one + if maps[s[end]] == 0: + counter -= 1 # modify the counter according the requirement(different condition). + end += 1 + + # increase begin pointer to make it invalid/valid again + while counter == 0: + if s[begin] in maps: + maps[s[begin]] -= 1 # plus or minus one + if maps[s[begin]] > 0: + counter += 1 # modify the counter according the requirement(different condition). + begin += 1 + + ''' + type your code here according to the question + 1. save / update(min/max) the result if find a target + 2. result: collections or int value + ''' + return res +``` + +无注释版本: +```python +class Solution(object): + def minWindow(self, s, t): + res = [] + if len(t) > len(s): + return res + maps = collections.Counter(t) + counter = len(maps.keys()) + begin, end = 0, 0 + length = sys.maxint + while end < len(s): + if s[end] in maps: + maps[s[end]] += 1 + if maps[s[end]] == 0: + counter -= 1 + end += 1 + while counter == 0: + if s[begin] in maps: + maps[s[begin]] -= 1 + if maps[s[begin]] > 0: + counter += 1 + begin += 1 + + ''' + 1. save / update(min/max) the result if find a target + 2. result: collections or int value + ''' + return res +``` From 0d958d34d01549e26df1ac46dfa7979cf1730c9d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 11:11:02 -0600 Subject: [PATCH 256/473] Update slide_windows_template.md --- slide_windows_template.md | 100 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 3 deletions(-) diff --git a/slide_windows_template.md b/slide_windows_template.md index dcd6f2df4..35f2856d0 100644 --- a/slide_windows_template.md +++ b/slide_windows_template.md @@ -1,4 +1,4 @@ -带注释版本 +带注释python版本 ```python class Solution(object): def slideWindowTemplate(self, s, t): @@ -35,7 +35,7 @@ class Solution(object): end += 1 # increase begin pointer to make it invalid/valid again - while counter == 0: + while counter == 0: # counter condition. different question may have different condition if s[begin] in maps: maps[s[begin]] -= 1 # plus or minus one if maps[s[begin]] > 0: @@ -50,7 +50,7 @@ class Solution(object): return res ``` -无注释版本: +无注释python版本: ```python class Solution(object): def minWindow(self, s, t): @@ -80,3 +80,97 @@ class Solution(object): ''' return res ``` +带注释java版本 +```java +public class Solution { + public List slidingWindowTemplateByHarryChaoyangHe(String s, String t) { + //init a collection or int value to save the result according the question. + List result = new LinkedList<>(); + if(t.length()> s.length()) return result; + + //create a hashmap to save the Characters of the target substring. + //(K, V) = (Character, Frequence of the Characters) + Map map = new HashMap<>(); + for(char c : t.toCharArray()){ + map.put(c, map.getOrDefault(c, 0) + 1); + } + //maintain a counter to check whether match the target string. + int counter = map.size();//must be the map size, NOT the string size because the char may be duplicate. + + //Two Pointers: begin - left pointer of the window; end - right pointer of the window + int begin = 0, end = 0; + + //the length of the substring which match the target string. + int len = Integer.MAX_VALUE; + + //loop at the begining of the source string + while(end < s.length()){ + + char c = s.charAt(end);//get a character + + if( map.containsKey(c) ){ + map.put(c, map.get(c)-1);// plus or minus one + if(map.get(c) == 0) counter--;//modify the counter according the requirement(different condition). + } + end++; + + //increase begin pointer to make it invalid/valid again + while(counter == 0 /* counter condition. different question may have different condition */){ + + char tempc = s.charAt(begin);//***be careful here: choose the char at begin pointer, NOT the end pointer + if(map.containsKey(tempc)){ + map.put(tempc, map.get(tempc) + 1);//plus or minus one + if(map.get(tempc) > 0) counter++;//modify the counter according the requirement(different condition). + } + + /* save / update(min/max) the result if find a target*/ + // result collections or result int value + + begin++; + } + } + return result; + } +} +``` + +无注释java版本: +```java +public class Solution { + public List slidingWindowTemplateByHarryChaoyangHe(String s, String t) { + List result = new LinkedList<>(); + if(t.length()> s.length()) return result; + Map map = new HashMap<>(); + for(char c : t.toCharArray()){ + map.put(c, map.getOrDefault(c, 0) + 1); + } + int counter = map.size(); + int begin = 0, end = 0; + int len = Integer.MAX_VALUE; + while(end < s.length()){ + char c = s.charAt(end); + if( map.containsKey(c) ){ + map.put(c, map.get(c)-1); + if(map.get(c) == 0) counter--; + } + end++; + while(counter == 0){ + char tempc = s.charAt(begin); + if(map.containsKey(tempc)){ + map.put(tempc, map.get(tempc) + 1); + if(map.get(tempc) > 0) counter++; + } + + /* + save / update(min/max) the result if find a target + result collections or result int value + */ + + begin++; + } + } + return result; + } +} +``` + From 94ee0c509a2adef4fb4b02b1acf65b3cbfd2e6a5 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 11:17:59 -0600 Subject: [PATCH 257/473] Create 159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md --- ...ubstring_with_At_Most_Two_Distinct_Characters.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md diff --git a/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md b/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md new file mode 100644 index 000000000..8c6b2f955 --- /dev/null +++ b/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md @@ -0,0 +1,13 @@ +### 159. Longest Substring with At Most Two Distinct Characters + +题目: + + + +难度 : Hard + + + +```python + +``` From c1cfdffeefaa825e624330df3b9b29da3822d425 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 11:18:31 -0600 Subject: [PATCH 258/473] Update slide_windows_template.md --- slide_windows_template.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/slide_windows_template.md b/slide_windows_template.md index 35f2856d0..7fa98a951 100644 --- a/slide_windows_template.md +++ b/slide_windows_template.md @@ -1,3 +1,10 @@ +能用此模板解决的题目目前有如下: +[leetcode 003](https://github.com/Lisanaaa/thinking_in_lc/blob/master/003._longest_substring_without_repeating_characters.md), +[leetcode 076](https://github.com/Lisanaaa/thinking_in_lc/blob/master/076._Minimum_Window_Substring.md), +[leetcode 159](https://github.com/Lisanaaa/thinking_in_lc/blob/master/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md) + + + 带注释python版本 ```python class Solution(object): From 9097b27ca5a10eb50fca7440aca20ae8a3350de3 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 11:19:37 -0600 Subject: [PATCH 259/473] Update 159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md --- ...ng_with_At_Most_Two_Distinct_Characters.md | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md b/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md index 8c6b2f955..e093cc6e1 100644 --- a/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md +++ b/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md @@ -9,5 +9,24 @@ ```python - +class Solution(object): + def lengthOfLongestSubstringTwoDistinct(self, s): + """ + :type s: str + :rtype: int + """ + maps = {} + begin, end, counter, length = 0, 0, 0, 0 + while end < len(s): + maps[s[end]] = maps.get(s[end], 0) + 1 + if maps[s[end]] == 1: + counter += 1 + end += 1 + while counter > 2: + maps[s[begin]] -= 1 + if maps[s[begin]] == 0: + counter -= 1 + begin += 1 + length = max(length, end - begin) + return length ``` From eeb96448c5a1082bacd59e00df2c9f7b22b16bd5 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 11:45:18 -0600 Subject: [PATCH 260/473] Update 438._Find_All_Anagrams_in_a_String.md --- 438._Find_All_Anagrams_in_a_String.md | 33 ++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/438._Find_All_Anagrams_in_a_String.md b/438._Find_All_Anagrams_in_a_String.md index 47417e197..2b8519852 100644 --- a/438._Find_All_Anagrams_in_a_String.md +++ b/438._Find_All_Anagrams_in_a_String.md @@ -34,7 +34,7 @@ class Solution(object): # 此法超时 ``` 于是用双指针,left和right都从0开始往后遍历 -```python +``` class Solution(object): def findAnagrams(self, s, p): """ @@ -56,6 +56,37 @@ class Solution(object): right += 1 return res ``` +模板大法好 +```python +class Solution(object): + def findAnagrams(self, s, p): + """ + :type s: str + :type p: str + :rtype: List[int] + """ + res = [] + if len(p) > len(s): + return res + maps = collections.Counter(p) + counter = len(maps.keys()) + begin, end, head, length = 0, 0, 0, sys.maxint + while end < len(s): + if s[end] in maps: + maps[s[end]] -= 1 + if maps[s[end]] == 0: + counter -= 1 + end += 1 + while counter == 0: + if s[begin] in maps: + maps[s[begin]] += 1 + if maps[s[begin]] > 0: + counter += 1 + if end - begin == len(p): + res.append(begin) + begin += 1 + return res +``` From ba3e461e475508bd0b125a2c6fda38e20c8da773 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 11:50:51 -0600 Subject: [PATCH 261/473] Create 30._Substring_with_Concatenation_of_All_Words.md --- 30._Substring_with_Concatenation_of_All_Words.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 30._Substring_with_Concatenation_of_All_Words.md diff --git a/30._Substring_with_Concatenation_of_All_Words.md b/30._Substring_with_Concatenation_of_All_Words.md new file mode 100644 index 000000000..a24a9bed0 --- /dev/null +++ b/30._Substring_with_Concatenation_of_All_Words.md @@ -0,0 +1,13 @@ +### 30. Substring with Concatenation of All Words + +题目: + + + +难度 : Hard + + + +```python + +``` From b2e5b09cfca07b1d27240d2cd37efd659a330aac Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 11:53:01 -0600 Subject: [PATCH 262/473] Update slide_windows_template.md --- slide_windows_template.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/slide_windows_template.md b/slide_windows_template.md index 7fa98a951..a061d1131 100644 --- a/slide_windows_template.md +++ b/slide_windows_template.md @@ -1,7 +1,9 @@ 能用此模板解决的题目目前有如下: [leetcode 003](https://github.com/Lisanaaa/thinking_in_lc/blob/master/003._longest_substring_without_repeating_characters.md), +[leetcode 030](https://github.com/Lisanaaa/thinking_in_lc/edit/master/30._Substring_with_Concatenation_of_All_Words.md), [leetcode 076](https://github.com/Lisanaaa/thinking_in_lc/blob/master/076._Minimum_Window_Substring.md), -[leetcode 159](https://github.com/Lisanaaa/thinking_in_lc/blob/master/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md) +[leetcode 159](https://github.com/Lisanaaa/thinking_in_lc/blob/master/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md), +[leetcode 438](https://github.com/Lisanaaa/thinking_in_lc/blob/master/438._Find_All_Anagrams_in_a_String.md) From 34b2ec80860a715f4da1617273cfcda5083a9190 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 5 Jan 2018 12:09:57 -0600 Subject: [PATCH 263/473] Update 159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md --- ...gest_Substring_with_At_Most_Two_Distinct_Characters.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md b/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md index e093cc6e1..7d65fb605 100644 --- a/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md +++ b/159._Longest_Substring_with_At_Most_Two_Distinct_Characters.md @@ -21,12 +21,12 @@ class Solution(object): maps[s[end]] = maps.get(s[end], 0) + 1 if maps[s[end]] == 1: counter += 1 - end += 1 - while counter > 2: +            end += 1   # end 永远指向下一个待处理的字符 +            while counter > 2: maps[s[begin]] -= 1 if maps[s[begin]] == 0: counter -= 1 begin += 1 - length = max(length, end - begin) - return length +            length = max(length, end - begin) # 因此这里是```end - begin```而不是```end - begin + 1``` +        return length ``` From 1fa65aaee710e205a49bfb0730a59b2f6e63e2a5 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 6 Jan 2018 00:06:33 -0600 Subject: [PATCH 264/473] Update slide_windows_template.md --- slide_windows_template.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slide_windows_template.md b/slide_windows_template.md index a061d1131..c4768d23f 100644 --- a/slide_windows_template.md +++ b/slide_windows_template.md @@ -10,7 +10,7 @@ 带注释python版本 ```python class Solution(object): - def slideWindowTemplate(self, s, t): + def slideWindowTemplateByLisanaaa(self, s, t): """ :type s: str :type t: str @@ -62,7 +62,7 @@ class Solution(object): 无注释python版本: ```python class Solution(object): - def minWindow(self, s, t): + def slideWindowTemplateByLisanaaa(self, s, t): res = [] if len(t) > len(s): return res From 3999f73343059b6f29c4abc8fe9cea713ef89dc4 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 6 Jan 2018 09:25:34 -0600 Subject: [PATCH 265/473] Update and rename 30._Substring_with_Concatenation_of_All_Words.md to 030._Substring_with_Concatenation_of_All_Words.md --- ...bstring_with_Concatenation_of_All_Words.md | 54 +++++++++++++++++++ ...bstring_with_Concatenation_of_All_Words.md | 13 ----- 2 files changed, 54 insertions(+), 13 deletions(-) create mode 100644 030._Substring_with_Concatenation_of_All_Words.md delete mode 100644 30._Substring_with_Concatenation_of_All_Words.md diff --git a/030._Substring_with_Concatenation_of_All_Words.md b/030._Substring_with_Concatenation_of_All_Words.md new file mode 100644 index 000000000..0dd9eea26 --- /dev/null +++ b/030._Substring_with_Concatenation_of_All_Words.md @@ -0,0 +1,54 @@ +### 30. Substring with Concatenation of All Words + +题目: + + + +难度 : Hard + + + +```python +class Solution(object): + def findSubstring(self, s, words): + """ + :type s: str + :type words: List[str] + :rtype: List[int] + """ + res = [] + if len(words) == 0 or len(s) < len(words) * len(words[0]): + return res + n, m, wl = len(s), len(words), len(words[0]) + maps, cur_map = {}, {} + maps = collections.Counter(words) + for i in range(wl): + count, start, r = 0, i, i + while r + wl <= n: + string = s[r:r+wl] + if string in maps: + cur_map[string] = cur_map.get(string, 0) + 1 + if cur_map[string] <= maps[string]: + count += 1 + while cur_map[string] > maps[string]: + tmp = s[start:start+wl] + cur_map[tmp] -= 1 + start += wl + if cur_map[tmp] < maps[tmp]: + count -= 1 + if count == m: + res.append(start) + tmp = s[start:start+wl] + cur_map[tmp] -= 1 + start += wl + count -= 1 + else: + cur_map = {} + count = 0 + start = r + wl + r += wl + cur_map = {} + return res + + +``` diff --git a/30._Substring_with_Concatenation_of_All_Words.md b/30._Substring_with_Concatenation_of_All_Words.md deleted file mode 100644 index a24a9bed0..000000000 --- a/30._Substring_with_Concatenation_of_All_Words.md +++ /dev/null @@ -1,13 +0,0 @@ -### 30. Substring with Concatenation of All Words - -题目: - - - -难度 : Hard - - - -```python - -``` From 314fc80b252cd245a2dc15486f4df0a7126c0799 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 6 Jan 2018 09:45:08 -0600 Subject: [PATCH 266/473] Update slide_windows_template.md --- slide_windows_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slide_windows_template.md b/slide_windows_template.md index c4768d23f..09a1917f5 100644 --- a/slide_windows_template.md +++ b/slide_windows_template.md @@ -38,7 +38,7 @@ class Solution(object): # loop at the begining of the source string while end < len(s): if s[end] in maps: - maps[s[end]] += 1 # plus or minus one + maps[s[end]] -= 1 # plus or minus one if maps[s[end]] == 0: counter -= 1 # modify the counter according the requirement(different condition). end += 1 From 6e8b082fd8b383355c056c830a963bd03d6fa152 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 6 Jan 2018 09:47:18 -0600 Subject: [PATCH 267/473] Update slide_windows_template.md --- slide_windows_template.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/slide_windows_template.md b/slide_windows_template.md index 09a1917f5..919d1c0f9 100644 --- a/slide_windows_template.md +++ b/slide_windows_template.md @@ -46,7 +46,7 @@ class Solution(object): # increase begin pointer to make it invalid/valid again while counter == 0: # counter condition. different question may have different condition if s[begin] in maps: - maps[s[begin]] -= 1 # plus or minus one + maps[s[begin]] += 1 # plus or minus one if maps[s[begin]] > 0: counter += 1 # modify the counter according the requirement(different condition). begin += 1 @@ -72,13 +72,13 @@ class Solution(object): length = sys.maxint while end < len(s): if s[end] in maps: - maps[s[end]] += 1 + maps[s[end]] -= 1 if maps[s[end]] == 0: counter -= 1 end += 1 while counter == 0: if s[begin] in maps: - maps[s[begin]] -= 1 + maps[s[begin]] += 1 if maps[s[begin]] > 0: counter += 1 begin += 1 From 1d3a6ec13ba2d1d445ac35039dff5ca8c7d07b28 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 7 Jan 2018 14:17:22 -0600 Subject: [PATCH 268/473] Update 682._Baseball_Game.md --- 682._Baseball_Game.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/682._Baseball_Game.md b/682._Baseball_Game.md index 14d8f614a..e775cbf8c 100644 --- a/682._Baseball_Game.md +++ b/682._Baseball_Game.md @@ -1,4 +1,4 @@ -###682. Baseball Game +### 682. Baseball Game 题目: From d4b4a854a962fe58cba59e36a924f61fe847ad39 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 7 Jan 2018 14:22:05 -0600 Subject: [PATCH 269/473] Update 450. Delete Node in a BST.md --- 450. Delete Node in a BST.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/450. Delete Node in a BST.md b/450. Delete Node in a BST.md index 81c26c173..3f622c90a 100644 --- a/450. Delete Node in a BST.md +++ b/450. Delete Node in a BST.md @@ -24,7 +24,7 @@ AC代码 -``` +```python class Solution(object): def deleteNode(self, root, key): """ From 3db998c2fcf7f8c8038d88fa4ead0d40f46a52b3 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 7 Jan 2018 14:33:47 -0600 Subject: [PATCH 270/473] Update 112._path_sum.md --- 112._path_sum.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/112._path_sum.md b/112._path_sum.md index db20ec2aa..1f6b07a51 100644 --- a/112._path_sum.md +++ b/112._path_sum.md @@ -1,4 +1,4 @@ -###112. Path Sum +### 112. Path Sum 题目: @@ -11,7 +11,7 @@ Easy 递归 -``` +```python class Solution(object): def hasPathSum(self, root, sum): """ @@ -19,12 +19,10 @@ class Solution(object): :type sum: int :rtype: bool """ - if root == None: - return False + if not root: + return False + if root.left or root.right: + return self.hasPathSum(root.left, sum-root.val) or self.hasPathSum(root.right, sum-root.val) else: - if root.val == sum and (root.left == None and root.right == None): - return True - else: - return self.hasPathSum(root.left, sum - root.val) or self.hasPathSum(root.right, sum - root.val) - + return root.val == sum ``` From a7e345f56f048d43626fc946107e840f05fd7854 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 7 Jan 2018 16:46:00 -0600 Subject: [PATCH 271/473] =?UTF-8?q?Update=20backtracking=E6=80=9D=E8=B7=AF?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "backtracking\346\200\235\350\267\257.md" | 227 +++++++++++++++++++++- 1 file changed, 225 insertions(+), 2 deletions(-) diff --git "a/backtracking\346\200\235\350\267\257.md" "b/backtracking\346\200\235\350\267\257.md" index 27e61d352..f854b479b 100644 --- "a/backtracking\346\200\235\350\267\257.md" +++ "b/backtracking\346\200\235\350\267\257.md" @@ -1,4 +1,227 @@ -##以Generate Parentheses为例,backtrack的题到底该怎么去思考? +## backtracking 全集 + +### 回溯是啥 +用爬山来比喻回溯,好比从山脚下找一条爬上山顶的路,起初有好几条道可走,当选择一条道走到某处时,又有几条岔道可供选择,只能选择其中一条道往前走,若能这样子顺利爬上山顶则罢了,否则走到一条绝路上时,只好返回到最近的一个路口,重新选择另一条没走过的道往前走。如果该路口的所有路都走不通,只得从该路口继续回返。照此规则走下去,要么找到一条到达山顶的路,要么最终试过所有可能的道,无法到达山顶。 +回溯是一种穷举,但与brute force有一些区别,回溯带了两点脑子的,并不多,brute force一点也没带。 +第一点脑子是回溯知道回头;相反如果是brute force,发现走不通立刻跳下山摔死,换第二条命从头换一条路走。 +第二点脑子是回溯知道剪枝;如果有一条岔路上放了一坨屎,那这条路我们不走,就可以少走很多不必要走的路。 + +还有一些爱混淆的概念:递归,回溯,DFS。 +回溯是一种找路方法,搜索的时候走不通就回头换路接着走,直到走通了或者发现此山根本不通。 +DFS是一种开路策略,就是一条道先走到头,再往回走一步换一条路走到头,这也是回溯用到的策略。在树和图上回溯时人们叫它DFS。 +递归是一种行为,回溯和递归如出一辙,都是一言不合就回到来时的路,所以一般回溯用递归实现;当然也可以不用,用栈。 +以下以回溯统称,因为这个词听上去很文雅。 + +### 识别回溯 +判断回溯很简单,拿到一个问题,你感觉如果不穷举一下就没法知道答案,那就可以开始回溯了。 +一般回溯的问题有三种: + +1. Find a path to success 有没有解 +2. Find all paths to success 求所有解,求所有解的个数,求所有解的具体信息 +3. Find the best path to success 求最优解 + +理解回溯:给一堆选择, 必须从里面选一个. 选完之后我又有了新的一组选择. ```This procedure is repeated over and over until you reach a final state. If you made a good sequence of choices, your final state is a goal state; if you didn't, it isn't.``` + +回溯可以抽象为一棵树,我们的目标可以是找这个树有没有good leaf,也可以是问有多少个good leaf,也可以是找这些good leaf都在哪,也可以问哪个good leaf最好,分别对应上面所说回溯的问题分类。 +good leaf都在leaf上。good leaf是我们的goal state,leaf node是final state,是解空间的边界。 + +对于第一类问题(问有没有解),基本都是长着个样子的,理解了它,其他类别迎刃而解: +```java +boolean solve(Node n) { + if n is a leaf node { + if the leaf is a goal node, return true + else return false + } else { + for each child c of n { + if solve(c) succeeds, return true + } + return false + } +} +``` +请读以下这段话以加深理解: +```Notice that the algorithm is expressed as a boolean function. This is essential to understanding the algorithm. If solve(n) is true, that means node n is part of a solution--that is, node n is one of the nodes on a path from the root to some goal node. We say that n is solvable. If solve(n) is false, then there is no path that includes n to any goal node.``` + +还不懂的话请通读全文吧:[Backtracking - David Matuszek](https://www.cis.upenn.edu/~matuszek/cit594-2012/Pages/backtracking.html) + +关于回溯的三种问题,模板略有不同, +第一种,返回值是true/false。 +第二种,求个数,设全局counter,返回值是void;求所有解信息,设result,返回值void。 +第三种,设个全局变量best,返回值是void。 + +第一种: +```java +boolean solve(Node n) { + if n is a leaf node { + if the leaf is a goal node, return true + else return false + } else { + for each child c of n { + if solve(c) succeeds, return true + } + return false + } +} +``` +第二种: +```java +void solve(Node n) { + if n is a leaf node { + if the leaf is a goal node, count++, return; + else return + } else { + for each child c of n { + solve(c) + } + } +} +``` +第三种: +```java +void solve(Node n) { + if n is a leaf node { + if the leaf is a goal node, update best result, return; + else return + } else { + for each child c of n { + solve(c) + } + } +} +``` +题目 + +八皇后 N-Queens + +问题 + +1. 给个n,问有没有解; +2. 给个n,有几种解;(Leetcode N-Queens II) +3. 给个n,给出所有解;(Leetcode N-Queens I) + +解答 + +1.有没有解 + +怎么做:一行一行的放queen,每行尝试n个可能,有一个可达,返回true;都不可达,返回false. + +边界条件leaf:放完第n行 或者 该放第n+1行(出界,返回) + +目标条件goal:n行放满且isValid,即目标一定在leaf上 + +helper函数: +boolean solve(int i, int[][] matrix) +在进来的一瞬间,满足property:第i行还没有被放置,前i-1行放置完毕且valid +solve要在给定的matrix上试图给第i行每个位置放queen。 +```java +public static boolean solve1(int i, List matrix, int n) { + if (i == n) { + if (isValid(matrix)) + return true; + return false; + } else { + for (int j = 0; j < n; j++) { + matrix.add(j); + if (isValid(matrix)) { //剪枝 + if (solve1(i + 1, matrix, n)) + return true; + } + matrix.remove(matrix.size() - 1); + } + return false; + } +} +``` +2.求解的个数 + +怎么做:一行一行的放queen,每行尝试n个可能。这回因为要找所有,返回值就没有了意义,用void即可。在搜索时,如果有一个可达,仍要继续尝试;每个子选项都试完了,返回. + +边界条件leaf:放完第n行 或者 该放第n+1行(出界,返回) + +目标条件goal:n行放满且isValid,即目标一定在leaf上 + +helper函数: +void solve(int i, int[][] matrix) +在进来的一瞬间,满足property:第i行还没有被放置,前i-1行放置完毕且valid +solve要在给定的matrix上试图给第i行每个位置放queen。 +这里为了记录解的个数,设置一个全局变量(static)int是比较efficient的做法。 +```java +public static void solve2(int i, List matrix, int n) { + if (i == n) { + if (isValid(matrix)) + count++; + return; + } else { + for (int j = 0; j < n; j++) { + matrix.add(j); + if (isValid(matrix)) { //剪枝 + solve2(i + 1, matrix, n); + } + matrix.remove(matrix.size() - 1); + } + } +} +``` +3.求所有解的具体信息 + +怎么做:一行一行的放queen,每行尝试n个可能。返回值同样用void即可。在搜索时,如果有一个可达,仍要继续尝试;每个子选项都试完了,返回. + +边界条件leaf:放完第n行 或者 该放第n+1行(出界,返回) + +目标条件goal:n行放满且isValid,即目标一定在leaf上 + +helper函数: +void solve(int i, int[][] matrix) +在进来的一瞬间,满足property:第i行还没有被放置,前i-1行放置完毕且valid +solve要在给定的matrix上试图给第i行每个位置放queen。 +这里为了记录解的具体情况,设置一个全局变量(static)集合是比较efficient的做法。 +当然也可以把结果集合作为参数传来传去。 +```java +public static void solve3(int i, List matrix, int n) { + if (i == n) { + if (isValid(matrix)) + result.add(new ArrayList(matrix)); + return; + } else { + for (int j = 0; j < n; j++) { + matrix.add(j); + if (isValid(matrix)) { //剪枝 + solve3(i + 1, matrix, n); + } + matrix.remove(matrix.size() - 1); + } + } +} +``` +优化 + +上面的例子用了省空间的方法。 +由于每行只能放一个,一共n行的话,用一个大小为n的数组,数组的第i个元素表示第i行放在了第几列上。 + +Utility(给一个list判断他的最后一行是否和前面冲突): +```java +public static boolean isValid(List list){ + int row = list.size() - 1; + int col = list.get(row); + for (int i = 0; i <= row - 1; i++) { + int row1 = i; + int col1 = list.get(i); + if (col == col1) + return false; + if (row1 - row == col1 - col) + return false; + if (row1 - row == col - col1) + return false; + } + return true; + +} +``` + + + + +## 以Generate Parentheses为例,backtrack的题到底该怎么去思考? 所谓Backtracking都是这样的思路:在当前局面下,你有若干种选择。那么尝试每一种选择。如果已经发现某种选择肯定不行(因为违反了某些限定条件),就返回;如果某种选择试到最后发现是正确解,就将其加入解集 @@ -65,4 +288,4 @@ while(Problem is not solved) End For If none of the move works out, return false, NO SOLUTON. -``` \ No newline at end of file +``` From e1d7d26ecef96b39f517def6779cf575b02e686a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 7 Jan 2018 16:48:02 -0600 Subject: [PATCH 272/473] =?UTF-8?q?Update=20backtracking=E6=80=9D=E8=B7=AF?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "backtracking\346\200\235\350\267\257.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/backtracking\346\200\235\350\267\257.md" "b/backtracking\346\200\235\350\267\257.md" index f854b479b..16fc5e3c0 100644 --- "a/backtracking\346\200\235\350\267\257.md" +++ "b/backtracking\346\200\235\350\267\257.md" @@ -17,7 +17,9 @@ DFS是一种开路策略,就是一条道先走到头,再往回走一步换 一般回溯的问题有三种: 1. Find a path to success 有没有解 -2. Find all paths to success 求所有解,求所有解的个数,求所有解的具体信息 +2. Find all paths to success 求所有解 + - 2.1 求所有解的个数, + - 2.2 求所有解的具体信息 3. Find the best path to success 求最优解 理解回溯:给一堆选择, 必须从里面选一个. 选完之后我又有了新的一组选择. ```This procedure is repeated over and over until you reach a final state. If you made a good sequence of choices, your final state is a goal state; if you didn't, it isn't.``` From 6341b08acad0ff656e1e4fa9b8406c24d3e0042f Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 7 Jan 2018 16:49:07 -0600 Subject: [PATCH 273/473] =?UTF-8?q?Update=20backtracking=E6=80=9D=E8=B7=AF?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "backtracking\346\200\235\350\267\257.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/backtracking\346\200\235\350\267\257.md" "b/backtracking\346\200\235\350\267\257.md" index 16fc5e3c0..e2b352fef 100644 --- "a/backtracking\346\200\235\350\267\257.md" +++ "b/backtracking\346\200\235\350\267\257.md" @@ -220,7 +220,7 @@ public static boolean isValid(List list){ } ``` - +参考[](https://segmentfault.com/a/1190000006121957) ## 以Generate Parentheses为例,backtrack的题到底该怎么去思考? From c1a5354e025dbc6f1c8f55eb9e6d19a937e0ba57 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 7 Jan 2018 16:52:20 -0600 Subject: [PATCH 274/473] =?UTF-8?q?Update=20backtracking=E6=80=9D=E8=B7=AF?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "backtracking\346\200\235\350\267\257.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/backtracking\346\200\235\350\267\257.md" "b/backtracking\346\200\235\350\267\257.md" index e2b352fef..395026208 100644 --- "a/backtracking\346\200\235\350\267\257.md" +++ "b/backtracking\346\200\235\350\267\257.md" @@ -220,7 +220,9 @@ public static boolean isValid(List list){ } ``` -参考[](https://segmentfault.com/a/1190000006121957) +参考[Backtracking回溯法(又称DFS,递归)全解](https://segmentfault.com/a/1190000006121957), +[Python Patterns - Implementing Graphs](https://www.python.org/doc/essays/graphs/) + ## 以Generate Parentheses为例,backtrack的题到底该怎么去思考? From e46219c4735d3f594fee796dd301a26b10cd6052 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 7 Jan 2018 16:53:16 -0600 Subject: [PATCH 275/473] =?UTF-8?q?Update=20backtracking=E6=80=9D=E8=B7=AF?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "backtracking\346\200\235\350\267\257.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/backtracking\346\200\235\350\267\257.md" "b/backtracking\346\200\235\350\267\257.md" index 395026208..dbb7e8cf1 100644 --- "a/backtracking\346\200\235\350\267\257.md" +++ "b/backtracking\346\200\235\350\267\257.md" @@ -220,8 +220,8 @@ public static boolean isValid(List list){ } ``` -参考[Backtracking回溯法(又称DFS,递归)全解](https://segmentfault.com/a/1190000006121957), -[Python Patterns - Implementing Graphs](https://www.python.org/doc/essays/graphs/) +参考[Backtracking回溯法(又称DFS,递归)全解](https://segmentfault.com/a/1190000006121957) +以及 [Python Patterns - Implementing Graphs](https://www.python.org/doc/essays/graphs/) From 4359e54912dc775598fce2c2e9c203266c6a08aa Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 7 Jan 2018 18:15:27 -0600 Subject: [PATCH 276/473] =?UTF-8?q?Update=20tree=5Fsearch=EF=BC=8C=5Fgraph?= =?UTF-8?q?=5Fsearch=EF=BC=8C=5Fdfs,=5Fbfs.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\214_graph_search\357\274\214_dfs,_bfs.md" | 226 ++++++++---------- 1 file changed, 96 insertions(+), 130 deletions(-) diff --git "a/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" "b/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" index 7dccde3ec..64500f324 100644 --- "a/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" +++ "b/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" @@ -4,7 +4,7 @@ 其实原本是根本不知道还有tree search的,只知道graph search,原来graph search就是一般我看到的dfs,bfs,有一个结构来记录visited node,这样在寻找邻居的时候,防止已经visit的node再被visit. -### Tree Search +## Tree Search general tree search pseudocode @@ -21,112 +21,7 @@ function TREE_SEARCH(problem, strategy) returns a solution, or failure ``` - - -### Graph Search - -very simple fix: never expand a state type twice - -``` -function GRAPH_SEARCH(problem, fringe) returns a solution, or failure - closed <- an empty set - fringe <- INSERT(MAKE-NODE(INITIAL-STATE[problem]),fringe) - loop do - if fringe is empty then return failure - node <- REMOVE-FRONT(fringe) - if GOAL-TEST(problem, STATE[node]) then return node - if STATE[node] is not in closed then - add STATE[node] to closed - fringe <- INSERTALL(EXPAND(node, problem)) - end - -``` - - -重要的点: - -- fringe -- strategy - -然后没有查重的过程 - -####DFS - -递归伪码 - -``` -1 procedure DFS(G,v): -2 label v as discovered -3 for all edges from v to w in G.adjacentEdges(v) do -4 if vertex w is not labeled as discovered then -5 recursively call DFS(G,w) -``` - -非递归伪码,其实递归在计算机内部就是用的stack,所以这里用stack可以解决问题 - -每次都expand deepest node - -``` -1 procedure DFS-iterative(G,v): -2 let S be a stack -3 S.push(v) -4 while S is not empty -5 v = S.pop() -6 for all edges from v to w in G.adjacentEdges(v) do -7 if w is not labeled as discovered: -8 label w as discovered -9 S.push(w) -``` - - -#### BFS - -伪码,这个伪码提供的信息有点多啊,把Unweighted shortest distance顺便也求出来了。 - -``` - 1 Breadth-First-Search(Graph, root): - 2 - 3 for each node n in Graph: - 4 n.distance = INFINITY - 5 n.parent = NIL - 6 - 7 create empty queue Q - 8 - 9 root.distance = 0 -10 Q.enqueue(root) -11 -12 while Q is not empty: -13 -14 current = Q.dequeue() -15 -16 for each node n that is adjacent to current: -17 if n.distance == INFINITY: -18 n.distance = current.distance + 1 -19 n.parent = current -20 Q.enqueue(n) -``` - -其实跟以上DFS的非递归写成一样也行 - -expand the shallowest node - - -``` -1 procedure BFS-iterative(G,v): -2 let Q be a queue -3 Q.enqueue(v) -4 while Q is not empty -5 v = Q.dequeue() -6 for all edges from v to w in G.adjacentEdges(v) do -7 if w is not labeled as discovered: -8 label w as discovered -9 Q.enqueue(w) -``` - -BFS和DFS其实就是每次选下一个expand的node用的strategy不同. - - -#### DFS/BFS with Path +## DFS/BFS 可以让stack/queue记录更多一些的东西,因为反正stack/queue更像通用结构 @@ -146,38 +41,109 @@ graph = {'A': set(['B', 'C']), 'D': set(['B']), 'E': set(['B', 'F']), 'F': set(['C', 'E'])} - - - - -def dfs_paths(graph, start, goal): +``` +### DFS +The implementation below uses the stack data-structure to build-up and return a set of vertices that are accessible within the subjects connected component. Using Python’s overloading of the subtraction operator to remove items from a set, we are able to add only the unvisited adjacent vertices. +```python +def dfs(graph, start): # iterative + visited, stack = [], [start] + while stack: + vertex = stack.pop() + if vertex not in visited: + visited.append(vertex) + stack.extend(graph[vertex] - set(visited)) + return visited +print(dfs(graph, 'A')) # ['A', 'C', 'F', 'E', 'B', 'D'] 这只是其中一种答案 +``` +The second implementation provides the same functionality as the first, however, this time we are using the more succinct recursive form. Due to a common Python gotcha with default parameter values being created only once, we are required to create a new visited set on each user invocation. Another Python language detail is that function variables are passed by reference, resulting in the visited mutable set not having to reassigned upon each recursive call. +```python +def dfs(graph, start, visited=None): # recursive + if visited is None: + visited = [] + print('visiting', start) + visited.append(start) + for next in graph[start]: + if next not in visited: + dfs(graph, next, visited) + return visited +print(dfs(graph, 'A')) # ['A', 'C', 'F', 'E', 'B', 'D'] 这只是其中一种答案 +``` +We are able to tweak both of the previous implementations to return all possible paths between a start and goal vertex. The implementation below uses the stack data-structure again to iteratively solve the problem, yielding each possible path when we locate the goal. Using a generator allows the user to only compute the desired amount of alternative paths. +```python +def dfs_paths(graph, start, goal): # iterative stack = [(start, [start])] - visited = set() while stack: (vertex, path) = stack.pop() - if vertex not in visited: - if vertex == goal: - return path - visited.add(vertex) - for neighbor in graph[vertex]: - stack.append((neighbor, path + [neighbor])) - -print (dfs_paths(graph, 'A', 'F')) #['A', 'B', 'E', 'F'] + for next in graph[vertex] - set(path): + if next == goal: + yield path + [next] + else: + stack.append((next, path + [next])) +print(list(dfs_paths(graph, 'A', 'F'))) # [['A', 'C', 'F'], ['A', 'B', 'E', 'F']] +``` +The implementation below uses the recursive approach calling the ‘yield from’ PEP380 addition to return the invoked located paths. Unfortunately the version of Pygments installed on the server at this time does not include the updated keyword combination. +```python +def dfs_paths(graph, start, goal, path=None): # recursive + if path is None: + path = [start] + if start == goal: + yield path + for next in graph[start] - set(path): + yield from dfs_paths(graph, next, goal, path + [next]) +print(list(dfs_paths(graph, 'C', 'F'))) # [['C', 'A', 'B', 'E', 'F'], ['C', 'F']] ``` -一旦BFS/DFS与更具体的,更有特性的data structure结合起来,比如binary search tree,那么BFS/DFS会针对这个tree traversal显得更有特性。 - - -#### UCS +### BFS -expand the cheapest node first +Similar to the iterative DFS implementation the only alteration required is to remove the next item from the beginning of the list structure instead of the stacks last. +```python +def bfs(graph, start): # iterative + visited, queue = [], [start] + while queue: + vertex = queue.pop(0) + if vertex not in visited: + visited.append(vertex) + queue.extend(graph[vertex] - set(visited)) + return visited +print(bfs(graph, 'A')) # ['A', 'C', 'B', 'F', 'D', 'E'] +``` +This implementation can again be altered slightly to instead return all possible paths between two vertices, the first of which being one of the shortest such path. +```python +def bfs_paths(graph, start, goal): + queue = [(start, [start])] + while queue: + (vertex, path) = queue.pop(0) + for next in graph[vertex] - set(path): + if next == goal: + yield path + [next] + else: + queue.append((next, path + [next])) +print(list(bfs_paths(graph, 'A', 'F'))) # [['A', 'C', 'F'], ['A', 'B', 'E', 'F']] +``` +Knowing that the shortest path will be returned first from the BFS path generator method we can create a useful method which simply returns the shortest path found or ‘None’ if no path exists. As we are using a generator this in theory should provide similar performance results as just breaking out and returning the first matching path in the BFS implementation. +```python +def bfs_paths(graph, start, goal): + queue = [(start, [start])] + while queue: + (vertex, path) = queue.pop(0) + for next in graph[vertex] - set(path): + if next == goal: + yield path + [next] + else: + queue.append((next, path + [next])) +def shortest_path(graph, start, goal): + try: + return next(bfs_paths(graph, start, goal)) + except StopIteration: + return None +print(shortest_path(graph, 'A', 'F')) # ['A', 'C', 'F'] +``` -Fringe is a priority queue +#### Improvement/Follow up -乃Dijkstra算法 +1. 一旦BFS/DFS与更具体的,更有特性的data structure结合起来,比如binary search tree,那么BFS/DFS会针对这个tree traversal显得更有特性。 +2. it's worth mentioning that there is an optimized queue object in the collections module called [deque](https://docs.python.org/2/library/collections.html#collections.deque)) for which removing items from the beginning ( or popleft ) takes constant time as opposed to O(n) time for lists. -#### Greedy -#### A* From 41aa3c6e78111bab08898ffc3963f16186308a59 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 7 Jan 2018 18:20:16 -0600 Subject: [PATCH 277/473] =?UTF-8?q?Update=20tree=5Fsearch=EF=BC=8C=5Fgraph?= =?UTF-8?q?=5Fsearch=EF=BC=8C=5Fdfs,=5Fbfs.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...earch\357\274\214_graph_search\357\274\214_dfs,_bfs.md" | 7 +++++++ 1 file changed, 7 insertions(+) diff --git "a/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" "b/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" index 64500f324..364b5e0c8 100644 --- "a/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" +++ "b/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" @@ -146,4 +146,11 @@ print(shortest_path(graph, 'A', 'F')) # ['A', 'C', 'F'] +### Resources + +[Depth-and Breadth-First Search](https://jeremykun.com/2013/01/22/depth-and-breadth-first-search/) +[Edd Mann](http://eddmann.com/posts/depth-first-search-and-breadth-first-search-in-python/) +[graph - Depth-first search in Python](https://codereview.stackexchange.com/questions/78577/depth-first-search-in-python) + + From 62badcd4f548866191fc5e687bbf1656a97f981b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 7 Jan 2018 18:20:39 -0600 Subject: [PATCH 278/473] =?UTF-8?q?Update=20tree=5Fsearch=EF=BC=8C=5Fgraph?= =?UTF-8?q?=5Fsearch=EF=BC=8C=5Fdfs,=5Fbfs.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" "b/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" index 364b5e0c8..656ec8a1f 100644 --- "a/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" +++ "b/tree_search\357\274\214_graph_search\357\274\214_dfs,_bfs.md" @@ -148,9 +148,9 @@ print(shortest_path(graph, 'A', 'F')) # ['A', 'C', 'F'] ### Resources -[Depth-and Breadth-First Search](https://jeremykun.com/2013/01/22/depth-and-breadth-first-search/) -[Edd Mann](http://eddmann.com/posts/depth-first-search-and-breadth-first-search-in-python/) -[graph - Depth-first search in Python](https://codereview.stackexchange.com/questions/78577/depth-first-search-in-python) +1. [Depth-and Breadth-First Search](https://jeremykun.com/2013/01/22/depth-and-breadth-first-search/) +2. [Edd Mann](http://eddmann.com/posts/depth-first-search-and-breadth-first-search-in-python/) +3. [graph - Depth-first search in Python](https://codereview.stackexchange.com/questions/78577/depth-first-search-in-python) From b0574d77352b272009fe28a1d6c64abae25de36c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 7 Jan 2018 23:48:41 -0600 Subject: [PATCH 279/473] Update 113._path_sum_ii.md --- 113._path_sum_ii.md | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/113._path_sum_ii.md b/113._path_sum_ii.md index 21cb0fabf..d1f2ea9c6 100644 --- a/113._path_sum_ii.md +++ b/113._path_sum_ii.md @@ -1,4 +1,4 @@ -###113. Path Sum II +### 113. Path Sum II 题目: @@ -14,14 +14,7 @@ tag : DFS 注意宁愿写几次curList + [root.val] 也不要直接传一个list进去,因为list pass by reference的亏已经吃过了 -``` -# Definition for a binary tree node. -# class TreeNode(object): -# def __init__(self, x): -# self.val = x -# self.left = None -# self.right = None - +```python class Solution(object): def pathSum(self, root, sum): """ @@ -29,20 +22,19 @@ class Solution(object): :type sum: int :rtype: List[List[int]] """ - result = [] - self.auxPathSum(root,sum,[],result) - return result - - def auxPathSum(self, root, sum, curList, curLists): - if root == None: + res = [] + self.auxPathSum(root, sum, [], res) + return res + def auxPathSum(self, root, sum, cur_list, cur_lists): + if not root: return sum -= root.val - if sum == 0 and (root.left == None and root.right == None): - curLists.append(curList + [root.val]) + if sum == 0 and not root.left and not root.right: + cur_lists.append(cur_list + [root.val]) return - if root.left != None: - self.auxPathSum(root.left, sum - root.val, curList + [root.val],curLists) - if root.right != None: - self.auxPathSum(root.right, sum - root.val, curList + [root.val],curLists) + if root.left: + self.auxPathSum(root.left, sum, cur_list + [root.val], cur_lists) + if root.right: + self.auxPathSum(root.right, sum, cur_list + [root.val], cur_lists) ``` From 6e56f92dd81163155aef0b4b326db95d16fa865a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 10:56:56 -0600 Subject: [PATCH 280/473] Update 022._generate_parentheses.md --- 022._generate_parentheses.md | 144 +++++++++++++++++------------------ 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/022._generate_parentheses.md b/022._generate_parentheses.md index 17bac762b..ae14c9089 100644 --- a/022._generate_parentheses.md +++ b/022._generate_parentheses.md @@ -1,18 +1,18 @@ -###22. Generate Parentheses - -题目: - - - -难度: - -Medium - - - - - -``` +### 22. Generate Parentheses + +题目: + + + +难度: + +Medium + + + + + +```python class Solution(object): def generateParenthesis(self,n): """ @@ -29,60 +29,60 @@ class Solution(object): if left < n: self.singleStr(s + '(',left + 1, right,n) if right < left: - self.singleStr(s + ')',left, right + 1, n) - -``` - - -非常牛逼的讲解,需要这样的人来给我们讲算法 - -####以Generate Parentheses为例,backtrack的题到底该怎么去思考? - - -所谓Backtracking都是这样的思路:在当前局面下,你有若干种选择。那么尝试每一种选择。如果已经发现某种选择肯定不行(因为违反了某些限定条件),就返回;如果某种选择试到最后发现是正确解,就将其加入解集 - -所以你思考递归题时,只要明确三点就行:选择 (Options),限制 (Restraints),结束条件 (Termination)。即“ORT原则”(这个是我自己编的) - - - - -对于这道题,在任何时刻,你都有两种选择: -1. 加左括号。 -2. 加右括号。 - -同时有以下限制: -1. 如果左括号已经用完了,则不能再加左括号了。 -2. 如果已经出现的右括号和左括号一样多,则不能再加右括号了。因为那样的话新加入的右括号一定无法匹配。 - -结束条件是: -左右括号都已经用完。 - -结束后的正确性: -左右括号用完以后,一定是正确解。因为1. 左右括号一样多,2. 每个右括号都一定有与之配对的左括号。因此一旦结束就可以加入解集(有时也可能出现结束以后不一定是正确解的情况,这时要多一步判断)。 - -递归函数传入参数: -限制和结束条件中有“用完”和“一样多”字样,因此你需要知道左右括号的数目。 -当然你还需要知道当前局面sublist和解集res。 - -因此,把上面的思路拼起来就是代码: - - if (左右括号都已用完) { - 加入解集,返回 - } - //否则开始试各种选择 - if (还有左括号可以用) { - 加一个左括号,继续递归 - } - if (右括号小于左括号) { - 加一个右括号,继续递归 - } - - - -你帖的那段代码逻辑中加了一条限制:“3. 是否还有右括号剩余。如有才加右括号”。这是合理的。不过对于这道题,如果满足限制1、2时,3一定自动满足,所以可以不判断3。 - -这题其实是最好的backtracking初学练习之一,因为ORT三者都非常简单明显。你不妨按上述思路再梳理一遍,还有问题的话再说。 - - - -以上文字来自 1point3arces的牛人解答 \ No newline at end of file + self.singleStr(s + ')',left, right + 1, n) + +``` + + +非常牛逼的讲解,需要这样的人来给我们讲算法 + +####以Generate Parentheses为例,backtrack的题到底该怎么去思考? + + +所谓Backtracking都是这样的思路:在当前局面下,你有若干种选择。那么尝试每一种选择。如果已经发现某种选择肯定不行(因为违反了某些限定条件),就返回;如果某种选择试到最后发现是正确解,就将其加入解集 + +所以你思考递归题时,只要明确三点就行:选择 (Options),限制 (Restraints),结束条件 (Termination)。即“ORT原则”(这个是我自己编的) + + + + +对于这道题,在任何时刻,你都有两种选择: +1. 加左括号。 +2. 加右括号。 + +同时有以下限制: +1. 如果左括号已经用完了,则不能再加左括号了。 +2. 如果已经出现的右括号和左括号一样多,则不能再加右括号了。因为那样的话新加入的右括号一定无法匹配。 + +结束条件是: +左右括号都已经用完。 + +结束后的正确性: +左右括号用完以后,一定是正确解。因为1. 左右括号一样多,2. 每个右括号都一定有与之配对的左括号。因此一旦结束就可以加入解集(有时也可能出现结束以后不一定是正确解的情况,这时要多一步判断)。 + +递归函数传入参数: +限制和结束条件中有“用完”和“一样多”字样,因此你需要知道左右括号的数目。 +当然你还需要知道当前局面sublist和解集res。 + +因此,把上面的思路拼起来就是代码: + + if (左右括号都已用完) { + 加入解集,返回 + } + //否则开始试各种选择 + if (还有左括号可以用) { + 加一个左括号,继续递归 + } + if (右括号小于左括号) { + 加一个右括号,继续递归 + } + + + +你帖的那段代码逻辑中加了一条限制:“3. 是否还有右括号剩余。如有才加右括号”。这是合理的。不过对于这道题,如果满足限制1、2时,3一定自动满足,所以可以不判断3。 + +这题其实是最好的backtracking初学练习之一,因为ORT三者都非常简单明显。你不妨按上述思路再梳理一遍,还有问题的话再说。 + + + +以上文字来自 1point3arces的牛人解答 From 9150815512274b0ecaa7cb6e06fb46ada76e52a0 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 14:26:30 -0600 Subject: [PATCH 281/473] Update 437._path_sum_iii.md --- 437._path_sum_iii.md | 46 ++++++++++++++++---------------------------- 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/437._path_sum_iii.md b/437._path_sum_iii.md index 5d738d2b9..ac5c314a6 100644 --- a/437._path_sum_iii.md +++ b/437._path_sum_iii.md @@ -1,4 +1,4 @@ -###437. Path Sum III +### 437. Path Sum III @@ -11,22 +11,10 @@ Easy 思路: -这题一看到,时间复杂度就把我给吓尿了,不是么|||科科 -我的🐟👄的代码 -是有优化,待做 - - - -``` -# Definition for a binary tree node. -# class TreeNode(object): -# def __init__(self, x): -# self.val = x -# self.left = None -# self.right = None +```python class Solution(object): def pathSum(self, root, sum): """ @@ -34,18 +22,18 @@ class Solution(object): :type sum: int :rtype: int """ - # empty - def nodeValue(root, sum): - if not root: return 0 - # one node - if root.val == sum: - return 1 + nodeValue(root.left, 0) + nodeValue(root.right,0) - else: - return nodeValue(root.left, sum - root.val) + nodeValue(root.right, sum - root.val) - - if not root: return 0 - ans = nodeValue(root,sum) - ans += self.pathSum(root.left, sum) - ans += self.pathSum(root.right, sum) - return ans -``` \ No newline at end of file + if not root: + return 0 + res = self.auxPathSum(root, sum) + res += self.pathSum(root.left, sum) + res += self.pathSum(root.right, sum) + return res + def auxPathSum(self, root, sum): + if not root: + return 0 + if sum == root.val: +            # 因为可能有负值, 所以sum为0也会有解, 必须加上 +            return 1 + self.auxPathSum(root.left, 0) + self.auxPathSum(root.right, 0) + else: + return self.auxPathSum(root.left, sum - root.val) + self.auxPathSum(root.right, sum - root.val) +``` From 10fd5cf408df6e41058fb9053a4a90e73a1a4e8a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 14:29:18 -0600 Subject: [PATCH 282/473] Update 459._Repeated_Substring_Pattern.md --- 459._Repeated_Substring_Pattern.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/459._Repeated_Substring_Pattern.md b/459._Repeated_Substring_Pattern.md index 8840c1c31..f32b6eb4b 100644 --- a/459._Repeated_Substring_Pattern.md +++ b/459._Repeated_Substring_Pattern.md @@ -20,7 +20,6 @@ Easy ```python -python class Solution(object): def repeatedSubstringPattern(self, s): """ @@ -30,11 +29,3 @@ class Solution(object): return (s*2)[1:-1].find(s) != -1 ``` - - - -Author: Keqi Huang - -If you like it, please spread your support - -![Support](https://github.com/Lisanaaa/myTODOs/blob/master/WechatIMG17.jpeg) From ebe5fce865212e3d94dd6f866ac3748ca17f2815 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 14:30:49 -0600 Subject: [PATCH 283/473] Rename 461. Hamming Distance.md to 461._Hamming Distance.md --- 461. Hamming Distance.md => 461._Hamming Distance.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 461. Hamming Distance.md => 461._Hamming Distance.md (100%) diff --git a/461. Hamming Distance.md b/461._Hamming Distance.md similarity index 100% rename from 461. Hamming Distance.md rename to 461._Hamming Distance.md From 118f239a536373e57e6f1abcc15246a17d13241e Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 14:34:26 -0600 Subject: [PATCH 284/473] Update 461._Hamming Distance.md --- 461._Hamming Distance.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/461._Hamming Distance.md b/461._Hamming Distance.md index 1a8e05606..4a8d63d81 100644 --- a/461._Hamming Distance.md +++ b/461._Hamming Distance.md @@ -27,9 +27,22 @@ https://en.wikipedia.org/wiki/Hamming_distance > > -AC代码 + +一行无敌 +```python +class Solution(object): + def hammingDistance(self, x, y): + """ + :type x: int + :type y: int + :rtype: int + """ + return bin(x^y).count('1') ``` +AC代码 + +```python class Solution(object): def hammingDistance(self, x, y): """ @@ -41,8 +54,8 @@ class Solution(object): val = x ^ y while val: - dist += 1 - val &= val - 1 + dist += 1 + val &= val - 1 return dist ``` From cd83c4c46f254076ff906ef043083e8bd133e54c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 15:08:14 -0600 Subject: [PATCH 285/473] Create 477._Total_Hamming_Distance.md --- 477._Total_Hamming_Distance.md | 66 ++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 477._Total_Hamming_Distance.md diff --git a/477._Total_Hamming_Distance.md b/477._Total_Hamming_Distance.md new file mode 100644 index 000000000..817136a0e --- /dev/null +++ b/477._Total_Hamming_Distance.md @@ -0,0 +1,66 @@ +### 477. Total Hamming Distance + + + +题目: + + + +难度: +Medium + +思路: + + +第一想法就是暴力,直接超时 + +``` +class Solution(object): # 此法超时 + def totalHammingDistance(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + res = 0 + for i in range(len(nums)): + for j in range(i+1, len(nums)): + res += bin(nums[i]^nums[j]).count('1') + return res +``` + + +前面的解法是```O(n^2)```所以超时,所以我们想想有没有```O(n)```的解法 +对于所有的数字,我们先从右数第一位开始算,如果一共有```n```个数字,其中```k```个数字的右数第一位是```‘1’```,其他```n-k```个数字的右数第一位是```‘0’```, +所以这一位对最终```res```的贡献就是```k*(n-k)```,这样我们的时间复杂度就是```O(32n)```,也就是```O(N)```了 + +``` +for each “column” or bit position, once you count the number of set bits you can figure out the number of pairs that will contribute to the count using combination logic. + +Consider you have 10 numbers and only one of them is a 1 the rest are zeros. How many (1, 0) pairs can you make? Clearly you can make 9, pair the 1 with each of the other 9 zeros. If you have 2 ones, you can pair each of those with the other 8 zeros giving 2*8 = 16. Keep going and you see that you can pair each 1 with each zero so the number of pairs is just the number of 1’s times the number of 0’s. + +This would be an O(32 * n) solution which is an O(n) solution, no space used. +``` + +AC代码 + +```python +class Solution(object): + def totalHammingDistance(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + # iterate thru "column" or bit position + # Note: you could stop at 10^9 as stated in the problem if you want to optimize + res = 0 + for i in range(32): + mask = 1 << i + count_ones, count_zeros = 0, 0 + for num in nums: + if num & mask != 0: + count_ones += 1 + else: + count_zeros += 1 + res += count_ones * count_zeros + return res +``` From d81ad5e56fc10dff07840ec74866fb9fd98125ad Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 15:09:14 -0600 Subject: [PATCH 286/473] Update 477._Total_Hamming_Distance.md --- 477._Total_Hamming_Distance.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/477._Total_Hamming_Distance.md b/477._Total_Hamming_Distance.md index 817136a0e..6a8759daf 100644 --- a/477._Total_Hamming_Distance.md +++ b/477._Total_Hamming_Distance.md @@ -34,9 +34,13 @@ class Solution(object): # 此法超时 所以这一位对最终```res```的贡献就是```k*(n-k)```,这样我们的时间复杂度就是```O(32n)```,也就是```O(N)```了 ``` -for each “column” or bit position, once you count the number of set bits you can figure out the number of pairs that will contribute to the count using combination logic. +for each “column” or bit position, once you count the number of set bits you can figure out the number of pairs +that will contribute to the count using combination logic. -Consider you have 10 numbers and only one of them is a 1 the rest are zeros. How many (1, 0) pairs can you make? Clearly you can make 9, pair the 1 with each of the other 9 zeros. If you have 2 ones, you can pair each of those with the other 8 zeros giving 2*8 = 16. Keep going and you see that you can pair each 1 with each zero so the number of pairs is just the number of 1’s times the number of 0’s. +Consider you have 10 numbers and only one of them is a 1 the rest are zeros. How many (1, 0) pairs can you make? +Clearly you can make 9, pair the 1 with each of the other 9 zeros. If you have 2 ones, +you can pair each of those with the other 8 zeros giving 2*8 = 16. +Keep going and you see that you can pair each 1 with each zero so the number of pairs is just the number of 1’s times the number of 0’s. This would be an O(32 * n) solution which is an O(n) solution, no space used. ``` From 72c41f985b548d571c0d4ef6bcdf0b440cd402a9 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 15:11:23 -0600 Subject: [PATCH 287/473] Update 477._Total_Hamming_Distance.md --- 477._Total_Hamming_Distance.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/477._Total_Hamming_Distance.md b/477._Total_Hamming_Distance.md index 6a8759daf..a5d4f6376 100644 --- a/477._Total_Hamming_Distance.md +++ b/477._Total_Hamming_Distance.md @@ -68,3 +68,15 @@ class Solution(object): res += count_ones * count_zeros return res ``` + +上面的代码简化一下就是[stephan老流氓]()的无敌一行了 + +```python +class Solution(object): # 此法超时 + def totalHammingDistance(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + return sum(b.count('0') * b.count('1') for b in zip(*map('{:032b}'.format, nums))) +``` From 1fd44132ade66e6d949ab4f4268c9cdcae7eacc2 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 15:12:41 -0600 Subject: [PATCH 288/473] Update 477._Total_Hamming_Distance.md --- 477._Total_Hamming_Distance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/477._Total_Hamming_Distance.md b/477._Total_Hamming_Distance.md index a5d4f6376..cf5bc54a7 100644 --- a/477._Total_Hamming_Distance.md +++ b/477._Total_Hamming_Distance.md @@ -69,7 +69,7 @@ class Solution(object): return res ``` -上面的代码简化一下就是[stephan老流氓]()的无敌一行了 +上面的代码简化一下就是[stefan大神(老流氓罒ω罒)](https://leetcode.com/problems/total-hamming-distance/discuss/96229)的无敌一行了 ```python class Solution(object): # 此法超时 From e8426f5d3485cac3bc528062fae3cd1dc0d60f52 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 15:20:05 -0600 Subject: [PATCH 289/473] Create 463._Island_Perimeter.md --- 463._Island_Perimeter.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 463._Island_Perimeter.md diff --git a/463._Island_Perimeter.md b/463._Island_Perimeter.md new file mode 100644 index 000000000..bedc5f8a1 --- /dev/null +++ b/463._Island_Perimeter.md @@ -0,0 +1,38 @@ +### 463. Island Perimeter + + + +题目: + + + +难度: +Easy + +思路: + + + + +```python +class Solution(object): + def islandPerimeter(self, grid): + """ + :type grid: List[List[int]] + :rtype: int + """ + # 每一个陆地单元格的周长为4,当两单元格上下或者左右相邻时,令周长减2 + h = len(grid) + w = len(grid[0]) if h else 0 + ans = 0 + for x in range(h): + for y in range(w): + if grid[x][y] == 1: + ans += 4 + # 因为x+1还在后面,所以不需要考虑,即只需要考虑左边和上边,因为循环已经出现过该点了 + if x > 0 and grid[x - 1][y]: + ans -= 2 + if y > 0 and grid[x][y - 1]: + ans -= 2 + return ans +``` From 21de3a28c76f226b5337c6db0d95110db8915a18 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 15:41:49 -0600 Subject: [PATCH 290/473] Create 476._Number_Complement.md --- 476._Number_Complement.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 476._Number_Complement.md diff --git a/476._Number_Complement.md b/476._Number_Complement.md new file mode 100644 index 000000000..91b253972 --- /dev/null +++ b/476._Number_Complement.md @@ -0,0 +1,28 @@ +### 476. Number Complement + + + +题目: + + + +难度: +Easy + + + + + +```python +class Solution(object): + def findComplement(self, num): + """ + :type num: int + :rtype: int + """ + i = 1 << (len(bin(num)) -2) # 因为bin函数转化成的格式是‘0bXXXX’,头两个‘0b’要减掉去 + return (i - 1) ^ num + # return (i - 1) - num # 这样也可以 +``` + + From 7af8520bd8e4345d705fba4108a449b915708f62 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 15:53:44 -0600 Subject: [PATCH 291/473] Create 485._Max_Consecutive_Ones.md --- 485._Max_Consecutive_Ones.md | 40 ++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 485._Max_Consecutive_Ones.md diff --git a/485._Max_Consecutive_Ones.md b/485._Max_Consecutive_Ones.md new file mode 100644 index 000000000..422a70c92 --- /dev/null +++ b/485._Max_Consecutive_Ones.md @@ -0,0 +1,40 @@ +### 485. Max Consecutive Ones + + + +题目: + + + +难度: +Easy + +思路: + + +一行无敌 +```python +class Solution(object): + def findMaxConsecutiveOnes(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + return len(max(''.join(map(str, nums)).split('0'))) +``` + +```python +class Solution(object): + def findMaxConsecutiveOnes(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + res, count = [], 0 + for x in nums: + count = 0 if x == 0 else count + 1 + res.append(count) + return max(res) +``` + + From 537e412d3bc16597f9ea8fe30e4f63f1b0b6227d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 16:51:52 -0600 Subject: [PATCH 292/473] Update 010._regular_expression_matching.md --- 010._regular_expression_matching.md | 42 ++++++++++++++--------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/010._regular_expression_matching.md b/010._regular_expression_matching.md index a2ef0a109..493461b72 100644 --- a/010._regular_expression_matching.md +++ b/010._regular_expression_matching.md @@ -1,4 +1,4 @@ -###010. Regular Expression Matching +### 010. Regular Expression Matching 题目: @@ -17,8 +17,15 @@ Hard 暴力解法居然也能AC? +是这样来分情况看得: -``` +- 如果s[i] = p[j] 或者 p[j]= . : 往前匹配一位 +- 如果p[j] = ' * ', 检查一下,如果这个时候p[j-1] = . 或者p[j-1] = s[i] ,那么就往前匹配,如果这样能匹配过,就return True, 否者我们忽略 ' X* ',这里注意里面的递推关系 +- 再处理一下边界状况: + - s已经匹配完了, 如果此时p还有,那么如果剩下的是 X* 这种可以过,所以检查 + - p匹配完毕,如果s还有那么报错 + +```python class Solution(object): def isMatch(self, s, p): """ @@ -26,37 +33,28 @@ class Solution(object): :type p: str :rtype: bool """ - FRONT = -1 def helper(s, i, p, j): - if(j == FRONT): - return (i == FRONT) - if(i == FRONT): + if j == -1: + return i == -1 + if i == -1: if p[j] != '*': return False - return helper(s,i,p,j-2) - if(p[j] == '*'): - if(p[j-1] == '.' or p[j-1] == s[i]): + return helper(s, i, p, j-2) + if p[j] == '*': + if p[j-1] == '.' or p[j-1] == s[i]: if helper(s, i-1, p, j): return True - return helper(s,i,p,j-2) - if(p[j] == '.' or p[j] == s[i]): - return helper(s,i-1,p,j-1) + return helper(s, i, p, j-2) + if p[j] == '.' or p[j] == s[i]: + return helper(s, i-1, p, j-1) return False return helper(s, len(s)-1, p, len(p)-1) - ``` -是这样来分情况看得: - -- 如果s[i] = p[j] 或者 p[j]= . : 往前匹配一位 -- 如果p[j] = ' * ', 检查一下,如果这个时候p[j-1] = . 或者p[j-1] = s[i] ,那么就往前匹配,如果这样能匹配过,就return True, 否者我们忽略 ' X* ',这里注意里面的递推关系 -- 再处理一下边界状况: - - s已经匹配完了, 如果此时p还有,那么如果剩下的是 X* 这种可以过,所以检查 - - p匹配完毕,如果s还有那么报错 - +---------- dp优化,感觉和edit distance很像。 DP优化待代码化,感觉学DP的一个重点除了递归学好以外,另一点是一定要会画表格。 @@ -138,4 +136,4 @@ class Solution(object): -发现自己喜欢这道题目 \ No newline at end of file +发现自己喜欢这道题目 From 8b48b18253af43471016e6cf9c75fa9e5ea7e351 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 17:20:44 -0600 Subject: [PATCH 293/473] Update 010._regular_expression_matching.md --- 010._regular_expression_matching.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/010._regular_expression_matching.md b/010._regular_expression_matching.md index 493461b72..00c76bd2d 100644 --- a/010._regular_expression_matching.md +++ b/010._regular_expression_matching.md @@ -87,7 +87,6 @@ b 3 0 0 0 0 0 1 - p[j-1] != s[i] : dp[i][j] = dp[i][j-2] 匹配0个的状况 - p[j-1] == s[i] or p[i-1] == '.': - dp[i][j] = dp[i-1][j] 匹配多个s[i] - - dp[i][j] = dp[i][j-1] 匹配一个 - dp[i][j] = dp[i][j-2] 匹配0个 AC代码,注意一下,因为上表为了表达方便,用的是1-based string系统,实际写代码的时候我们心里还是清楚这个string还是从0开始的,不过也可以尝试往前面添东西来方便。 @@ -95,7 +94,7 @@ AC代码,注意一下,因为上表为了表达方便,用的是1-based stri AC代码 -``` +```python class Solution(object): def isMatch(self, s, p): """ @@ -119,13 +118,12 @@ class Solution(object): if p[j-2] != s[i-1] and p[j-2] != '.': dp[i][j] = dp[i][j-2] elif p[j-2] == s[i-1] or p[j-2] == '.': - dp[i][j] = dp[i-1][j] or dp[i][j-1] or dp[i][j-2] + dp[i][j] = dp[i-1][j] or dp[i][j-2] elif s[i-1] == p[j-1] or p[j-1] == '.': dp[i][j] = dp[i-1][j-1] return dp[m][n] == 1 - ``` @@ -136,4 +134,3 @@ class Solution(object): -发现自己喜欢这道题目 From c7342f41aaa83cd793cacc3ae46178cfd51b3e7a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 17:21:36 -0600 Subject: [PATCH 294/473] Update 010._regular_expression_matching.md --- 010._regular_expression_matching.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/010._regular_expression_matching.md b/010._regular_expression_matching.md index 00c76bd2d..00bd1e4ae 100644 --- a/010._regular_expression_matching.md +++ b/010._regular_expression_matching.md @@ -131,6 +131,6 @@ class Solution(object): 参考: - +[动态规划](https://hk029.gitbooks.io/leetbook/content/动态规划/010.%20Regular%20Expression%20Matching/010.%20Regular%20Expression%20Matching.html) From 9eef8dc8d30b69b4c08e8c047eafe1314cf1407c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 17:23:11 -0600 Subject: [PATCH 295/473] Update 010._regular_expression_matching.md --- 010._regular_expression_matching.md | 93 +++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/010._regular_expression_matching.md b/010._regular_expression_matching.md index 00bd1e4ae..0add6cf1a 100644 --- a/010._regular_expression_matching.md +++ b/010._regular_expression_matching.md @@ -126,7 +126,100 @@ class Solution(object): return dp[m][n] == 1 ``` +写个测试案例 +```python +import unittest +class Solution(object): + def isMatch(self, s, p): + """ + :type s: str + :type p: str + :rtype: bool + """ + m, n = len(s), len(p) + dp = [ [0 for i in range(n+1)] for j in range(m+1)] + + dp[0][0] = 1 + # init the first line + for i in range(2,n+1): + if p[i-1] == '*': + dp[0][i] = dp[0][i-2] + + for i in range(1,m+1): + for j in range(1,n+1): + if p[j-1] == '*': + if p[j-2] != s[i-1] and p[j-2] != '.': + dp[i][j] = dp[i][j-2] + elif p[j-2] == s[i-1] or p[j-2] == '.': + dp[i][j] = dp[i-1][j] or dp[i][j-2] + + elif s[i-1] == p[j-1] or p[j-1] == '.': + dp[i][j] = dp[i-1][j-1] + + return dp[m][n] == 1 + + +class TestSolution(unittest.TestCase): + def test_none_0(self): + s = "" + p = "" + self.assertTrue(Solution().isMatch(s, p)) + + def test_none_1(self): + s = "" + p = "a" + self.assertFalse(Solution().isMatch(s, p)) + + def test_no_symbol_equal(self): + s = "abcd" + p = "abcd" + self.assertTrue(Solution().isMatch(s, p)) + + def test_no_symbol_not_equal_0(self): + s = "abcd" + p = "efgh" + self.assertFalse(Solution().isMatch(s, p)) + + def test_no_symbol_not_equal_1(self): + s = "ab" + p = "abb" + self.assertFalse(Solution().isMatch(s, p)) + + def test_symbol_0(self): + s = "" + p = "a*" + self.assertTrue(Solution().isMatch(s, p)) + + def test_symbol_1(self): + s = "a" + p = "ab*" + self.assertTrue(Solution().isMatch(s, p)) + + def test_symbol_2(self): + # E.g. + # s a b b + # p 1 0 0 0 + # a 0 1 0 0 + # b 0 0 1 0 + # * 0 1 1 1 + s = "abb" + p = "ab*" + self.assertTrue(Solution().isMatch(s, p)) + + +if __name__ == "__main__": + unittest.main() + + + +输出: +........ +---------------------------------------------------------------------- +Ran 8 tests in 0.001s + +OK +``` 参考: From 7df95c154ca458a898d76a40a5871633a633be72 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 8 Jan 2018 17:23:52 -0600 Subject: [PATCH 296/473] Update 010._regular_expression_matching.md --- 010._regular_expression_matching.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/010._regular_expression_matching.md b/010._regular_expression_matching.md index 0add6cf1a..f3d51b109 100644 --- a/010._regular_expression_matching.md +++ b/010._regular_expression_matching.md @@ -215,7 +215,7 @@ if __name__ == "__main__": 输出: ........ ----------------------------------------------------------------------- + Ran 8 tests in 0.001s OK From 75a9d092db8f5833a60f902e25c384160256a644 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 9 Jan 2018 09:58:24 -0600 Subject: [PATCH 297/473] Update 017._letter_combinations_of_a_phone_number.md --- 017._letter_combinations_of_a_phone_number.md | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/017._letter_combinations_of_a_phone_number.md b/017._letter_combinations_of_a_phone_number.md index 5f61a7e96..e951ad85d 100644 --- a/017._letter_combinations_of_a_phone_number.md +++ b/017._letter_combinations_of_a_phone_number.md @@ -1,4 +1,4 @@ -###17. Letter Combinations of a Phone Number +### 17. Letter Combinations of a Phone Number 题目: @@ -18,38 +18,34 @@ Medium -``` +```python class Solution(object): def letterCombinations(self, digits): """ :type digits: str :rtype: List[str] """ - if digits == "": + if digits == '': return [] - self.res = [] - self.singleResult('',digits) + self.singleResult('', digits) return self.res - + def singleResult(self, s, digits): if len(digits) == 0: self.res.append(s) else: mapx = {'2':['a','b','c'], - '3':['d','e','f'], - '4':['g','h','i'], - '5':['j','k','l'], - '6':['m','n','o'], - '7':['p','q','r','s'], - '8':['t','u','v'], - '9':['w','x','y','z']} - - curDigit = digits[0] - for alpha in mapx[curDigit]: - self.singleResult(s + alpha, digits[1:]) - - + '3':['d','e','f'], + '4':['g','h','i'], + '5':['j','k','l'], + '6':['m','n','o'], + '7':['p','q','r','s'], + '8':['t','u','v'], + '9':['w','x','y','z']} + cur_digit = digits[0] + for c in mapx[cur_digit]: + self.singleResult(s+c, digits[1:]) ``` From 3ad0c6aa29a9e368aa5ad8de9dc22bcf064042da Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 9 Jan 2018 10:04:51 -0600 Subject: [PATCH 298/473] Update 280. Wiggle Sort.md --- 280. Wiggle Sort.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/280. Wiggle Sort.md b/280. Wiggle Sort.md index 4a239c466..636493011 100644 --- a/280. Wiggle Sort.md +++ b/280. Wiggle Sort.md @@ -62,7 +62,7 @@ class Solution(object): AC 代码 -``` +```python class Solution(object): def wiggleSort(self, nums): """ From 015eaae40e439e1dcc9cf2360bd9a243d30fcc73 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 9 Jan 2018 10:14:49 -0600 Subject: [PATCH 299/473] Update 280. Wiggle Sort.md --- 280. Wiggle Sort.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/280. Wiggle Sort.md b/280. Wiggle Sort.md index 636493011..38cbbee3d 100644 --- a/280. Wiggle Sort.md +++ b/280. Wiggle Sort.md @@ -29,8 +29,8 @@ ``` class Solution(object): - def wiggleSort(self, nums): - """ +    def wiggleSort(self, nums): # 此法超时 +        """ :type nums: List[int] :rtype: void Do not return anything, modify nums in-place instead. """ From 5d4a9b3ac52e22ef6863eb584808afa86c964ab0 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 9 Jan 2018 10:18:48 -0600 Subject: [PATCH 300/473] Update 280. Wiggle Sort.md --- 280. Wiggle Sort.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/280. Wiggle Sort.md b/280. Wiggle Sort.md index 38cbbee3d..3188ca405 100644 --- a/280. Wiggle Sort.md +++ b/280. Wiggle Sort.md @@ -69,9 +69,9 @@ class Solution(object): :type nums: List[int] :rtype: void Do not return anything, modify nums in-place instead. """ - for i in xrange(1,len(nums)): - if ((i % 2) and nums[i] < nums[i-1]) or ( not (i%2) and nums[i] > nums[i-1]): - nums[i-1],nums[i] = nums[i],nums[i-1] + for i in xrange(1, len(nums)): + if ((i % 2) and nums[i] < nums[i-1]) or ((not i % 2) and nums[i] > nums[i-1]): + nums[i], nums[i-1] = nums[i-1], nums[i] ``` From 6ebf08c2d74e9e50b485781dddbe67b72462ef7a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 9 Jan 2018 11:43:30 -0600 Subject: [PATCH 301/473] Rename 280. Wiggle Sort.md to 280._Wiggle_Sort.md --- 280. Wiggle Sort.md => 280._Wiggle_Sort.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 280. Wiggle Sort.md => 280._Wiggle_Sort.md (100%) diff --git a/280. Wiggle Sort.md b/280._Wiggle_Sort.md similarity index 100% rename from 280. Wiggle Sort.md rename to 280._Wiggle_Sort.md From c1607d32bd2c7eda3d70702e95f611adf5d300eb Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 9 Jan 2018 11:48:23 -0600 Subject: [PATCH 302/473] Create 324._Wiggle_Sort_II.md --- 324._Wiggle_Sort_II.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 324._Wiggle_Sort_II.md diff --git a/324._Wiggle_Sort_II.md b/324._Wiggle_Sort_II.md new file mode 100644 index 000000000..5ebc2594b --- /dev/null +++ b/324._Wiggle_Sort_II.md @@ -0,0 +1,42 @@ +### 324. Wiggle Sort II + + + +题目: + + + +难度: +Medium + +思路: + +首先这道题和[Wiggle Sort](https://github.com/Lisanaaa/thinking_in_lc/blob/master/280._Wiggle_Sort.md)要求不一样,不能有等于, +所以如果碰到一串```‘1,1,1,1,1,1’```,当调换顺序时候还是不会满足。 + +因此我们用新方法,首先将原数组排序,然后大的那一半数字降序插在奇数```index```上,小的那一半数字降序插在偶数```index```上 + + +```python +class Solution(object): + def wiggleSort(self, nums): + """ + :type nums: List[int] + :rtype: void Do not return anything, modify nums in-place instead. + """ + nums.sort() + half = len(nums[::2]) + nums[::2], nums[1::2] = nums[:half][::-1], nums[half:][::-1] +``` + + +### Follow up +O(n) time, O(1) space + +思路: +首先想到的是将我们上面的排序方法用堆排序实现即可,建堆O(n),调整堆O(lgN) + + +```python + +``` From d592d995995bc2ac693a1fd45105d33297b78f0a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 9 Jan 2018 12:17:20 -0600 Subject: [PATCH 303/473] Update 155._min_stack.md --- 155._min_stack.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/155._min_stack.md b/155._min_stack.md index c663119df..fac02c17e 100644 --- a/155._min_stack.md +++ b/155._min_stack.md @@ -1,4 +1,4 @@ -###155. Min Stack +### 155. Min Stack 题目: @@ -14,7 +14,7 @@ Easy 用lst和系统的heapq,提升一下,用deque和heapq,这样也没太大提升 -``` +```python from heapq import * class MinStack(object): @@ -122,7 +122,7 @@ Auxiliary Stack 这样无论是用deque还是本身的lst都有一些提升 -``` +```python from collections import deque class MinStack(object): @@ -166,4 +166,4 @@ class MinStack(object): :rtype: int """ return self.aux[-1] -``` \ No newline at end of file +``` From 88bbfe82be4e4b313003b42b1b67a2f6df8c395b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 9 Jan 2018 12:26:34 -0600 Subject: [PATCH 304/473] Update and rename 231. Power of Two.md to 231. _Power_of_Two.md --- ... Power of Two.md => 231. _Power_of_Two.md | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) rename 231. Power of Two.md => 231. _Power_of_Two.md (77%) diff --git a/231. Power of Two.md b/231. _Power_of_Two.md similarity index 77% rename from 231. Power of Two.md rename to 231. _Power_of_Two.md index 7850b2947..084414a8e 100644 --- a/231. Power of Two.md +++ b/231. _Power_of_Two.md @@ -18,14 +18,14 @@ Easy power of two 那是这个数字的binary 表示一定只有一个1 -套用以前的代码数1的位数的 +套用以前的代码,数1的位数的 这样会超时 ``` class Solution(object): - def isPowerOfTwo(self, n): - """ +    def isPowerOfTwo(self, n): # 此法超时 +        """ :type n: int :rtype: bool """ @@ -42,22 +42,21 @@ class Solution(object): -``` +```python class Solution(object): def isPowerOfTwo(self, n): """ :type n: int :rtype: bool """ - if n <= 0 : - return False + if n <= 0: + return False if n == 1: - return True - if n%2 == 0: - return self.isPowerOfTwo(n/2) - else: - return False - + return True + if n % 2 == 0: + return self.isPowerOfTwo(n/2) + return False + ``` @@ -76,17 +75,14 @@ class Solution(object): 注意特殊case 0的处理 -``` +```python class Solution(object): def isPowerOfTwo(self, n): """ :type n: int :rtype: bool """ - if n == 0 :return False - else: - res = n & (n-1) - return res == 0 + return n & (n-1) == 0 if n != 0 else False ``` From 017d552d1850743db978beba653137ba2576c47d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 9 Jan 2018 12:29:40 -0600 Subject: [PATCH 305/473] Update 191._number_of_1_bits.md --- 191._number_of_1_bits.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/191._number_of_1_bits.md b/191._number_of_1_bits.md index ac09a2c84..4700c242f 100644 --- a/191._number_of_1_bits.md +++ b/191._number_of_1_bits.md @@ -12,18 +12,14 @@ Easy 转成二进制,数1的个数 -``` +```python class Solution(object): def hammingWeight(self, n): """ :type n: int :rtype: int """ - count = 0 - while n > 0: - count += n % 2 - n = n//2 - return count + return bin(n).count('1') ``` @@ -54,7 +50,7 @@ AC代码 -``` +```python class Solution(object): def hammingWeight(self, n): """ From e4d80cc992f07f96505bfea75de2fb8942bec3f2 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 9 Jan 2018 12:29:48 -0600 Subject: [PATCH 306/473] Update 191._number_of_1_bits.md --- 191._number_of_1_bits.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/191._number_of_1_bits.md b/191._number_of_1_bits.md index 4700c242f..dcba66c7b 100644 --- a/191._number_of_1_bits.md +++ b/191._number_of_1_bits.md @@ -1,4 +1,4 @@ -###191. Number of 1 Bits +### 191. Number of 1 Bits 题目: From b9c086be53d3ac00468f83d30636ba05aa10afc9 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 9 Jan 2018 12:30:47 -0600 Subject: [PATCH 307/473] Update 231. _Power_of_Two.md --- 231. _Power_of_Two.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/231. _Power_of_Two.md b/231. _Power_of_Two.md index 084414a8e..c90024d2e 100644 --- a/231. _Power_of_Two.md +++ b/231. _Power_of_Two.md @@ -18,7 +18,7 @@ Easy power of two 那是这个数字的binary 表示一定只有一个1 -套用以前的代码,数1的位数的 +套用以前的代码[leetcode191](https://github.com/Lisanaaa/thinking_in_lc/blob/master/191._number_of_1_bits.md) 这样会超时 @@ -31,7 +31,7 @@ class Solution(object): """ cnt = 0 while n != 0: - n &= n -1 + n &= n - 1 cnt += 1 return cnt == 1 ``` From c696c8af8f363a4ec4896a0f4afc5a037315f28d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 9 Jan 2018 12:36:54 -0600 Subject: [PATCH 308/473] Update 326._power_of_three.md --- 326._power_of_three.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/326._power_of_three.md b/326._power_of_three.md index 87a6ab083..9cd035d9c 100644 --- a/326._power_of_three.md +++ b/326._power_of_three.md @@ -1,4 +1,4 @@ -###326. Power of Three +### 326. Power of Three 题目: @@ -11,7 +11,7 @@ 直接就上的递归 -``` +```python class Solution(object): def isPowerOfThree(self,n): """ @@ -22,10 +22,9 @@ class Solution(object): return False if n == 1: return True - if n%3 == 0: + if n % 3 == 0: return self.isPowerOfThree(n/3) - else: - return False + return False ``` @@ -36,15 +35,14 @@ class Solution(object): 只用检查是否能被这个数整除 -``` +```python class Solution(object): def isPowerOfThree(self, n): """ :type n: int :rtype: bool """ - return n > 0 and 1162261467 % n == 0 + return n > 0 and pow(3, 19) % n == 0 + ``` - -结果跑出来这个running time 更慢||| From d2dfb70e3a4eff848b98af7cb4ddb213b27f18ce Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 9 Jan 2018 12:38:24 -0600 Subject: [PATCH 309/473] Update and rename 342. Power of Four.md to 342._Power_of_Four.md --- 342. Power of Four.md => 342._Power_of_Four.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) rename 342. Power of Four.md => 342._Power_of_Four.md (91%) diff --git a/342. Power of Four.md b/342._Power_of_Four.md similarity index 91% rename from 342. Power of Four.md rename to 342._Power_of_Four.md index dce04d62a..c895a7c24 100644 --- a/342. Power of Four.md +++ b/342._Power_of_Four.md @@ -11,7 +11,7 @@ 继续照抄power of three -``` +```python class Solution(object): def isPowerOfFour(self, num): """ @@ -24,8 +24,7 @@ class Solution(object): return True if num % 4 == 0: return self.isPowerOfFour(num/4) - else: - return False + return False ``` From 22764ec4fa4da17a74b66d1242558ac6ad615c29 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 9 Jan 2018 12:45:34 -0600 Subject: [PATCH 310/473] Update 387._first_unique_character_in_a_string.md --- 387._first_unique_character_in_a_string.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/387._first_unique_character_in_a_string.md b/387._first_unique_character_in_a_string.md index db3256c39..dfbb89ae1 100644 --- a/387._first_unique_character_in_a_string.md +++ b/387._first_unique_character_in_a_string.md @@ -1,4 +1,4 @@ -###387. First Unique Character in a String +### 387. First Unique Character in a String 题目: @@ -20,14 +20,13 @@ Python作弊法 -``` +```python class Solution(object): def firstUniqChar(self, s): """ :type s: str :rtype: int """ - import collections d = collections.Counter(s) for x,c in enumerate(s): if d[c] == 1: @@ -40,7 +39,7 @@ class Solution(object): 利用问题的特性,因为只有可能是小写字母,所以可以用一个长度为26的array, 先数一遍char的数量,然后enumerate从左往右又来 -``` +```python class Solution(object): def firstUniqChar(self, s): """ From e43baa60595fff37cc9b17e090162f583639cac9 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Tue, 9 Jan 2018 12:59:49 -0600 Subject: [PATCH 311/473] Create 374._Guess_Number_Higher_or_Lower.md --- 374._Guess_Number_Higher_or_Lower.md | 34 ++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 374._Guess_Number_Higher_or_Lower.md diff --git a/374._Guess_Number_Higher_or_Lower.md b/374._Guess_Number_Higher_or_Lower.md new file mode 100644 index 000000000..d7d3072f2 --- /dev/null +++ b/374._Guess_Number_Higher_or_Lower.md @@ -0,0 +1,34 @@ +### 374. Guess Number Higher or Lower + +题目: + + + +难度: + +Easy + + +思路 + +二分 + +```python +class Solution(object): + def guessNumber(self, n): + """ + :type n: int + :rtype: int + """ + l, r = 1, n + while l <= r: + mid = l + ((r - l) >> 2) + if guess(mid) == 1: + l = mid + 1 + elif guess(mid) == -1: + r = mid - 1 + else: + return mid +``` + + From 23bd498843b48e9b00d75cafc614b500e276f25a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 10 Jan 2018 12:04:56 -0600 Subject: [PATCH 312/473] Create 448._Find_All_Numbers_Disappeared_in_an_Array.md --- ...ind_All_Numbers_Disappeared_in_an_Array.md | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 448._Find_All_Numbers_Disappeared_in_an_Array.md diff --git a/448._Find_All_Numbers_Disappeared_in_an_Array.md b/448._Find_All_Numbers_Disappeared_in_an_Array.md new file mode 100644 index 000000000..b03105e6b --- /dev/null +++ b/448._Find_All_Numbers_Disappeared_in_an_Array.md @@ -0,0 +1,25 @@ +### 448. Find All Numbers Disappeared in an Array + +题目: + + + +难度: + +Easy + + + + + +```python +class Solution(object): + def findDisappearedNumbers(self, nums): + """ + :type nums: List[int] + :rtype: List[int] + """ + return list(set(range(1, len(nums)+1)) - set(nums)) +``` + + From 7f4d7c9f6ff6b90f1ad958ba9109637770088e70 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 10 Jan 2018 13:06:32 -0600 Subject: [PATCH 313/473] Create 657._Judge_Route_Circle.md --- 657._Judge_Route_Circle.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 657._Judge_Route_Circle.md diff --git a/657._Judge_Route_Circle.md b/657._Judge_Route_Circle.md new file mode 100644 index 000000000..12827f576 --- /dev/null +++ b/657._Judge_Route_Circle.md @@ -0,0 +1,23 @@ +### 657. Judge Route Circle +题目: + + + +难度: + +Easy + + + + +```python +class Solution(object): + def judgeCircle(self, moves): + """ + :type moves: str + :rtype: bool + """ + return moves.count('D') == moves.count('U') and moves.count('R') == moves.count('L') +``` + + From ebb48450ed3aced88e2dac341d2d08199cf73e7e Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 10 Jan 2018 14:37:29 -0600 Subject: [PATCH 314/473] Update 050._pow(x,_n).md --- 050._pow(x,_n).md | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/050._pow(x,_n).md b/050._pow(x,_n).md index d7a2d0e31..697863e2f 100644 --- a/050._pow(x,_n).md +++ b/050._pow(x,_n).md @@ -1,4 +1,4 @@ -###50. Pow(x, n) +### 50. Pow(x, n) 题目: @@ -9,10 +9,9 @@ Medium -幼时的我写的代码 🔽 +Recursive - -``` +```python class Solution(object): def myPow(self, x, n): """ @@ -20,17 +19,30 @@ class Solution(object): :type n: int :rtype: float """ - def myPosPow(x, n): - if n == 0 : - return 1 - v = myPosPow(x, n / 2) - if n % 2 == 0: - return v * v - else: - return x * v * v - - if n < 0 : - return 1 / myPosPow(x, -n) + if n == 0: + return 1 + if n < 0: + return 1 / self.myPow(x, -n) + if n % 2 == 0: + return self.myPow(x*x, n/2) else: - return myPosPow(x, n) + return x * self.myPow(x*x, n/2) + +``` +iterative + + +```python +class Solution: + def myPow(self, x, n): + if n < 0: + x = 1 / x + n = -n + pow = 1 + while n: + if n & 1: + pow *= x + x *= x + n >>= 1 + return pow ``` From 67d5a43254cf3831d332c2d32e529b8e8d335f23 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 10 Jan 2018 15:44:24 -0600 Subject: [PATCH 315/473] Create 56._Merge_Intervals.md --- 56._Merge_Intervals.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 56._Merge_Intervals.md diff --git a/56._Merge_Intervals.md b/56._Merge_Intervals.md new file mode 100644 index 000000000..86c83405f --- /dev/null +++ b/56._Merge_Intervals.md @@ -0,0 +1,31 @@ +### 56. Merge Intervals + +题目: + + + +难度: + +Medium + + +Just go through the intervals sorted by start coordinate and +either combine the current interval with the previous one if they overlap, or add it to the output by itself if they don’t. + +```python +class Solution(object): + def twoSum(self, nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: List[int] + """ + lookup = {} + for i, num in enumerate(nums): + if target - num in lookup: + return [lookup[target - num],i] + lookup[num] = i + return [] +``` + + From fbdffb1fb1712c34bc227544ed123dd0b1d766da Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 10 Jan 2018 15:44:43 -0600 Subject: [PATCH 316/473] Rename 56._Merge_Intervals.md to 056._Merge_Intervals.md --- 56._Merge_Intervals.md => 056._Merge_Intervals.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 56._Merge_Intervals.md => 056._Merge_Intervals.md (100%) diff --git a/56._Merge_Intervals.md b/056._Merge_Intervals.md similarity index 100% rename from 56._Merge_Intervals.md rename to 056._Merge_Intervals.md From 6f271cf9ddc34e73bfc025c88e488fb0df9eeac2 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 10 Jan 2018 15:45:22 -0600 Subject: [PATCH 317/473] Update 056._Merge_Intervals.md --- 056._Merge_Intervals.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/056._Merge_Intervals.md b/056._Merge_Intervals.md index 86c83405f..1f5ab7aa6 100644 --- a/056._Merge_Intervals.md +++ b/056._Merge_Intervals.md @@ -14,18 +14,18 @@ either combine the current interval with the previous one if they overlap, or ad ```python class Solution(object): - def twoSum(self, nums, target): + def merge(self, intervals): """ - :type nums: List[int] - :type target: int - :rtype: List[int] + :type intervals: List[Interval] + :rtype: List[Interval] """ - lookup = {} - for i, num in enumerate(nums): - if target - num in lookup: - return [lookup[target - num],i] - lookup[num] = i - return [] + res = [] + for i in sorted(intervals, key = lambda i: i.start): + if res and i.start <= res[-1].end: + res[-1].end = max(i.end, res[-1].end) + else: + res.append(i) + return res ``` From 202c89e66b78f941b05794d1fceaa2b396e86491 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 10 Jan 2018 16:51:54 -0600 Subject: [PATCH 318/473] =?UTF-8?q?Update=20=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\346\200\273\347\273\223.md" | 97 +++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git "a/\346\200\273\347\273\223.md" "b/\346\200\273\347\273\223.md" index 6cbed571c..99fcba752 100644 --- "a/\346\200\273\347\273\223.md" +++ "b/\346\200\273\347\273\223.md" @@ -21,3 +21,100 @@ In general, try to see if for a problem, the solution doesn’t depend on a lot # 4 [Counter.elements()](https://docs.python.org/2/library/collections.html) + +# 5 +测试案例写法 + +```python +import unittest +class Solution(object): + def isMatch(self, s, p): + """ + :type s: str + :type p: str + :rtype: bool + """ + m, n = len(s), len(p) + dp = [ [0 for i in range(n+1)] for j in range(m+1)] + + dp[0][0] = 1 + + # init the first line + for i in range(2,n+1): + if p[i-1] == '*': + dp[0][i] = dp[0][i-2] + + for i in range(1,m+1): + for j in range(1,n+1): + if p[j-1] == '*': + if p[j-2] != s[i-1] and p[j-2] != '.': + dp[i][j] = dp[i][j-2] + elif p[j-2] == s[i-1] or p[j-2] == '.': + dp[i][j] = dp[i-1][j] or dp[i][j-2] + + elif s[i-1] == p[j-1] or p[j-1] == '.': + dp[i][j] = dp[i-1][j-1] + + return dp[m][n] == 1 + + +class TestSolution(unittest.TestCase): + def test_none_0(self): + s = "" + p = "" + self.assertTrue(Solution().isMatch(s, p)) + + def test_none_1(self): + s = "" + p = "a" + self.assertFalse(Solution().isMatch(s, p)) + + def test_no_symbol_equal(self): + s = "abcd" + p = "abcd" + self.assertTrue(Solution().isMatch(s, p)) + + def test_no_symbol_not_equal_0(self): + s = "abcd" + p = "efgh" + self.assertFalse(Solution().isMatch(s, p)) + + def test_no_symbol_not_equal_1(self): + s = "ab" + p = "abb" + self.assertFalse(Solution().isMatch(s, p)) + + def test_symbol_0(self): + s = "" + p = "a*" + self.assertTrue(Solution().isMatch(s, p)) + + def test_symbol_1(self): + s = "a" + p = "ab*" + self.assertTrue(Solution().isMatch(s, p)) + + def test_symbol_2(self): + # E.g. + # s a b b + # p 1 0 0 0 + # a 0 1 0 0 + # b 0 0 1 0 + # * 0 1 1 1 + s = "abb" + p = "ab*" + self.assertTrue(Solution().isMatch(s, p)) + + +if __name__ == "__main__": + unittest.main() + + + +输出: +........ + +Ran 8 tests in 0.001s + +OK +``` From 78076a85a82ce46ec51d877239e0913925d6cb16 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 10 Jan 2018 17:09:35 -0600 Subject: [PATCH 319/473] Update 031._next_permutation.md --- 031._next_permutation.md | 82 +++++++++++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 18 deletions(-) diff --git a/031._next_permutation.md b/031._next_permutation.md index 7d33a3470..35c92949f 100644 --- a/031._next_permutation.md +++ b/031._next_permutation.md @@ -1,5 +1,5 @@ -###31. Next Permutation +### 31. Next Permutation 题目: @@ -14,7 +14,55 @@ Medium +首先,关于什么是全排列不做解释。如果一个排列为A,下一个排列为A_NEXT,那么A_NEXT一定与A有尽可能长的公共前缀。 +看具体例子,一个排列为124653,如何找到它的下一个排列,因为下一个排列一定与124653有尽可能长的前缀,所以,脑洞大开一下,从后面往前看这个序列,如果后面的若干个数字有下一个排列,问题就得到了解决。 + +第一步:找最后面1个数字的下一个全排列。 + +124653,显然最后1个数字3不具有下一个全排列。 + +第二步:找最后面2个数字的下一个全排列。 + +124653,显然最后2个数字53不具有下一个全排列。 + +第三步:找最后面3个数字的下一个全排列。 + +124653,显然最后3个数字653不具有下一个全排列。 + + +------插曲:到这里相信大家已经看出来,如果一个序列是递减的,那么它不具有下一个排列。 + + +第四步:找最后面4个数字的下一个全排列。 + +124653,我们发现显然最后4个数字4653具有下一个全排列。因为它不是递减的,例如6453,5643这些排列都在4653的后面。 + + +我们总结上面的操作,并总结出重复上面操作的两种终止情况: + +1:从后向前比较相邻的两个元素,直到前一个元素小于后一个元素,停止 + +2:如果已经没有了前一个元素,则说明这个排列是递减的,所以这个排列是没有下一个排列的。 + + +124653这个排列终止情况是上面介绍的第一种,从后向前比较相邻的2个元素,遇到4<6的情况停止。 + +并且我们可以知道: + +1:124653和它的下一个排列的公共前缀为12(因为4653存在下一个排列,所以前面的数字12保持不变) + +2:4后面的元素是递减的(上面介绍的终止条件是前一个元素小于后一个元素,这里是4<6) + + +现在,我们开始考虑如何找到4653的下个排列,首先明确4后面的几个数字中至少有一个大于4. + +4肯定要和653这3个数字中大于4的数字中(6,5)的某一个进行交换。这里就是4要和6,5中的某一个交换,很明显要和5交换,如果找到这样的元素呢,因为我们知道4后面的元素是递减的,所以在653中从后面往前查找,找到第一个大于4的数字,这就是需要和4进行交换的数字。这里我们找到了5,交换之后得到的临时序列为5643.,交换后得到的643也是一个递减序列。 + + +所以得到的4653的下一个临时序列为5643,但是既然前面数字变大了(4653--->5643),后面的自然要变为升序才行,变换5643得到5346. + +所以124653的下一个序列为125346. 看一个permutation,比如 @@ -29,29 +77,27 @@ Medium AC 代码 -``` +```python class Solution(object): def nextPermutation(self, nums): """ :type nums: List[int] :rtype: void Do not return anything, modify nums in-place instead. """ - m, n = 0, 0 - for i in range(len(nums) - 2, 0 , -1): - if nums[i] < nums[i+1]: - m = i - break - - for i in range(len(nums) - 1, 0 , -1): - if nums[i] > nums[m]: - n = i - break - - if m < n : - nums[m], nums[n] = nums[n], nums[m] - nums[m+1:] = nums[len(nums):m:-1] - else: - nums = nums.reverse() + if len(nums) <= 1: + return + idx = 0 + for i in range(len(nums)-1, 0, -1): + if nums[i] > nums[i-1]: # find first number which is smaller than it's after number + idx = i + break + if idx != 0: # if the number exist,which means that the nums not like{5,4,3,2,1} + for i in range(len(nums)-1, 0, -1): + if nums[i] > nums[idx-1]: + nums[i], nums[idx-1] = nums[idx-1], nums[i] + break + + nums[idx:] = nums[idx:][::-1] ``` From 29aa98110497f6d43d065106a4905cb209301aa3 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 10 Jan 2018 17:17:50 -0600 Subject: [PATCH 320/473] Update 074._search_a_2d_matrix.md --- 074._search_a_2d_matrix.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/074._search_a_2d_matrix.md b/074._search_a_2d_matrix.md index bef2e7ffb..ef80c1db5 100644 --- a/074._search_a_2d_matrix.md +++ b/074._search_a_2d_matrix.md @@ -1,11 +1,11 @@ -###74. Search a 2D Matrix +### 74. Search a 2D Matrix 题目: 难度: -Easy +Medium @@ -48,4 +48,4 @@ class Solution(object): -``` \ No newline at end of file +``` From a8aa911e36c3097065bee5ca2ce122da2aefa71b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 10 Jan 2018 17:21:12 -0600 Subject: [PATCH 321/473] Update 074._search_a_2d_matrix.md --- 074._search_a_2d_matrix.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/074._search_a_2d_matrix.md b/074._search_a_2d_matrix.md index ef80c1db5..aaf420076 100644 --- a/074._search_a_2d_matrix.md +++ b/074._search_a_2d_matrix.md @@ -8,9 +8,11 @@ Medium +思路: +想过将```2D matrix```看成一个大```sorted list```,但是后面觉得不行 +原因如下:```There are two main reasons why treating the matrix as a sorted array is a bad idea, considering that it doesn’t bring any improvement on time complexity : 1. as zhongjp058 mentioned, m*n may cause overflow; 2. it uses multiple expensive operations such as / and %``` - -二分Search +因此二分Search,``` binary search by row first, then binary search by column.``` ``` From 17249c4be10e5dc212a76c9ca0cc1cbc02648cea Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 10 Jan 2018 17:22:10 -0600 Subject: [PATCH 322/473] Update 074._search_a_2d_matrix.md --- 074._search_a_2d_matrix.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/074._search_a_2d_matrix.md b/074._search_a_2d_matrix.md index aaf420076..868e7e938 100644 --- a/074._search_a_2d_matrix.md +++ b/074._search_a_2d_matrix.md @@ -10,7 +10,10 @@ Medium 思路: 想过将```2D matrix```看成一个大```sorted list```,但是后面觉得不行 -原因如下:```There are two main reasons why treating the matrix as a sorted array is a bad idea, considering that it doesn’t bring any improvement on time complexity : 1. as zhongjp058 mentioned, m*n may cause overflow; 2. it uses multiple expensive operations such as / and %``` + +原因如下: +1. m * n may overflow for large m and n; +2. it will use multiple expensive operations such as / and %``` 因此二分Search,``` binary search by row first, then binary search by column.``` From fc4aca3c3e582845ee444ce0194b2cb39c5e11fb Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 10 Jan 2018 17:22:25 -0600 Subject: [PATCH 323/473] Update 074._search_a_2d_matrix.md --- 074._search_a_2d_matrix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/074._search_a_2d_matrix.md b/074._search_a_2d_matrix.md index 868e7e938..780a49cfb 100644 --- a/074._search_a_2d_matrix.md +++ b/074._search_a_2d_matrix.md @@ -13,7 +13,7 @@ Medium 原因如下: 1. m * n may overflow for large m and n; -2. it will use multiple expensive operations such as / and %``` +2. it will use multiple expensive operations such as / and % 因此二分Search,``` binary search by row first, then binary search by column.``` From 434ec6b1202aed4b3c5bcb2395d5da2ef0295312 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Wed, 10 Jan 2018 17:55:41 -0600 Subject: [PATCH 324/473] Update 074._search_a_2d_matrix.md --- 074._search_a_2d_matrix.md | 77 +++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 26 deletions(-) diff --git a/074._search_a_2d_matrix.md b/074._search_a_2d_matrix.md index 780a49cfb..026a5d34d 100644 --- a/074._search_a_2d_matrix.md +++ b/074._search_a_2d_matrix.md @@ -9,16 +9,44 @@ Medium 思路: -想过将```2D matrix```看成一个大```sorted list```,但是后面觉得不行 +想过将```2D matrix```看成一个大```sorted list```,代码如下: +```python +class Solution(object): + def searchMatrix(self, matrix, target): + """ + :type matrix: List[List[int]] + :type target: int + :rtype: bool + """ + row = len(matrix) + col = len(matrix[0]) if row else 0 + l, r = 0, row * col - 1 + while l <= r: + mid = l + ((r - l) >> 2) + if target > matrix[mid/col][mid%col]: + l = mid + 1 + elif target < matrix[mid/col][mid%col]: + r = mid - 1 + else: + return True + return False +``` + +但是后面觉得不行, 原因如下: 1. m * n may overflow for large m and n; 2. it will use multiple expensive operations such as / and % + + + + + 因此二分Search,``` binary search by row first, then binary search by column.``` -``` +```python class Solution(object): def searchMatrix(self, matrix, target): """ @@ -26,31 +54,28 @@ class Solution(object): :type target: int :rtype: bool """ - if len(matrix) == 0: + if not matrix or not matrix[0]: return False - else: - n = len(matrix[0]) - half = len(matrix)//2 - if target >= matrix[half][0] and target <= matrix[half][n-1]: - return self.searchList(matrix[half],target) - elif target < matrix[half][0]: - return self.searchMatrix(matrix[:half],target) + row = len(matrix) + col = len(matrix[0]) if row else 0 + l, r = 0, row - 1 + while l <= r: + mid_row = l + ((r - l) >> 2) + if matrix[mid_row][0] <= target <= matrix[mid_row][-1]: + m, n = 0, col - 1 + while m <= n: + mid_col = m + ((n - m) >> 2) + if matrix[mid_row][mid_col] > target: + n = mid_col - 1 + elif matrix[mid_row][mid_col] < target: + m = mid_col + 1 + else: + return True + return False + elif target < matrix[mid_row][0]: + r = mid_row - 1 else: - return self.searchMatrix(matrix[half+1:],target) - - def searchList(self, lst, target): - if len(lst) == 0: - return False - else: - mid = len(lst) // 2 - if target == lst[mid]: - return True - elif target < lst[mid]: - return self.searchList(lst[:mid],target) - else: - return self.searchList(lst[mid+1:],target) - - - + l = mid_row + 1 + return False ``` From ef3f27f028fe80183ac4ba07e33ed8d94c4f79e7 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 12:49:26 -0600 Subject: [PATCH 325/473] Update 278. First Bad Version.md --- 278. First Bad Version.md | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/278. First Bad Version.md b/278. First Bad Version.md index 7d15e1ce8..7c6d94240 100644 --- a/278. First Bad Version.md +++ b/278. First Bad Version.md @@ -15,29 +15,25 @@ 思路: -根据 search for a range 改的,这个binary search的边界也是令人着(chi)迷(dai)啊 +根据 search for a range 改的 -这里使用 `n+1` 一是边界令人着迷,二是version是从1开始的 - -``` +```python class Solution(object): def firstBadVersion(self, n): """ :type n: int :rtype: int """ - l, r = 0, n+1 - - while l < r: - mid = (l+r) // 2 - if isBadVersion(mid) and (mid == 0 or (not isBadVersion(mid-1))): - return mid - if isBadVersion(mid): - r = mid - else: - l = mid + 1 + l, r = 0, n - 1 + while l <= r: + mid = l + ((r - l) >> 2) + if not isBadVersion(mid): + l = mid + 1 + else: + r = mid - 1 + return l ``` From a33c613d82adf6fe175f1a88fd58caea5f09722d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 12:51:05 -0600 Subject: [PATCH 326/473] Update 240._search_a_2d_matrix_ii.md --- 240._search_a_2d_matrix_ii.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/240._search_a_2d_matrix_ii.md b/240._search_a_2d_matrix_ii.md index 1f3ea3ca5..1710c0ffa 100644 --- a/240._search_a_2d_matrix_ii.md +++ b/240._search_a_2d_matrix_ii.md @@ -1,4 +1,4 @@ -###240. Search a 2D Matrix II +### 240. Search a 2D Matrix II @@ -62,4 +62,4 @@ class Solution(object): return True return False -``` \ No newline at end of file +``` From b949df2f77446d382d2766ef2298d9848a4877d3 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 12:51:31 -0600 Subject: [PATCH 327/473] Rename 278. First Bad Version.md to 278._First_Bad _Version.md --- 278. First Bad Version.md => 278._First_Bad _Version.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 278. First Bad Version.md => 278._First_Bad _Version.md (100%) diff --git a/278. First Bad Version.md b/278._First_Bad _Version.md similarity index 100% rename from 278. First Bad Version.md rename to 278._First_Bad _Version.md From 170e122cb208054f7611d2dfcd3e41c5cdfd0c48 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 12:55:47 -0600 Subject: [PATCH 328/473] Update 240._search_a_2d_matrix_ii.md --- 240._search_a_2d_matrix_ii.md | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/240._search_a_2d_matrix_ii.md b/240._search_a_2d_matrix_ii.md index 1710c0ffa..545732ebc 100644 --- a/240._search_a_2d_matrix_ii.md +++ b/240._search_a_2d_matrix_ii.md @@ -38,7 +38,7 @@ m, n = 0, col - 1 -``` +```python class Solution(object): def searchMatrix(self, matrix, target): """ @@ -47,19 +47,17 @@ class Solution(object): :rtype: bool """ if not matrix: - return False - + return False row = len(matrix) - col = len(matrix[0]) - m, n = 0, col - 1 - + col = len(matrix[0]) if row else 0 + m, n = 0, col - 1 while m < row and n >= 0: - if matrix[m][n] < target: - m += 1 - elif matrix[m][n] > target: - n -= 1 - else: - return True + if matrix[m][n] < target: + m += 1 + elif matrix[m][n] > target: + n -= 1 + else: + return True return False ``` From ee1d9ffe4592033443cbe85cb7686875a23474f4 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 13:26:15 -0600 Subject: [PATCH 329/473] Update 139._word_break.md --- 139._word_break.md | 107 ++++++++++++++++++++++----------------------- 1 file changed, 52 insertions(+), 55 deletions(-) diff --git a/139._word_break.md b/139._word_break.md index 45d941fb3..dbb29989a 100644 --- a/139._word_break.md +++ b/139._word_break.md @@ -1,61 +1,58 @@ -###139. Word Break - -题目: - - - -难度: - -Medium - - - -超时,无法AC - -backtracking,或者叫递归,简直超时小公主了 - -``` +### 139. Word Break + +题目: + + + +难度: + +Medium + + + + +```python class Solution(object): def wordBreak(self, s, wordDict): """ :type s: str - :type wordDict: Set[str] + :type wordDict: List[str] :rtype: bool """ - self.res = [] - self.wordBreakLst([],s,wordDict) - for r in self.res: - return set(wordDict) >= set(r) - return False - - - def wordBreakLst(self, lst, rest, wordDict): - if rest == '': - self.res.append(lst) - for i in range(1+len(rest)): - if rest[:i] in wordDict: - self.wordBreakLst(lst+[rest[:i]],rest[i:],wordDict) -``` - - -然后发现别人家的孩子,大家都用的动规.时间复杂度由O(2^n) -> O(n^2) - -``` -class Solution(object): - def wordBreak(self, s, wordDict): - """ - :type s: str - :type wordDict: Set[str] - :rtype: bool - """ - dp = [False for i in range(1+len(s))] - dp[0] = True - for i in range(1,len(s)+1): - for k in range(i): - if dp[k] and s[k:i] in wordDict: - dp[i] = True - return dp[len(s)] -``` - -还是刷的不够多 - + ok = [True] + for i in range(1, len(s)+1): + ok += [any(ok[j] and s[j:i] in wordDict for j in range(i))] + return ok[-1] +``` + +但是往list里面加数据的方法有快有慢,下面是对比: +``` +>>> from timeit import timeit +>>> timeit('x.append(1)', 'x = []', number=10000000) +1.9880003412529277 +>>> timeit('x += 1,', 'x = []', number=10000000) +1.2676891852971721 +>>> timeit('x += [1]', 'x = []', number=10000000) +3.361207239950204 +``` +因此我们可以将代码直接换成下面的格式 +```python +ok += any(ok[j] and s[j:i] in wordDict for j in range(i)) +``` +但是这样会报错,TypeError: 'bool' object is not iterable,因此bool类型数据不能这样加,别的可以(list类型本身当然要注意哈) + +因此在这个例子中我们这样: +```python +class Solution(object): + def wordBreak(self, s, wordDict): + """ + :type s: str + :type wordDict: List[str] + :rtype: bool + """ + ok = [True] + for i in range(1, len(s)+1): + ok += any(ok[j] and s[j:i] in wordDict for j in range(i)), + return ok[-1] +``` +代码里面的那个逗号构建了一个tuple,也会快一点 From b2b52d2561d33de408603d286218a700023c5478 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 13:26:52 -0600 Subject: [PATCH 330/473] Update 139._word_break.md --- 139._word_break.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/139._word_break.md b/139._word_break.md index dbb29989a..c95c9a852 100644 --- a/139._word_break.md +++ b/139._word_break.md @@ -37,7 +37,7 @@ class Solution(object): ``` 因此我们可以将代码直接换成下面的格式 ```python -ok += any(ok[j] and s[j:i] in wordDict for j in range(i)) +ok += any(ok[j] and s[j:i] in wordDict for j in range(i)) # 会报错 ``` 但是这样会报错,TypeError: 'bool' object is not iterable,因此bool类型数据不能这样加,别的可以(list类型本身当然要注意哈) From 98cd16648dce5e4ed7e40d74dd105a78eee97838 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 14:58:16 -0600 Subject: [PATCH 331/473] Update 140._word_break_ii.md --- 140._word_break_ii.md | 78 ++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 42 deletions(-) diff --git a/140._word_break_ii.md b/140._word_break_ii.md index 2f48adf7b..d9504ebf2 100644 --- a/140._word_break_ii.md +++ b/140._word_break_ii.md @@ -1,5 +1,5 @@ -###140. Word Break II +### 140. Word Break II 题目: @@ -45,60 +45,30 @@ class Solution(object): 做法如下,聪明: 就是对于每一个s,我们来check它是否可以break,如果不可以,就不用做相应的操作了 - -举例 - -``` -s = "catsanddog" -传入wordBreakLst函数 - -首先check它是可以被分割的,于是开始分割 -stringLst = cat s[:i] = sanddog -继续传入s[:i] 进wordBreakLst again,还是可以分割,stringLst = ' cat sand' -继续 - -另外的是s[:i] = cats s[:i] = anddog -也是可以分割 - -画图就是类似这样 - - - catsanddog | | - cat cats - | | sand and - / \ - dog dog - -``` - - - 解法 -``` + +```python class Solution(object): def wordBreak(self, s, wordDict): """ :type s: str - :type wordDict: Set[str] - :rtype: bool + :type wordDict: List[str] + :rtype: List[str] """ self.res = [] - self.wordBreakLst(s,wordDict,"") + self.wordBreakLst(s, wordDict, '') return self.res def check(self, s, wordDict): - dp = [False for i in range(1+len(s))] - dp[0] = True - for i in range(1,len(s)+1): - for k in range(i): - if dp[k] and s[k:i] in wordDict: - dp[i] = True - return dp[len(s)] + ok = [True] + for i in range(1, len(s) + 1): + ok += any(ok[j] and s[j:i] in wordDict for j in range(i)), + return ok[-1] def wordBreakLst(self, s, wordDict, stringLst): - if self.check(s,wordDict): - if len(s) == 0 : self.res.append(stringLst[1:]) + if self.check(s, wordDict): + if len(s) == 0 : self.res.append(stringLst[1:]) # 因为最开始也加了一个空格 for i in range(1,len(s)+1): if s[:i] in wordDict: self.wordBreakLst(s[i:], wordDict, stringLst + ' ' + s[:i]) @@ -117,3 +87,27 @@ s = "aabbb" wordDict = ["a","abbb"] 就会极其的减少loop次数 ``` + + +看看stefan大神的做法: + +```sentences(i)``` returns a list of all sentences that can be built from the suffix ```s[i:]```. + +```python +class Solution(object): + def wordBreak(self, s, wordDict): + """ + :type s: str + :type wordDict: List[str] + :rtype: List[str] + """ + memo = {len(s): ['']} + def sentences(i): + if i not in memo: + memo[i] = [s[i:j] + (tail and ' ' + tail) + for j in range(i+1, len(s)+1) + if s[i:j] in wordDict + for tail in sentences(j)] + return memo[i] + return sentences(0) +``` From 4b6287b9c9802977fcc224932dff9cffb35c4852 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 14:58:43 -0600 Subject: [PATCH 332/473] Update 140._word_break_ii.md --- 140._word_break_ii.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/140._word_break_ii.md b/140._word_break_ii.md index d9504ebf2..6333bf8fe 100644 --- a/140._word_break_ii.md +++ b/140._word_break_ii.md @@ -14,8 +14,8 @@ Medium 还是backtracking,会超时 ``` -class Solution(object): - def wordBreak(self, s, wordDict): +class Solution(object): # 此法超时 +    def wordBreak(self, s, wordDict): """ :type s: str :type wordDict: Set[str] From f431b2e636e7eba9f21e6a816adf802af5dabc53 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 14:59:51 -0600 Subject: [PATCH 333/473] Update 139._word_break.md --- 139._word_break.md | 1 + 1 file changed, 1 insertion(+) diff --git a/139._word_break.md b/139._word_break.md index c95c9a852..815737dec 100644 --- a/139._word_break.md +++ b/139._word_break.md @@ -10,6 +10,7 @@ Medium +```ok[i]``` tells whether ```s[:i]``` can be built. ```python class Solution(object): From 28ddabe41dd1d95236b833b6315fa578677d284b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 15:58:51 -0600 Subject: [PATCH 334/473] Update 054._spiral_matrix.md --- 054._spiral_matrix.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/054._spiral_matrix.md b/054._spiral_matrix.md index 15c9d97f2..8d48ba47d 100644 --- a/054._spiral_matrix.md +++ b/054._spiral_matrix.md @@ -1,4 +1,4 @@ -###54. Spiral Matrix +### 54. Spiral Matrix 题目: @@ -117,4 +117,19 @@ class Solution(object): ``` -明显别人的代码写的更精妙,因为这里两个boundary都很明确,所以用for in range就能很好的解决问题了. \ No newline at end of file +明显别人的代码写的更精妙,因为这里两个boundary都很明确,所以用for in range就能很好的解决问题了. + + + +最后放一个无敌一行,怕你看完不想看上面的代码了 +```python +class Solution(object): + def spiralOrder(self, matrix): + """ + :type matrix: List[List[int]] + :rtype: List[int] + """ + return matrix and list(matrix.pop(0)) + self.spiralOrder(zip(*matrix)[::-1]) +``` + +oh, my god! From e4db3240911988ba5a28816fe93c8784fab660ed Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 15:59:27 -0600 Subject: [PATCH 335/473] Update 054._spiral_matrix.md --- 054._spiral_matrix.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/054._spiral_matrix.md b/054._spiral_matrix.md index 8d48ba47d..ca2219ec1 100644 --- a/054._spiral_matrix.md +++ b/054._spiral_matrix.md @@ -17,7 +17,7 @@ Medium -``` +```python class Solution(object): def spiralOrder(self, matrix): """ @@ -54,7 +54,7 @@ class Solution(object): 以上的写法非常精妙,看看我自己用同样的思路写的|||| -``` +```python class Solution(object): def spiralOrder(self, matrix): """ @@ -121,6 +121,10 @@ class Solution(object): + + +----------- + 最后放一个无敌一行,怕你看完不想看上面的代码了 ```python class Solution(object): From 7c1397218b0bd322847edbd590e9fca2b1e00cf0 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 17:17:58 -0600 Subject: [PATCH 336/473] Update 059._spiral_matrix_ii.md --- 059._spiral_matrix_ii.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/059._spiral_matrix_ii.md b/059._spiral_matrix_ii.md index 319314846..bfd67bbbb 100644 --- a/059._spiral_matrix_ii.md +++ b/059._spiral_matrix_ii.md @@ -1,4 +1,4 @@ -###59. Spiral Matrix II +### 59. Spiral Matrix II 题目: @@ -48,4 +48,20 @@ class Solution(object): if curNum >= n*n: return matrix direction = (direction + 1 ) % 4 -``` \ No newline at end of file +``` + +Same idea with [spiral matrix I](https://github.com/Lisanaaa/thinking_in_lc/blob/master/054._spiral_matrix.md) +```python +class Solution(object): + def generateMatrix(self, n): + """ + :type n: int + :rtype: List[List[int]] + """ + res = [] + l = n * n + 1 + while l > 1: + l, r = l - len(res), l + res = [range(l, r)] + zip(*res) + return res +``` From f9ee054a42ccd0944e30b127b1009787b7dbc75e Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 17:18:10 -0600 Subject: [PATCH 337/473] Update 059._spiral_matrix_ii.md --- 059._spiral_matrix_ii.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/059._spiral_matrix_ii.md b/059._spiral_matrix_ii.md index bfd67bbbb..3500e4acf 100644 --- a/059._spiral_matrix_ii.md +++ b/059._spiral_matrix_ii.md @@ -12,7 +12,7 @@ Medium 也许还有待挖掘trick -``` +```python class Solution(object): def generateMatrix(self,n): """ From 50fc95a1a020f9e0d131b4637f66aa06d8a65e85 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 17:19:31 -0600 Subject: [PATCH 338/473] Update 059._spiral_matrix_ii.md --- 059._spiral_matrix_ii.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/059._spiral_matrix_ii.md b/059._spiral_matrix_ii.md index 3500e4acf..42ae52662 100644 --- a/059._spiral_matrix_ii.md +++ b/059._spiral_matrix_ii.md @@ -62,6 +62,6 @@ class Solution(object): l = n * n + 1 while l > 1: l, r = l - len(res), l - res = [range(l, r)] + zip(*res) + res = [range(l, r)] + zip(*res[::-1]) return res ``` From 37c528de8220a82c12327d32d2425448ae13feff Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 22:53:51 -0600 Subject: [PATCH 339/473] Update 200._number_of_islands.md --- 200._number_of_islands.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/200._number_of_islands.md b/200._number_of_islands.md index eef73b54e..73c5aecf4 100644 --- a/200._number_of_islands.md +++ b/200._number_of_islands.md @@ -1,4 +1,4 @@ -###200. Number of Islands +### 200. Number of Islands 题目: @@ -111,3 +111,20 @@ class Solution(object): return count ``` +厉害的解法:Sink and count the islands. +```python +class Solution(object): + def numIslands(self, grid): + """ + :type grid: List[List[str]] + :rtype: int + """ + def sink(i, j): + if 0 <= i < len(grid) and 0 <= j < len(grid[0]) and grid[i][j] == '1': + grid[i][j] = '0' + map(sink, (i+1, i-1, i, i), (j, j, j+1, j-1)) + return 1 + return 0 + return sum(sink(i, j) for i in range(len(grid)) for j in range(len(grid[0]))) +``` + From bf936ed09bccdb5395e7451fc5a964bf757a62ea Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Thu, 11 Jan 2018 23:59:52 -0600 Subject: [PATCH 340/473] Update 162._find_peak_element.md --- 162._find_peak_element.md | 40 ++++++++++++++++----------------------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/162._find_peak_element.md b/162._find_peak_element.md index 6c7517530..2aad9b1c8 100644 --- a/162._find_peak_element.md +++ b/162._find_peak_element.md @@ -1,4 +1,4 @@ -###162. Find Peak Element +### 162. Find Peak Element 题目: @@ -13,57 +13,49 @@ Medium 最直观的是O(N)解法 -``` +```python class Solution(object): def findPeakElement(self, nums): """ :type nums: List[int] :rtype: int """ - n = len(nums) - if n == 1: - return 0 - if nums[0] > nums[1]: - return 0 - elif nums[n-1] > nums[n-2]: - return n-1 - for i in range(1,n-1): - if nums[i] > nums[i-1] and nums[i] > nums[i+1]: - return i + for i in range(1, len(nums)): + if nums[i] < nums[i-1]: + return i-1 + return len(nums) - 1 ``` O(lgN) 解法 这是一个经典题目 -- a[n/2] < a[n/2-1] only look at the left side -- a[n/2] < a[n/2+1] only look at the right side +- a[mid] < a[mid] only look at the left side +- a[mid] < a[mid] only look at the right side - else peak found -证明就是用反正法,或者看peak,因为这里已经限制了num[i] ≠ num[i+1],所以peak element 一定存在。然后a[n/2] < a[n/2-1],那么说明这里一定是下降的,说明之前一定有一个peak存在,否则我们可以用反证法证明. +证明就是用反证法,或者看peak,因为这里已经限制了num[i] ≠ num[i+1],所以peak element 一定存在。然后a[mid] < a[mid-1],那么说明这里一定是下降的,说明之前一定有一个peak存在,否则我们可以用反证法证明. -写到这里,我非常相信就是binary search能写对其实不容易。注意附加条件mid > l 和mid < r,这是针对mid+1和mid-1需要附加的,否则不容易对。 +写到这里,我非常相信就是binary search能写对其实不容易。 AC代码 -``` +```python class Solution(object): def findPeakElement(self, nums): """ :type nums: List[int] :rtype: int """ - l,r = 0, len(nums) - 1 + l, r = 0, len(nums) - 1 while l <= r: if l == r : return l - mid = (l+r)/2 - if mid > l and nums[mid] < nums[mid-1]: - r = mid - 1 - elif mid < r and nums[mid] < nums[mid+1]: + mid = l + ((r - l) >> 2) + if nums[mid] < nums[mid+1]: l = mid + 1 else: - return mid - + r = mid ``` + From 11b691549d2497797f7f6699da849351ce9b312f Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 12 Jan 2018 09:43:43 -0600 Subject: [PATCH 341/473] Update 228._summary_ranges.md --- 228._summary_ranges.md | 96 +++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 53 deletions(-) diff --git a/228._summary_ranges.md b/228._summary_ranges.md index 95e8d2faf..9276298ff 100644 --- a/228._summary_ranges.md +++ b/228._summary_ranges.md @@ -1,59 +1,49 @@ -###228. Summary Ranges - -题目: - - - -难度: - -Medium - - -用一个head和headIdx来记录当前consecutive的开始,一旦不再consecutive,push it in - - -然后应该可以把代码写的更简单 - -``` +### 228. Summary Ranges + +题目: + + + +难度: + +Medium + + +Just collect the ranges, then format and return them. + +```python class Solution(object): def summaryRanges(self, nums): """ :type nums: List[int] :rtype: List[str] """ - if nums == []: - return [] - tmp = [] - tmpl = [] - - - head = nums[0] - headIdx = 0 - - tmpl = [head] - - for i in range(1,len(nums)): - #not consective anymore - if nums[i] != head + i - headIdx : - tmp.append(tmpl) - head = nums[i] - headIdx = i - tmpl = [] - tmpl.append(head) - #consective nums - else: - tmpl.append(nums[i]) - #push the last sequence in - tmp.append(tmpl) - - - res = [] - for t in tmp: - if len(t) == 1: - res.append(str(t[0])) - else: - res.append(str(t[0])+"->" +str(t[-1])) - return res - - -``` + ranges = [] + for i in nums: + if not ranges or i > ranges[-1][-1] + 1: + ranges += [], + ranges[-1][1:] = i, + return ['->'.join(map(str, r)) for r in ranges] +``` +About the commas :-) + +``` +ranges += [], +r[1:] = n, +``` +Why the trailing commas? Because it turns the right hand side into a tuple and I get the same effects as these more common alternatives: +``` +ranges += [[]] +or +ranges.append([]) + +r[1:] = [n] +``` +Without the comma, … + +- ranges += [] wouldn’t add [] itself but only its elements, i.e., nothing. +- r[1:] = n wouldn’t work, because my n is not an iterable. + +Why do it this way instead of the more common alternatives I showed above? Because it’s shorter and faster (according to tests I did a while back). + +参考[stefan](https://leetcode.com/problems/summary-ranges/discuss/63193) From 00507ae2505f8eeaee095e5da17f0a9c7e635604 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 12 Jan 2018 10:35:42 -0600 Subject: [PATCH 342/473] Update 228._summary_ranges.md --- 228._summary_ranges.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/228._summary_ranges.md b/228._summary_ranges.md index 9276298ff..ce9dce0f9 100644 --- a/228._summary_ranges.md +++ b/228._summary_ranges.md @@ -46,4 +46,13 @@ Without the comma, … Why do it this way instead of the more common alternatives I showed above? Because it’s shorter and faster (according to tests I did a while back). +写到这里可能又有疑问了🤔️,为什么不可以直接写```ranges[-1][1] = i```呢,当然是会报```IndexError: list assignment index out of range```错误啦,那为什么```ranges[-1][1:] = i,```可以呢? + +简单来说 + +L1=L 与 L1=L[:] +- L1和L 都是对同一个对象的引用(所谓绑定的意思)。 +- L[:] 是生成了一个和L不同的新的对象,L1 变为了L[:] 这个对象的引用。 + + 参考[stefan](https://leetcode.com/problems/summary-ranges/discuss/63193) From edbc003452f5fc5ae8ac692a156ed686ce05ab40 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 12 Jan 2018 10:37:50 -0600 Subject: [PATCH 343/473] Update 279._perfect_squares.md --- 279._perfect_squares.md | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/279._perfect_squares.md b/279._perfect_squares.md index 7fd6c3143..d772f9f39 100644 --- a/279._perfect_squares.md +++ b/279._perfect_squares.md @@ -1,5 +1,5 @@ -###279. Perfect Squares +### 279. Perfect Squares 题目: @@ -11,35 +11,27 @@ Medium -状态转移方程 +DP, 状态转移方程: -思路一: -dp[i] = min(dp[j] + dp[i-j], dp[i]) -会超时 +```dp[i] = min(dp[i], dp[i - j * j] + 1)``` -思路二: -dp[i + j * j] = min(dp[i] + 1, dp[i + j * j]) -已经不能更好了,但是因为Python的特性,依旧超时 - -``` +```python class Solution(object): def numSquares(self, n): """ :type n: int :rtype: int """ - dp = [ n+1 for i in range(1+n)] - dp[0] = 0 - - for i in range(n): - j = 0 - while (i + j * j <= n) : - dp[ i + j * j ] = min(dp[ i + j * j], dp[i] + 1) - j += 1 - - return dp[n] + dp = [0] * (n+1) + for i in range(n+1): + dp[i] = i + j = 1 + while j * j <= i: + dp[i] = min(dp[i], dp[i-j*j] + 1) + j += 1 + return dp[-1] ``` From f83e02e5817aaa716987a9b0193bab413c25f87c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 12 Jan 2018 10:49:50 -0600 Subject: [PATCH 344/473] Update 279._perfect_squares.md --- 279._perfect_squares.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/279._perfect_squares.md b/279._perfect_squares.md index d772f9f39..1550e02b2 100644 --- a/279._perfect_squares.md +++ b/279._perfect_squares.md @@ -10,7 +10,7 @@ Medium - +### 思路一: DP, 状态转移方程: ```dp[i] = min(dp[i], dp[i - j * j] + 1)``` @@ -35,3 +35,29 @@ class Solution(object): return dp[-1] ``` +但是这个方法贼慢,有时候提交甚至会超时,有时候又不会。。。。因此想别的办法 + +### 思路二: + +Static DP + +```python +class Solution(object): + def numSquares(self, n): + """ + :type n: int + :rtype: int + """ + dp = [0] + while len(dp) <= n: + m = len(dp) + inf = float('inf') + i = 1 + while i * i <= m: + inf = min(inf, dp[m-i*i] + 1) + i += 1 + dp.append(inf) + return dp[-1] +``` + + From e701c77e28c2b58a6920480ffc4f77a4f374a212 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 12 Jan 2018 12:56:49 -0600 Subject: [PATCH 345/473] Update 279._perfect_squares.md --- 279._perfect_squares.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/279._perfect_squares.md b/279._perfect_squares.md index 1550e02b2..78efe42a6 100644 --- a/279._perfect_squares.md +++ b/279._perfect_squares.md @@ -59,5 +59,35 @@ class Solution(object): dp.append(inf) return dp[-1] ``` +还是慢,有个数学方法, runtime beats 98.48% +```python +import math +class Solution(object): + def numSquares(self, n): + """ + :type n: int + :rtype: int + """ + def isSquare(num): + tmp = int(math.sqrt(num)) + return tmp * tmp == num + while n & 3 == 0: # n % 4 == 0 + n >>= 2 + if n & 7 == 7: # n % 8 == 7 + return 4 + if isSquare(n): + return 1 + sqrt_n = int(math.sqrt(n)) + for i in range(1, sqrt_n + 1): + if isSquare(n-i*i): + return 2 + return 3 +``` +in order to understand, I suggest u read: + +here is the 【[Lagrange's Four Square theorem](https://en.wikipedia.org/wiki/Lagrange%27s_four-square_theorem +) - Limit the result to <= 4: + +And this [article](http://www.alpertron.com.ar/4SQUARES.HTM), in which you can also find the way to present a number as a sum of four squares: From 008a30561c55510eb5dcc309192b3b36530b9951 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 12 Jan 2018 12:57:06 -0600 Subject: [PATCH 346/473] Update 279._perfect_squares.md --- 279._perfect_squares.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/279._perfect_squares.md b/279._perfect_squares.md index 78efe42a6..e2927cb26 100644 --- a/279._perfect_squares.md +++ b/279._perfect_squares.md @@ -85,7 +85,7 @@ class Solution(object): ``` in order to understand, I suggest u read: -here is the 【[Lagrange's Four Square theorem](https://en.wikipedia.org/wiki/Lagrange%27s_four-square_theorem +here is the [Lagrange's Four Square theorem](https://en.wikipedia.org/wiki/Lagrange%27s_four-square_theorem ) - Limit the result to <= 4: And this [article](http://www.alpertron.com.ar/4SQUARES.HTM), in which you can also find the way to present a number as a sum of four squares: From b58eb99fd38175e8ea231aee9017967b690d5cc0 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 12 Jan 2018 13:03:40 -0600 Subject: [PATCH 347/473] Update 279._perfect_squares.md --- 279._perfect_squares.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/279._perfect_squares.md b/279._perfect_squares.md index e2927cb26..a6daecc2d 100644 --- a/279._perfect_squares.md +++ b/279._perfect_squares.md @@ -59,6 +59,9 @@ class Solution(object): dp.append(inf) return dp[-1] ``` + +### 思路三: + 还是慢,有个数学方法, runtime beats 98.48% ```python import math From 4ae09b3f5d5a2063a028fc1c98b5fe76bd6ad42d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 12 Jan 2018 22:24:49 -0600 Subject: [PATCH 348/473] Create 421.Maximum_XOR_of_Two_Numbers_in_an_Array.md --- 421.Maximum_XOR_of_Two_Numbers_in_an_Array.md | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 421.Maximum_XOR_of_Two_Numbers_in_an_Array.md diff --git a/421.Maximum_XOR_of_Two_Numbers_in_an_Array.md b/421.Maximum_XOR_of_Two_Numbers_in_an_Array.md new file mode 100644 index 000000000..c70d18884 --- /dev/null +++ b/421.Maximum_XOR_of_Two_Numbers_in_an_Array.md @@ -0,0 +1,54 @@ +### 421. Maximum XOR of Two Numbers in an Array + +题目: + + + +难度: + +Medium + +题目要求O(N)时间 + +看了半天的解法居然超时, +```python +class Solution(object): + def findMaximumXOR(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + '''The maxResult is a record of the largest XOR we got so far. if it's 11100 at i = 2, it means + before we reach the last two bits, 11100 is the biggest XOR we have, and we're going to explore + whether we can get another two '1's and put them into maxResult''' + max_res, mask = 0, 0 + + '''This is a greedy part, since we're looking for the largest XOR, we start + from the very begining, aka, the 31st postition of bits.''' + for i in range(32)[::-1]: + + '''The mask will grow like 100..000 , 110..000, 111..000, then 1111...111 + for each iteration, we only care about the left parts''' + mask |= (1 << i) + tmp = [] + for num in nums: + '''we only care about the left parts, for example, if i = 2, then we have + {1100, 1000, 0100, 0000} from {1110, 1011, 0111, 0010}''' + tmp.append(num & mask) + + '''if i = 1 and before this iteration, the maxResult we have now is 1100, + my wish is the maxResult will grow to 1110, so I will try to find a candidate + which can give me the greedyTry;''' + greedy_try = max_res | (1 << i) + + for i in tmp: + '''This is the most tricky part, coming from a fact that if a ^ b = c, then a ^ c = b; + now we have the 'c', which is greedyTry, and we have the 'a', which is leftPartOfNum + If we hope the formula a ^ b = c to be valid, then we need the b, + and to get b, we need a ^ c, if a ^ c exisited in our set, then we're good to go''' + if i ^ greedy_try in tmp: + max_res = greedy_try + '''If unfortunately, we didn't get the greedyTry, we still have our max, + So after this iteration, the max will stay at 1100.''' + return max_res +``` From 567c8917aecac3aec743c4b58eb760a28d0799a5 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 12 Jan 2018 22:25:41 -0600 Subject: [PATCH 349/473] Update and rename 421.Maximum_XOR_of_Two_Numbers_in_an_Array.md to 421._Maximum_XOR_of_Two_Numbers_in_an_Array.md --- ....md => 421._Maximum_XOR_of_Two_Numbers_in_an_Array.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) rename 421.Maximum_XOR_of_Two_Numbers_in_an_Array.md => 421._Maximum_XOR_of_Two_Numbers_in_an_Array.md (95%) diff --git a/421.Maximum_XOR_of_Two_Numbers_in_an_Array.md b/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md similarity index 95% rename from 421.Maximum_XOR_of_Two_Numbers_in_an_Array.md rename to 421._Maximum_XOR_of_Two_Numbers_in_an_Array.md index c70d18884..b8732f4db 100644 --- a/421.Maximum_XOR_of_Two_Numbers_in_an_Array.md +++ b/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md @@ -11,9 +11,9 @@ Medium 题目要求O(N)时间 看了半天的解法居然超时, -```python -class Solution(object): - def findMaximumXOR(self, nums): +``` +class Solution(object): # 此法超时 +    def findMaximumXOR(self, nums): """ :type nums: List[int] :rtype: int @@ -52,3 +52,6 @@ class Solution(object): So after this iteration, the max will stay at 1100.''' return max_res ``` + + +只好想别的办法 From 38c0d4bd913b491d5ccbc0877dd8a5841d1e7fb8 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Fri, 12 Jan 2018 22:42:23 -0600 Subject: [PATCH 350/473] Update 421._Maximum_XOR_of_Two_Numbers_in_an_Array.md --- ..._Maximum_XOR_of_Two_Numbers_in_an_Array.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md b/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md index b8732f4db..b0697b2a6 100644 --- a/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md +++ b/421._Maximum_XOR_of_Two_Numbers_in_an_Array.md @@ -11,7 +11,7 @@ Medium 题目要求O(N)时间 看了半天的解法居然超时, -``` +```python class Solution(object): # 此法超时    def findMaximumXOR(self, nums): """ @@ -55,3 +55,20 @@ class Solution(object): # 此法超时 只好想别的办法 + + +参考[stefan](https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/discuss/91050?page=3) +```python +class Solution(object): + def findMaximumXOR(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + answer = 0 + for i in range(32)[::-1]: + answer <<= 1 + prefixes = {num >> i for num in nums} + answer += any(answer^1 ^ p in prefixes for p in prefixes) + return answer +``` From a39766f3802d5c20e9da00591b0a50a8cd35c63c Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 13 Jan 2018 01:15:20 -0600 Subject: [PATCH 351/473] Update 289._game_of_life.md --- 289._game_of_life.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/289._game_of_life.md b/289._game_of_life.md index 059a98caa..097ffc3ed 100644 --- a/289._game_of_life.md +++ b/289._game_of_life.md @@ -1,4 +1,4 @@ -###289. Game of Life +### 289. Game of Life 题目: @@ -17,7 +17,7 @@ AC的效率还ok: -``` +```python class Solution(object): def gameOfLife(self, board): """ @@ -74,7 +74,7 @@ class Solution(object): 我们可以使用状态机转换 o(╯□╰)o 感觉不知道在听什么 还是很迷茫的感觉, in-place AC代码 -``` +```python class Solution(object): def gameOfLife(self, board): """ From acf6e1bdf20a93ea065240374e20cdf745907bd5 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 13 Jan 2018 01:34:02 -0600 Subject: [PATCH 352/473] Update 341. Flatten Nested List Iterator.md --- 341. Flatten Nested List Iterator.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/341. Flatten Nested List Iterator.md b/341. Flatten Nested List Iterator.md index 14c4f8737..2acc186f5 100644 --- a/341. Flatten Nested List Iterator.md +++ b/341. Flatten Nested List Iterator.md @@ -10,13 +10,9 @@ 难度: Medium -思路: -懒就一个字,您的AC代码击败了全国0.34%的Python用户,AC代码效率这么低,也是厉害。 -AC代码: - -``` +```python class NestedIterator(object): def __init__(self, nestedList): From ea6ccbf0c46603ed181b0383ed2511f0b72b07b8 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 13 Jan 2018 01:34:22 -0600 Subject: [PATCH 353/473] Rename 341. Flatten Nested List Iterator.md to 341._Flatten_Nested_List_Iterator.md --- ...ested List Iterator.md => 341._Flatten_Nested_List_Iterator.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 341. Flatten Nested List Iterator.md => 341._Flatten_Nested_List_Iterator.md (100%) diff --git a/341. Flatten Nested List Iterator.md b/341._Flatten_Nested_List_Iterator.md similarity index 100% rename from 341. Flatten Nested List Iterator.md rename to 341._Flatten_Nested_List_Iterator.md From 8d471ad2c30c591925d24082a8565c4b32b06faa Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 13 Jan 2018 03:34:48 -0600 Subject: [PATCH 354/473] Update 208._implement_trie_(prefix_tree).md --- 208._implement_trie_(prefix_tree).md | 172 +++++++++++++-------------- 1 file changed, 86 insertions(+), 86 deletions(-) diff --git a/208._implement_trie_(prefix_tree).md b/208._implement_trie_(prefix_tree).md index 39707fe83..1a442748c 100644 --- a/208._implement_trie_(prefix_tree).md +++ b/208._implement_trie_(prefix_tree).md @@ -1,87 +1,87 @@ -###208. Implement Trie (Prefix Tree) - -题目: - - - - -难度: - -Medium - -这个Python实现也太精美了吧,谷歌复写之 - -然后还unlock了一个solution,to read - -Trie整个都需要 to read,精美,可爱😊 - - - - +### 208. Implement Trie (Prefix Tree) + +题目: + + + + +难度: + +Medium + +这个Python实现也太精美了吧,谷歌复写之 + +然后还unlock了一个solution,to read + +Trie整个都需要 to read,精美,可爱😊 + + + + +```python +class TrieNode(object): + def __init__(self): + """ + Initialize your data structure here. + """ + self.childs = dict() + self.isWord = False + + + +class Trie(object): + + def __init__(self): + self.root = TrieNode() + + def insert(self, word): + """ + Inserts a word into the trie. + :type word: str + :rtype: void + """ + node = self.root + for letter in word: + child = node.childs.get(letter) + if child is None: + child = TrieNode() + node.childs[letter] = child + node = child + node.isWord = True + + def search(self, word): + """ + Returns if the word is in the trie. + :type word: str + :rtype: bool + """ + node = self.root + for letter in word: + node = node.childs.get(letter) + if node is None: + return False + return node.isWord + + + def startsWith(self, prefix): + """ + Returns if there is any word in the trie + that starts with the given prefix. + :type prefix: str + :rtype: bool + """ + node = self.root + for letter in prefix: + node = node.childs.get(letter) + if node is None: + return False + return True + + +# Your Trie object will be instantiated and called as such: +# trie = Trie() +# trie.insert("somestring") +# trie.search("key") + ``` -class TrieNode(object): - def __init__(self): - """ - Initialize your data structure here. - """ - self.childs = dict() - self.isWord = False - - - -class Trie(object): - - def __init__(self): - self.root = TrieNode() - - def insert(self, word): - """ - Inserts a word into the trie. - :type word: str - :rtype: void - """ - node = self.root - for letter in word: - child = node.childs.get(letter) - if child is None: - child = TrieNode() - node.childs[letter] = child - node = child - node.isWord = True - - def search(self, word): - """ - Returns if the word is in the trie. - :type word: str - :rtype: bool - """ - node = self.root - for letter in word: - node = node.childs.get(letter) - if node is None: - return False - return node.isWord - - - def startsWith(self, prefix): - """ - Returns if there is any word in the trie - that starts with the given prefix. - :type prefix: str - :rtype: bool - """ - node = self.root - for letter in prefix: - node = node.childs.get(letter) - if node is None: - return False - return True - - -# Your Trie object will be instantiated and called as such: -# trie = Trie() -# trie.insert("somestring") -# trie.search("key") - -``` - + From 3324fdb38a0b013e6fb76a708291f5b37ab1a50d Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 13 Jan 2018 03:47:36 -0600 Subject: [PATCH 355/473] Create 166._ --- 166._ | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 166._ diff --git a/166._ b/166._ new file mode 100644 index 000000000..d4285fe4b --- /dev/null +++ b/166._ @@ -0,0 +1,42 @@ +### 166. Fraction to Recurring Decimal + +题目: + + + +难度: + +Medium + + + + +```python +class Solution: + # @return a string + def fractionToDecimal(self, n, d): + res = '' + if n == 0: # zero numerator + return str(n) + if (n < 0) ^ (d < 0): # determine the sign + res += '-' + n = abs(n) # remove sign of operands + d = abs(d) + res += str(n / d) # append integral part + if (n % d == 0): # in case no fractional part + return res + res += '.' + r = n % d + m = {} + while r: # simulate the division process + if r in m: # meet a known remainder + res = res[:m[r]] + '(' + res[m[r]:] + ')' # so we reach the end of the repeating part + break + m[r] = len(res) # if the remainder is first seen, remember the current position for it + r *= 10 + res += str(r / d) # append the quotient digit + r %= d + return res +``` + + From 6cf5260e80f2b1d4416e2e85f04b83fff5b02592 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 13 Jan 2018 03:48:22 -0600 Subject: [PATCH 356/473] Rename 166._ to 166._Fraction_to_Recurring_Decimal.md --- 166._ => 166._Fraction_to_Recurring_Decimal.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 166._ => 166._Fraction_to_Recurring_Decimal.md (100%) diff --git a/166._ b/166._Fraction_to_Recurring_Decimal.md similarity index 100% rename from 166._ rename to 166._Fraction_to_Recurring_Decimal.md From b4caab82fd61b317982d44e2433f9d75a0e509bd Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 13 Jan 2018 04:09:43 -0600 Subject: [PATCH 357/473] Create 406._Queue_Reconstruction_by_Height.md --- 406._Queue_Reconstruction_by_Height.md | 45 ++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 406._Queue_Reconstruction_by_Height.md diff --git a/406._Queue_Reconstruction_by_Height.md b/406._Queue_Reconstruction_by_Height.md new file mode 100644 index 000000000..49ae597e4 --- /dev/null +++ b/406._Queue_Reconstruction_by_Height.md @@ -0,0 +1,45 @@ +### 406. Queue Reconstruction by Height + +题目: + + + +难度: + +Medium + + +思路: +People are only counting (in their k-value) taller or equal-height others standing in front of them. +So a smallest person is completely irrelevant for all taller ones. And of all smallest people, +the one standing most in the back is even completely irrelevant for everybody else. Nobody is counting that person. +So we can first arrange everybody else, ignoring that one person. And then just insert that person appropriately. +Now note that while this person is irrelevant for everybody else, everybody else is relevant for this person - +this person counts exactly everybody in front of them. So their count-value tells you exactly the index they must be standing. + +So you can first solve the sub-problem with all but that one person and then just insert that person appropriately. +And you can solve that sub-problem the same way, first solving the sub-sub-problem with all +but the last-smallest person of the subproblem. And so on. The base case is when you have the sub-…-sub-problem of zero people. +You’re then inserting the people in the reverse order, i.e., that overall last-smallest person in the very end +and thus the first-tallest person in the very beginning. That’s what the above solution does, +Sorting the people from the first-tallest to the last-smallest, and inserting them one by one as appropriate. + +参考[stfan](https://leetcode.com/problems/queue-reconstruction-by-height/discuss/89359) + +```python +class Solution(object): + def twoSum(self, nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: List[int] + """ + lookup = {} + for i, num in enumerate(nums): + if target - num in lookup: + return [lookup[target - num],i] + lookup[num] = i + return [] +``` + + From 0e885520d81794b4dd869b5492a4e0f6d827af5a Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 13 Jan 2018 04:10:26 -0600 Subject: [PATCH 358/473] Update 406._Queue_Reconstruction_by_Height.md --- 406._Queue_Reconstruction_by_Height.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/406._Queue_Reconstruction_by_Height.md b/406._Queue_Reconstruction_by_Height.md index 49ae597e4..87e551963 100644 --- a/406._Queue_Reconstruction_by_Height.md +++ b/406._Queue_Reconstruction_by_Height.md @@ -24,22 +24,20 @@ You’re then inserting the people in the reverse order, i.e., that overall last and thus the first-tallest person in the very beginning. That’s what the above solution does, Sorting the people from the first-tallest to the last-smallest, and inserting them one by one as appropriate. -参考[stfan](https://leetcode.com/problems/queue-reconstruction-by-height/discuss/89359) +参考[stefan](https://leetcode.com/problems/queue-reconstruction-by-height/discuss/89359) ```python class Solution(object): - def twoSum(self, nums, target): + def reconstructQueue(self, people): """ - :type nums: List[int] - :type target: int - :rtype: List[int] + :type people: List[List[int]] + :rtype: List[List[int]] """ - lookup = {} - for i, num in enumerate(nums): - if target - num in lookup: - return [lookup[target - num],i] - lookup[num] = i - return [] + people.sort(key=lambda (h, k): (-h, k)) + queue = [] + for p in people: + queue.insert(p[1], p) + return queue ``` From 04b2a2661d83cacef20eeee923a52065230ac3cc Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 13 Jan 2018 20:51:41 -0600 Subject: [PATCH 359/473] Update 023._merge_k_sorted_lists.md --- 023._merge_k_sorted_lists.md | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/023._merge_k_sorted_lists.md b/023._merge_k_sorted_lists.md index 10fd0a3b8..9cd97355c 100644 --- a/023._merge_k_sorted_lists.md +++ b/023._merge_k_sorted_lists.md @@ -1,4 +1,4 @@ -###23. Merge k Sorted Lists +### 23. Merge k Sorted Lists @@ -11,7 +11,7 @@ Hard 思路: -看到思路有heap,similar question有ugly number|| -》 这个是用heapq来解决的 +看到思路有heap,similar question有ugly number|| -> 这个是用heapq来解决的 那么就用heap吧? heapsort @@ -20,7 +20,7 @@ Hard 写到这里瞬间明白和ugly number ii像的点了,甚至感觉跟find in sorted matrix ii也像 -``` +```python class Solution(object): def mergeKLists(self, lists): """ @@ -29,21 +29,18 @@ class Solution(object): """ import heapq h = [] - - for listhead in lists: - if listhead: - heapq.heappush(h, (listhead.val,listhead)) - + for lst_head in lists: + if lst_head: + heapq.heappush(h, (lst_head.val, lst_head)) cur = ListNode(-1) dummy = cur - while h: - smallestNode = heapq.heappop(h)[1] - cur.next = smallestNode + smallest_node = heapq.heappop(h)[1] + cur.next = smallest_node cur = cur.next - if smallestNode.next: - heapq.heappush(h, (smallestNode.next.val,smallestNode.next)) + if smallest_node.next: + heapq.heappush(h, (smallest_node.next.val, smallest_node.next)) return dummy.next ``` -当然还像merge two sorted list \ No newline at end of file +当然还像merge two sorted list From 7a6e3b9dd2d7a83cd8a8231415be55b38190043b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sat, 13 Jan 2018 21:28:43 -0600 Subject: [PATCH 360/473] Update 042._trapping_rain_water.md --- 042._trapping_rain_water.md | 37 +++++++++++++------------------------ 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/042._trapping_rain_water.md b/042._trapping_rain_water.md index 08d0dd0b7..15379369d 100644 --- a/042._trapping_rain_water.md +++ b/042._trapping_rain_water.md @@ -11,40 +11,29 @@ Hard 思路: -题目有几个特性可用,bar width = 1,然后第一个和最后一个是不能trap water,其次中间的部分能trap多少水是看`左右高度差教低的那个 - 本身的高度`,所以就是本身的比较高就不能trap water了,这种情况取0. +题目有几个特性可用,bar width = 1,然后第一个和最后一个是不能trap water,其次中间的部分能trap多少水是看`左右高度差较低的那个 - 本身的高度` +The basic idea is that we set two pointers ```l``` and ```r``` to the left and right end of ```height```. Then we get the minimum height (```min_height```) of these pointers (similar to Container with Most Water due to the Leaking Bucket Effect) since the level of the water cannot be higher than it. Then we move the two pointers towards the center. If the coming level is less than ```min_height```, then it will hold some water. Fill the water until we meet some “barrier” (with height larger than ```min_height```) and update ```l``` and ```r``` to repeat this process in a new interval. AC代码: -``` +```python class Solution(object): def trap(self, height): """ :type height: List[int] :rtype: int """ - if not height: return 0 - n = len(height) - - rightH = [0 for i in range(n)] - rightH[n-1] = height[n-1] - - for i in range(n-2,0,-1): - rightH[i] = max(rightH[i+1],height[i+1]) - # print rightH - - - leftH = [0 for i in range(n)] - leftH[0] = height[0] - for i in range(1,n): - leftH[i] = max(leftH[i-1],height[i-1]) - # print leftH - - water = 0 - for i in range(1,n-1): - water += max(0, min(leftH[i],rightH[i]) - height[i]) - print water + l, r, water, min_height = 0, len(height) - 1, 0, 0 + while l < r: + min_height = min(height[l], height[r]) + while l < r and height[l] <= min_height: + water += min_height - height[l] + l += 1 + while l < r and height[r] <= min_height: + water += min_height - height[r] + r -= 1 return water -``` \ No newline at end of file +``` From 7d00d9c60f8a2870b3a88d8a021844b096855168 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 14 Jan 2018 22:18:29 -0600 Subject: [PATCH 361/473] Update 042._trapping_rain_water.md --- 042._trapping_rain_water.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/042._trapping_rain_water.md b/042._trapping_rain_water.md index 15379369d..17e03b9ea 100644 --- a/042._trapping_rain_water.md +++ b/042._trapping_rain_water.md @@ -1,4 +1,4 @@ -###42. Trapping Rain Water +### 42. Trapping Rain Water From c64b212761df917367ddb4a52e0bf0e84ab74e04 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 14 Jan 2018 22:36:38 -0600 Subject: [PATCH 362/473] Create 128._Longest_Consecutive_Sequence.md --- 128._Longest_Consecutive_Sequence.md | 47 ++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 128._Longest_Consecutive_Sequence.md diff --git a/128._Longest_Consecutive_Sequence.md b/128._Longest_Consecutive_Sequence.md new file mode 100644 index 000000000..ea6a85c2f --- /dev/null +++ b/128._Longest_Consecutive_Sequence.md @@ -0,0 +1,47 @@ +### 1. Two Sum + +题目: + + + +难度: + +Hard + + +### 思路 +首先去重复,时间O(N),然后将所有元素都放到一个字典中,这样判断一个数字的后续在不在这个字典中,如果存在就一直判断下去,每次判断只要O(1)。 + +对于每个数,如果他的前续已经判断过了,他就没有必要判断了,继续判断下一个数,即: +``` +if num - 1 in nums: + continue +``` + + +AC代码: + +```python +class Solution(object): + def longestConsecutive(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + nums = set(nums) + tmp = {} + for num in nums: + tmp[num] = 1 + res = 0 + for num in nums: + if num - 1 not in nums: + y = num + 1 + while y in nums: + y += 1 + res = max(res, y - num) + return res +``` + + + + From ff696a2685fde5fe84297dbcda12ebf1d8982d23 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 14 Jan 2018 22:37:13 -0600 Subject: [PATCH 363/473] Update 128._Longest_Consecutive_Sequence.md --- 128._Longest_Consecutive_Sequence.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/128._Longest_Consecutive_Sequence.md b/128._Longest_Consecutive_Sequence.md index ea6a85c2f..23636c8e3 100644 --- a/128._Longest_Consecutive_Sequence.md +++ b/128._Longest_Consecutive_Sequence.md @@ -1,7 +1,7 @@ -### 1. Two Sum +### 128. Longest Consecutive Sequence 题目: - + 难度: From 07523aeff7822a998f27818b27cf41c90e951548 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Sun, 14 Jan 2018 22:48:35 -0600 Subject: [PATCH 364/473] Update 128._Longest_Consecutive_Sequence.md --- 128._Longest_Consecutive_Sequence.md | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/128._Longest_Consecutive_Sequence.md b/128._Longest_Consecutive_Sequence.md index 23636c8e3..53e57505e 100644 --- a/128._Longest_Consecutive_Sequence.md +++ b/128._Longest_Consecutive_Sequence.md @@ -10,7 +10,7 @@ Hard ### 思路 -首先去重复,时间O(N),然后将所有元素都放到一个字典中,这样判断一个数字的后续在不在这个字典中,如果存在就一直判断下去,每次判断只要O(1)。 +首先去重复,时间```O(N)```,然后将所有元素都放到一个字典中,这样判断一个数字的后续在不在这个字典中,如果存在就一直判断下去,每次判断只要```O(1)```。 对于每个数,如果他的前续已经判断过了,他就没有必要判断了,继续判断下一个数,即: ``` @@ -42,6 +42,29 @@ class Solution(object): return res ``` +但其实```set```和字典的```in```判断都是```O(1)``` +```dict```与```set```实现原理是一样的,都是将实际的值放到```list```中。唯一不同的在于hash函数操作的对象,对于```dict```,```hash```函数操作的是其```key```,而对于```set```是直接操作的它的元素,假设操作内容为```x```,其作为因变量,放入```hash```函数,通过运算后取```list```的余数,转化为一个```list```的下标,此下标位置对于```set```而言用来放其本身,而对于```dict```则是创建了两个```list```,一个```list```该下表放此```key```,另一个```list```中该下标方对应的```value```。参考[python dict与set 的实现](http://www.cnblogs.com/pengsixiong/p/5326893.html) +  其中,我们把实现set的方式叫做Hash Set,实现dict的方式叫做Hash Map/Table(注:map指的就是通过key来寻找value的过程) +```set```和```dict```的唯一区别仅在于没有存储对应的```value```,但是,```set```的原理和```dict```一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证```set```内部“不会有重复元素”。 + +因此,代码也可以写成这样 +```python +class Solution(object): + def longestConsecutive(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + nums = set(nums) + res = 0 + for num in nums: + if num - 1 not in nums: + y = num + 1 + while y in nums: + y += 1 + res = max(res, y - num) + return res +``` From c5eba16c709823041e2dfe41e7d25f6f34e31b8b Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 15 Jan 2018 11:12:45 -0600 Subject: [PATCH 365/473] =?UTF-8?q?Create=20python=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=85=AB=E5=A4=A7=E6=8E=92=E5=BA=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...53\345\244\247\346\216\222\345\272\217.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 "python\345\256\236\347\216\260\345\205\253\345\244\247\346\216\222\345\272\217.md" diff --git "a/python\345\256\236\347\216\260\345\205\253\345\244\247\346\216\222\345\272\217.md" "b/python\345\256\236\347\216\260\345\205\253\345\244\247\346\216\222\345\272\217.md" new file mode 100644 index 000000000..730fdef0f --- /dev/null +++ "b/python\345\256\236\347\216\260\345\205\253\345\244\247\346\216\222\345\272\217.md" @@ -0,0 +1,21 @@ +### 直接插入排序 + +直接插入排序的核心思想就是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。 +因此,从上面的描述中我们可以发现,直接插入排序可以用两个循环完成: + +1. 第一层循环:遍历待比较的所有数组元素 +2. 第二层循环:将本轮选择的元素(selected)与已经排好序的元素(ordered)相比较。 + - 如果```selected > ordered```,那么将二者交换 + +```python +#直接插入排序 +def insert_sort(L): + #遍历数组中的所有元素,其中0号索引元素默认已排序,因此从1开始 + for x in range(1,len(L)): + #将该元素与已排序好的前序数组依次比较,如果该元素小,则交换 + #range(x-1,-1,-1):从x-1倒序循环到0 + for i in range(x-1,-1,-1): + #判断:如果符合条件则交换 + if L[i] > L[i+1]: + L[i], L[i+1] = L[i+1], L[i] +``` From b017f4110ff87e6365281393df227618efbe7911 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 15 Jan 2018 11:36:51 -0600 Subject: [PATCH 366/473] =?UTF-8?q?Create=20=E5=85=AB=E5=A4=A7=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E7=AE=97=E6=B3=95=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\272\217\347\256\227\346\263\225\346\200\273\347\273\223.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.md" diff --git "a/images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.md" "b/images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.md" new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ "b/images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.md" @@ -0,0 +1 @@ + From 77382d522628b581ba3a05dc067378a7b8d850e1 Mon Sep 17 00:00:00 2001 From: KEQI HUANG Date: Mon, 15 Jan 2018 11:49:34 -0600 Subject: [PATCH 367/473] add some sort images --- .gitignore | 7 +++++++ ...47\350\203\275\346\257\224\350\276\203.png" | Bin 0 -> 316912 bytes ...227\346\263\225\346\200\273\347\273\223.md" | 1 - ...27\346\263\225\346\200\273\347\273\223.png" | Bin 0 -> 56719 bytes ...22\346\263\241\346\216\222\345\272\217.gif" | Bin 0 -> 106607 bytes ...72\346\225\260\346\216\222\345\272\217.gif" | Bin 0 -> 98897 bytes ...14\345\260\224\346\216\222\345\272\217.png" | Bin 0 -> 77786 bytes ...22\345\271\266\346\216\222\345\272\217.gif" | Bin 0 -> 154709 bytes ...53\351\200\237\346\216\222\345\272\217.gif" | Bin 0 -> 75585 bytes ...72\345\244\247\351\241\266\345\240\206.png" | Bin 0 -> 31763 bytes ...22\345\205\245\346\216\222\345\272\217.gif" | Bin 0 -> 115616 bytes ...11\346\213\251\346\216\222\345\272\217.gif" | Bin 0 -> 146405 bytes ...64\345\244\247\351\241\266\345\240\206.png" | Bin 0 -> 31919 bytes 13 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 "images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\247\350\203\275\346\257\224\350\276\203.png" delete mode 100644 "images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.md" create mode 100644 "images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\273\347\273\223.png" create mode 100644 "images/\345\206\222\346\263\241\346\216\222\345\272\217.gif" create mode 100644 "images/\345\237\272\346\225\260\346\216\222\345\272\217.gif" create mode 100644 "images/\345\270\214\345\260\224\346\216\222\345\272\217.png" create mode 100644 "images/\345\275\222\345\271\266\346\216\222\345\272\217.gif" create mode 100644 "images/\345\277\253\351\200\237\346\216\222\345\272\217.gif" create mode 100644 "images/\346\236\204\345\273\272\345\244\247\351\241\266\345\240\206.png" create mode 100644 "images/\347\233\264\346\216\245\346\217\222\345\205\245\346\216\222\345\272\217.gif" create mode 100644 "images/\347\256\200\345\215\225\351\200\211\346\213\251\346\216\222\345\272\217.gif" create mode 100644 "images/\350\260\203\346\225\264\345\244\247\351\241\266\345\240\206.png" diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..cd1fbccc7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +Thumbs.db +db.json +*.log +node_modules/ +public/ +.deploy*/ diff --git "a/images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\247\350\203\275\346\257\224\350\276\203.png" "b/images/\345\205\253\345\244\247\346\216\222\345\272\217\347\256\227\346\263\225\346\200\247\350\203\275\346\257\224\350\276\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..77b48e419d558db0970967e2590dd494f4ca018a GIT binary patch literal 316912 zcmV*004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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