diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 index f076d25..28486a9 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # Overview -1. This is my Python (2.7) Leetcode solution. +1. This is my Python Leetcode solution. As time grows, this also become a guide to prepare for software engineer interview. -2. The solution is at `problems/the-file-name/`. -For example, `merge-sorted-array.py`'s solution is at `https://leetcode.com/problems/merge-sorted-array/`. +1. The solution is at `problems/python/` or `problems/python3/`. +For example, `merge-sorted-array.py`'s solution is at `https://leetcode.com/problems/python/merge-sorted-array/`. 2. I really take time tried to make the best solution and collect the best resource that I found. Because I wanted to help others like me. @@ -13,6 +13,7 @@ Please [BUY ME A COFFEE](https://www.buymeacoffee.com/chriswu) if you want to sh # Leetcode Problem Lists I found it makes sense to solve similar problems together, so that we can recognize the problem faster when we encounter a new one. My suggestion is to skip the HARD problems when you first go through these list. +* https://neetcode.io/practice (150 problems with video explaination) * https://www.programcreek.com/2013/08/leetcode-problem-classification/ * https://github.com/wisdompeak/LeetCode * https://docs.google.com/spreadsheets/d/1SbpY-04Cz8EWw3A_LBUmDEXKUMO31DBjfeMoA0dlfIA/edit#gid=126913158 ([huahua](https://www.youtube.com/user/xxfflower/videos)). diff --git "a/common/bellman\342\200\223ford.py" "b/common/bellman\342\200\223ford.py" old mode 100644 new mode 100755 diff --git a/common/binary-search-tree.py b/common/binary-search-tree.py old mode 100644 new mode 100755 diff --git a/common/bst-in-order.py b/common/bst-in-order.py old mode 100644 new mode 100755 diff --git a/common/dijkstra.py b/common/dijkstra.py old mode 100644 new mode 100755 diff --git a/common/heap-sort.py b/common/heap-sort.py old mode 100644 new mode 100755 index eb2e11c..3d56e39 --- a/common/heap-sort.py +++ b/common/heap-sort.py @@ -1,35 +1,33 @@ +#O(LogN), used when part of the array is already heapified. +def heapify(A, N, i): + largest = i + l = i*2+1 + r = i*2+2 + + if lA[largest]: largest = l + if rA[largest]: largest = r + if largest!=i: + A[largest], A[i] = A[i], A[largest] + heapify(A, N, largest) + +#O(NLogN) def heapSort(A): - #build max heap - def heapify(A, n, i): - if i>=n: return - l, r = i*2+1, i*2+2 - left = A[l] if lA[i] or right>A[i]: - if left>right: - A[i], A[l] = A[l], A[i] - heapify(A, n, l) - else: - A[i], A[r] = A[r], A[i] - heapify(A, n, r) - - n = len(A) - - for i in reversed(xrange(n)): - heapify(A, n, i) - - for i in reversed(xrange(1, n)): - A[i], A[0] = A[0], A[i] + N = len(A) + + #build max heap, O(NLogN). Can be optimized to the O(N). + for i in range(N//2-1, -1, -1): + heapify(A, N, i) + + #keep swapping the largest + for i in range(N-1, -1, -1): + A[0], A[i] = A[i], A[0] heapify(A, i, 0) - -A = [21, 4, 1, 3, 9, 20, 25, 6, 21, 14] +A = [12, 11, 13, 5, 6, 7] heapSort(A) -print A +print(A) -""" -Time Complexity O(NLogN) in best, average, worst case. -Space Complexity O(1) -""" \ No newline at end of file +A = [1, 3, 5, 4, 6, 13, 10, 9, 8, 15, 17] +heapSort(A) +print(A) \ No newline at end of file diff --git a/common/insertion-sort.py b/common/insertion-sort.py old mode 100644 new mode 100755 diff --git a/common/knapsack.py b/common/knapsack.py old mode 100644 new mode 100755 diff --git a/common/merge-sort-in-place.py b/common/merge-sort-in-place.py old mode 100644 new mode 100755 diff --git a/common/merge-sort.py b/common/merge-sort.py old mode 100644 new mode 100755 diff --git a/common/min-heap.py b/common/min-heap.py old mode 100644 new mode 100755 diff --git a/common/quick-sort.py b/common/quick-sort.py old mode 100644 new mode 100755 diff --git a/common/radix-sort.py b/common/radix-sort.py old mode 100644 new mode 100755 diff --git a/common/trie.py b/common/trie.py old mode 100644 new mode 100755 diff --git a/problems/01-matrix.py b/problems/python/01-matrix.py old mode 100644 new mode 100755 similarity index 100% rename from problems/01-matrix.py rename to problems/python/01-matrix.py diff --git a/problems/3sum-closest.py b/problems/python/3sum-closest.py old mode 100644 new mode 100755 similarity index 100% rename from problems/3sum-closest.py rename to problems/python/3sum-closest.py diff --git a/problems/3sum.py b/problems/python/3sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/3sum.py rename to problems/python/3sum.py diff --git a/problems/4sum.py b/problems/python/4sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/4sum.py rename to problems/python/4sum.py diff --git a/problems/accounts-merge.py b/problems/python/accounts-merge.py old mode 100644 new mode 100755 similarity index 100% rename from problems/accounts-merge.py rename to problems/python/accounts-merge.py diff --git a/problems/add-binary.py b/problems/python/add-binary.py old mode 100644 new mode 100755 similarity index 100% rename from problems/add-binary.py rename to problems/python/add-binary.py diff --git a/problems/add-digits.py b/problems/python/add-digits.py old mode 100644 new mode 100755 similarity index 100% rename from problems/add-digits.py rename to problems/python/add-digits.py diff --git a/problems/add-strings.py b/problems/python/add-strings.py old mode 100644 new mode 100755 similarity index 100% rename from problems/add-strings.py rename to problems/python/add-strings.py diff --git a/problems/add-two-numbers-ii.py b/problems/python/add-two-numbers-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/add-two-numbers-ii.py rename to problems/python/add-two-numbers-ii.py diff --git a/problems/add-two-numbers.py b/problems/python/add-two-numbers.py old mode 100644 new mode 100755 similarity index 100% rename from problems/add-two-numbers.py rename to problems/python/add-two-numbers.py diff --git a/problems/alien-dictionary.py b/problems/python/alien-dictionary.py old mode 100644 new mode 100755 similarity index 100% rename from problems/alien-dictionary.py rename to problems/python/alien-dictionary.py diff --git a/problems/all-nodes-distance-k-in-binary-tree.py b/problems/python/all-nodes-distance-k-in-binary-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/all-nodes-distance-k-in-binary-tree.py rename to problems/python/all-nodes-distance-k-in-binary-tree.py diff --git a/problems/amount-of-new-area-painted-each-day.py b/problems/python/amount-of-new-area-painted-each-day.py old mode 100644 new mode 100755 similarity index 100% rename from problems/amount-of-new-area-painted-each-day.py rename to problems/python/amount-of-new-area-painted-each-day.py diff --git a/problems/analyze-user-website-visit-pattern.py b/problems/python/analyze-user-website-visit-pattern.py old mode 100644 new mode 100755 similarity index 100% rename from problems/analyze-user-website-visit-pattern.py rename to problems/python/analyze-user-website-visit-pattern.py diff --git a/problems/backspace-string-compare.py b/problems/python/backspace-string-compare.py old mode 100644 new mode 100755 similarity index 100% rename from problems/backspace-string-compare.py rename to problems/python/backspace-string-compare.py diff --git a/problems/balance-a-binary-search-tree.py b/problems/python/balance-a-binary-search-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/balance-a-binary-search-tree.py rename to problems/python/balance-a-binary-search-tree.py diff --git a/problems/balanced-binary-tree.py b/problems/python/balanced-binary-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/balanced-binary-tree.py rename to problems/python/balanced-binary-tree.py diff --git a/problems/basic-calculator-ii.py b/problems/python/basic-calculator-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/basic-calculator-ii.py rename to problems/python/basic-calculator-ii.py diff --git a/problems/best-time-to-buy-an-stock.py b/problems/python/best-time-to-buy-an-stock.py old mode 100644 new mode 100755 similarity index 100% rename from problems/best-time-to-buy-an-stock.py rename to problems/python/best-time-to-buy-an-stock.py diff --git a/problems/best-time-to-buy-and-sell-stock-iii.py b/problems/python/best-time-to-buy-and-sell-stock-iii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/best-time-to-buy-and-sell-stock-iii.py rename to problems/python/best-time-to-buy-and-sell-stock-iii.py diff --git a/problems/best-time-to-buy-and-sell-stock-with-cooldown.py b/problems/python/best-time-to-buy-and-sell-stock-with-cooldown.py old mode 100644 new mode 100755 similarity index 100% rename from problems/best-time-to-buy-and-sell-stock-with-cooldown.py rename to problems/python/best-time-to-buy-and-sell-stock-with-cooldown.py diff --git a/problems/best-time-to-buy-and-sell-stock.py b/problems/python/best-time-to-buy-and-sell-stock.py old mode 100644 new mode 100755 similarity index 100% rename from problems/best-time-to-buy-and-sell-stock.py rename to problems/python/best-time-to-buy-and-sell-stock.py diff --git a/problems/big-countries.sql b/problems/python/big-countries.sql old mode 100644 new mode 100755 similarity index 100% rename from problems/big-countries.sql rename to problems/python/big-countries.sql diff --git a/problems/binary-search-tree-iterator.py b/problems/python/binary-search-tree-iterator.py old mode 100644 new mode 100755 similarity index 100% rename from problems/binary-search-tree-iterator.py rename to problems/python/binary-search-tree-iterator.py diff --git a/problems/binary-search.py b/problems/python/binary-search.py old mode 100644 new mode 100755 similarity index 100% rename from problems/binary-search.py rename to problems/python/binary-search.py diff --git a/problems/binary-subarrays-with-sum.py b/problems/python/binary-subarrays-with-sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/binary-subarrays-with-sum.py rename to problems/python/binary-subarrays-with-sum.py diff --git a/problems/binary-tree-inorder-traversal.py b/problems/python/binary-tree-inorder-traversal.py old mode 100644 new mode 100755 similarity index 100% rename from problems/binary-tree-inorder-traversal.py rename to problems/python/binary-tree-inorder-traversal.py diff --git a/problems/binary-tree-level-order-traversal-ii.py b/problems/python/binary-tree-level-order-traversal-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/binary-tree-level-order-traversal-ii.py rename to problems/python/binary-tree-level-order-traversal-ii.py diff --git a/problems/binary-tree-level-order-traversal.py b/problems/python/binary-tree-level-order-traversal.py old mode 100644 new mode 100755 similarity index 100% rename from problems/binary-tree-level-order-traversal.py rename to problems/python/binary-tree-level-order-traversal.py diff --git a/problems/binary-tree-longest-consecutive-sequence.py b/problems/python/binary-tree-longest-consecutive-sequence.py old mode 100644 new mode 100755 similarity index 100% rename from problems/binary-tree-longest-consecutive-sequence.py rename to problems/python/binary-tree-longest-consecutive-sequence.py diff --git a/problems/binary-tree-maximum-path-sum.py b/problems/python/binary-tree-maximum-path-sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/binary-tree-maximum-path-sum.py rename to problems/python/binary-tree-maximum-path-sum.py diff --git a/problems/binary-tree-paths.py b/problems/python/binary-tree-paths.py old mode 100644 new mode 100755 similarity index 100% rename from problems/binary-tree-paths.py rename to problems/python/binary-tree-paths.py diff --git a/problems/binary-tree-pruning.py b/problems/python/binary-tree-pruning.py old mode 100644 new mode 100755 similarity index 100% rename from problems/binary-tree-pruning.py rename to problems/python/binary-tree-pruning.py diff --git a/problems/binary-tree-right-side-view.py b/problems/python/binary-tree-right-side-view.py old mode 100644 new mode 100755 similarity index 100% rename from problems/binary-tree-right-side-view.py rename to problems/python/binary-tree-right-side-view.py diff --git a/problems/binary-tree-vertical-order-traversal.py b/problems/python/binary-tree-vertical-order-traversal.py old mode 100644 new mode 100755 similarity index 100% rename from problems/binary-tree-vertical-order-traversal.py rename to problems/python/binary-tree-vertical-order-traversal.py diff --git a/problems/binary-watch.py b/problems/python/binary-watch.py old mode 100644 new mode 100755 similarity index 100% rename from problems/binary-watch.py rename to problems/python/binary-watch.py diff --git a/problems/buildings-with-an-ocean-view.py b/problems/python/buildings-with-an-ocean-view.py old mode 100644 new mode 100755 similarity index 100% rename from problems/buildings-with-an-ocean-view.py rename to problems/python/buildings-with-an-ocean-view.py diff --git a/problems/burst-balloons.py b/problems/python/burst-balloons.py old mode 100644 new mode 100755 similarity index 100% rename from problems/burst-balloons.py rename to problems/python/burst-balloons.py diff --git a/problems/campus-bikes-ii.py b/problems/python/campus-bikes-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/campus-bikes-ii.py rename to problems/python/campus-bikes-ii.py diff --git a/problems/candy.py b/problems/python/candy.py old mode 100644 new mode 100755 similarity index 100% rename from problems/candy.py rename to problems/python/candy.py diff --git a/problems/capacity-to-ship-packages-within-d-days.py b/problems/python/capacity-to-ship-packages-within-d-days.py old mode 100644 new mode 100755 similarity index 100% rename from problems/capacity-to-ship-packages-within-d-days.py rename to problems/python/capacity-to-ship-packages-within-d-days.py diff --git a/problems/cheapest-flights-within-k-stops.py b/problems/python/cheapest-flights-within-k-stops.py old mode 100644 new mode 100755 similarity index 100% rename from problems/cheapest-flights-within-k-stops.py rename to problems/python/cheapest-flights-within-k-stops.py diff --git a/problems/climbing-stairs.py b/problems/python/climbing-stairs.py old mode 100644 new mode 100755 similarity index 100% rename from problems/climbing-stairs.py rename to problems/python/climbing-stairs.py diff --git a/problems/clone-graph.py b/problems/python/clone-graph.py old mode 100644 new mode 100755 similarity index 100% rename from problems/clone-graph.py rename to problems/python/clone-graph.py diff --git a/problems/closest-binary-search-tree-value.py b/problems/python/closest-binary-search-tree-value.py old mode 100644 new mode 100755 similarity index 100% rename from problems/closest-binary-search-tree-value.py rename to problems/python/closest-binary-search-tree-value.py diff --git a/problems/coin-change.py b/problems/python/coin-change.py old mode 100644 new mode 100755 similarity index 100% rename from problems/coin-change.py rename to problems/python/coin-change.py diff --git a/problems/coloring-a-border.py b/problems/python/coloring-a-border.py old mode 100644 new mode 100755 similarity index 100% rename from problems/coloring-a-border.py rename to problems/python/coloring-a-border.py diff --git a/problems/combination-sum-ii.py b/problems/python/combination-sum-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/combination-sum-ii.py rename to problems/python/combination-sum-ii.py diff --git a/problems/combination-sum-iii.py b/problems/python/combination-sum-iii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/combination-sum-iii.py rename to problems/python/combination-sum-iii.py diff --git a/problems/combination-sum-iv.py b/problems/python/combination-sum-iv.py old mode 100644 new mode 100755 similarity index 100% rename from problems/combination-sum-iv.py rename to problems/python/combination-sum-iv.py diff --git a/problems/combination-sum.py b/problems/python/combination-sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/combination-sum.py rename to problems/python/combination-sum.py diff --git a/problems/combinations.py b/problems/python/combinations.py old mode 100644 new mode 100755 similarity index 100% rename from problems/combinations.py rename to problems/python/combinations.py diff --git a/problems/combine-two-tables.sql b/problems/python/combine-two-tables.sql old mode 100644 new mode 100755 similarity index 100% rename from problems/combine-two-tables.sql rename to problems/python/combine-two-tables.sql diff --git a/problems/compare-version-numbers.py b/problems/python/compare-version-numbers.py old mode 100644 new mode 100755 similarity index 100% rename from problems/compare-version-numbers.py rename to problems/python/compare-version-numbers.py diff --git a/problems/connecting-cities-with-minimum-cost.py b/problems/python/connecting-cities-with-minimum-cost.py old mode 100644 new mode 100755 similarity index 100% rename from problems/connecting-cities-with-minimum-cost.py rename to problems/python/connecting-cities-with-minimum-cost.py diff --git a/problems/consecutive-numbers-sum.py b/problems/python/consecutive-numbers-sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/consecutive-numbers-sum.py rename to problems/python/consecutive-numbers-sum.py diff --git a/problems/construct-binary-tree-from-inorder-and-postorder-traversal.py b/problems/python/construct-binary-tree-from-inorder-and-postorder-traversal.py old mode 100644 new mode 100755 similarity index 100% rename from problems/construct-binary-tree-from-inorder-and-postorder-traversal.py rename to problems/python/construct-binary-tree-from-inorder-and-postorder-traversal.py diff --git a/problems/construct-binary-tree-from-preorder-and-inorder-traversal.py b/problems/python/construct-binary-tree-from-preorder-and-inorder-traversal.py old mode 100644 new mode 100755 similarity index 100% rename from problems/construct-binary-tree-from-preorder-and-inorder-traversal.py rename to problems/python/construct-binary-tree-from-preorder-and-inorder-traversal.py diff --git a/problems/container-with-most-water.py b/problems/python/container-with-most-water.py old mode 100644 new mode 100755 similarity index 100% rename from problems/container-with-most-water.py rename to problems/python/container-with-most-water.py diff --git a/problems/contains-duplicate-ii.py b/problems/python/contains-duplicate-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/contains-duplicate-ii.py rename to problems/python/contains-duplicate-ii.py diff --git a/problems/contains-duplicate-iii.py b/problems/python/contains-duplicate-iii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/contains-duplicate-iii.py rename to problems/python/contains-duplicate-iii.py diff --git a/problems/contains-duplicate.py b/problems/python/contains-duplicate.py old mode 100644 new mode 100755 similarity index 100% rename from problems/contains-duplicate.py rename to problems/python/contains-duplicate.py diff --git a/problems/continuous-subarray-sum.py b/problems/python/continuous-subarray-sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/continuous-subarray-sum.py rename to problems/python/continuous-subarray-sum.py diff --git a/problems/convert-binary-search-tree-to-sorted-doubly-linked-list.py b/problems/python/convert-binary-search-tree-to-sorted-doubly-linked-list.py old mode 100644 new mode 100755 similarity index 100% rename from problems/convert-binary-search-tree-to-sorted-doubly-linked-list.py rename to problems/python/convert-binary-search-tree-to-sorted-doubly-linked-list.py diff --git a/problems/convert-sorted-array-to-binary-search-tree.py b/problems/python/convert-sorted-array-to-binary-search-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/convert-sorted-array-to-binary-search-tree.py rename to problems/python/convert-sorted-array-to-binary-search-tree.py diff --git a/problems/convert-sorted-list-to-binary-search-tree.py b/problems/python/convert-sorted-list-to-binary-search-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/convert-sorted-list-to-binary-search-tree.py rename to problems/python/convert-sorted-list-to-binary-search-tree.py diff --git a/problems/copy-list-with-random-pointer.py b/problems/python/copy-list-with-random-pointer.py old mode 100644 new mode 100755 similarity index 100% rename from problems/copy-list-with-random-pointer.py rename to problems/python/copy-list-with-random-pointer.py diff --git a/problems/count-all-valid-pickup-and-delivery-opti.py b/problems/python/count-all-valid-pickup-and-delivery-opti.py old mode 100644 new mode 100755 similarity index 100% rename from problems/count-all-valid-pickup-and-delivery-opti.py rename to problems/python/count-all-valid-pickup-and-delivery-opti.py diff --git a/problems/count-binary-substrings.py b/problems/python/count-binary-substrings.py old mode 100644 new mode 100755 similarity index 100% rename from problems/count-binary-substrings.py rename to problems/python/count-binary-substrings.py diff --git a/problems/count-complete-tree-nodes.py b/problems/python/count-complete-tree-nodes.py old mode 100644 new mode 100755 similarity index 100% rename from problems/count-complete-tree-nodes.py rename to problems/python/count-complete-tree-nodes.py diff --git a/problems/count-number-of-nice-subarrays.py b/problems/python/count-number-of-nice-subarrays.py old mode 100644 new mode 100755 similarity index 100% rename from problems/count-number-of-nice-subarrays.py rename to problems/python/count-number-of-nice-subarrays.py diff --git a/problems/count-unique-characters-of-all-substrings-of-a-given-string.py b/problems/python/count-unique-characters-of-all-substrings-of-a-given-string.py old mode 100644 new mode 100755 similarity index 100% rename from problems/count-unique-characters-of-all-substrings-of-a-given-string.py rename to problems/python/count-unique-characters-of-all-substrings-of-a-given-string.py diff --git a/problems/course-schedule-ii.py b/problems/python/course-schedule-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/course-schedule-ii.py rename to problems/python/course-schedule-ii.py diff --git a/problems/course-schedule.py b/problems/python/course-schedule.py old mode 100644 new mode 100755 similarity index 100% rename from problems/course-schedule.py rename to problems/python/course-schedule.py diff --git a/problems/custom-sort-string.py b/problems/python/custom-sort-string.py old mode 100644 new mode 100755 similarity index 100% rename from problems/custom-sort-string.py rename to problems/python/custom-sort-string.py diff --git a/problems/cutting-ribbons.py b/problems/python/cutting-ribbons.py old mode 100644 new mode 100755 similarity index 100% rename from problems/cutting-ribbons.py rename to problems/python/cutting-ribbons.py diff --git a/problems/data-stream-as-disjoint-intervals.py b/problems/python/data-stream-as-disjoint-intervals.py old mode 100644 new mode 100755 similarity index 100% rename from problems/data-stream-as-disjoint-intervals.py rename to problems/python/data-stream-as-disjoint-intervals.py diff --git a/problems/decode-string.py b/problems/python/decode-string.py old mode 100644 new mode 100755 similarity index 100% rename from problems/decode-string.py rename to problems/python/decode-string.py diff --git a/problems/decode-ways.py b/problems/python/decode-ways.py old mode 100644 new mode 100755 similarity index 100% rename from problems/decode-ways.py rename to problems/python/decode-ways.py diff --git a/problems/delete-and-earn.py b/problems/python/delete-and-earn.py old mode 100644 new mode 100755 similarity index 100% rename from problems/delete-and-earn.py rename to problems/python/delete-and-earn.py diff --git a/problems/delete-duplicate-folders-in-system.py b/problems/python/delete-duplicate-folders-in-system.py old mode 100644 new mode 100755 similarity index 100% rename from problems/delete-duplicate-folders-in-system.py rename to problems/python/delete-duplicate-folders-in-system.py diff --git a/problems/delete-node-in-a-bst.py b/problems/python/delete-node-in-a-bst.py old mode 100644 new mode 100755 similarity index 100% rename from problems/delete-node-in-a-bst.py rename to problems/python/delete-node-in-a-bst.py diff --git a/problems/delete-operation-for-two-strings.py b/problems/python/delete-operation-for-two-strings.py old mode 100644 new mode 100755 similarity index 100% rename from problems/delete-operation-for-two-strings.py rename to problems/python/delete-operation-for-two-strings.py diff --git a/problems/design-add-and-search-words-data-structure.py b/problems/python/design-add-and-search-words-data-structure.py old mode 100644 new mode 100755 similarity index 100% rename from problems/design-add-and-search-words-data-structure.py rename to problems/python/design-add-and-search-words-data-structure.py diff --git a/problems/design-in-memory-file-system.py b/problems/python/design-in-memory-file-system.py old mode 100644 new mode 100755 similarity index 100% rename from problems/design-in-memory-file-system.py rename to problems/python/design-in-memory-file-system.py diff --git a/problems/design-linked-list.py b/problems/python/design-linked-list.py old mode 100644 new mode 100755 similarity index 100% rename from problems/design-linked-list.py rename to problems/python/design-linked-list.py diff --git a/problems/design-tic-tac-toe.py b/problems/python/design-tic-tac-toe.py old mode 100644 new mode 100755 similarity index 100% rename from problems/design-tic-tac-toe.py rename to problems/python/design-tic-tac-toe.py diff --git a/problems/diagonal-traverse.py b/problems/python/diagonal-traverse.py old mode 100644 new mode 100755 similarity index 100% rename from problems/diagonal-traverse.py rename to problems/python/diagonal-traverse.py diff --git a/problems/diameter-of-binary-tree.py b/problems/python/diameter-of-binary-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/diameter-of-binary-tree.py rename to problems/python/diameter-of-binary-tree.py diff --git a/problems/different-ways-to-add-parentheses.py b/problems/python/different-ways-to-add-parentheses.py old mode 100644 new mode 100755 similarity index 100% rename from problems/different-ways-to-add-parentheses.py rename to problems/python/different-ways-to-add-parentheses.py diff --git a/problems/distinct-subsequences.py b/problems/python/distinct-subsequences.py old mode 100644 new mode 100755 similarity index 100% rename from problems/distinct-subsequences.py rename to problems/python/distinct-subsequences.py diff --git a/problems/distribute-coins-in-binary-tree.py b/problems/python/distribute-coins-in-binary-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/distribute-coins-in-binary-tree.py rename to problems/python/distribute-coins-in-binary-tree.py diff --git a/problems/domino-and-tromino-tiling.py b/problems/python/domino-and-tromino-tiling.py old mode 100644 new mode 100755 similarity index 100% rename from problems/domino-and-tromino-tiling.py rename to problems/python/domino-and-tromino-tiling.py diff --git a/problems/dot-product-of-two-sparse-vectors.py b/problems/python/dot-product-of-two-sparse-vectors.py old mode 100644 new mode 100755 similarity index 100% rename from problems/dot-product-of-two-sparse-vectors.py rename to problems/python/dot-product-of-two-sparse-vectors.py diff --git a/problems/dungeon-game.py b/problems/python/dungeon-game.py old mode 100644 new mode 100755 similarity index 100% rename from problems/dungeon-game.py rename to problems/python/dungeon-game.py diff --git a/problems/edit-distance.py b/problems/python/edit-distance.py old mode 100644 new mode 100755 similarity index 100% rename from problems/edit-distance.py rename to problems/python/edit-distance.py diff --git a/problems/egions-cut-by-slashes.py b/problems/python/egions-cut-by-slashes.py old mode 100644 new mode 100755 similarity index 100% rename from problems/egions-cut-by-slashes.py rename to problems/python/egions-cut-by-slashes.py diff --git a/problems/evaluate-division.py b/problems/python/evaluate-division.py old mode 100644 new mode 100755 similarity index 100% rename from problems/evaluate-division.py rename to problems/python/evaluate-division.py diff --git a/problems/evaluate-reverse-polish-notation.py b/problems/python/evaluate-reverse-polish-notation.py old mode 100644 new mode 100755 similarity index 100% rename from problems/evaluate-reverse-polish-notation.py rename to problems/python/evaluate-reverse-polish-notation.py diff --git a/problems/exclusive-time-of-functions.py b/problems/python/exclusive-time-of-functions.py old mode 100644 new mode 100755 similarity index 100% rename from problems/exclusive-time-of-functions.py rename to problems/python/exclusive-time-of-functions.py diff --git a/problems/expression-add-operators.py b/problems/python/expression-add-operators.py old mode 100644 new mode 100755 similarity index 100% rename from problems/expression-add-operators.py rename to problems/python/expression-add-operators.py diff --git a/problems/filling-bookcase-shelves.py b/problems/python/filling-bookcase-shelves.py old mode 100644 new mode 100755 similarity index 100% rename from problems/filling-bookcase-shelves.py rename to problems/python/filling-bookcase-shelves.py diff --git a/problems/find-all-possible-recipes-from-given-supplies.py b/problems/python/find-all-possible-recipes-from-given-supplies.py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-all-possible-recipes-from-given-supplies.py rename to problems/python/find-all-possible-recipes-from-given-supplies.py diff --git a/problems/find-and-replace-in-string.py b/problems/python/find-and-replace-in-string.py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-and-replace-in-string.py rename to problems/python/find-and-replace-in-string.py diff --git a/problems/find-distance-in-a-binary-tree.py b/problems/python/find-distance-in-a-binary-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-distance-in-a-binary-tree.py rename to problems/python/find-distance-in-a-binary-tree.py diff --git a/problems/find-duplicate-subtrees.py b/problems/python/find-duplicate-subtrees.py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-duplicate-subtrees.py rename to problems/python/find-duplicate-subtrees.py diff --git a/problems/find-eventual-safe-states.py b/problems/python/find-eventual-safe-states.py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-eventual-safe-states.py rename to problems/python/find-eventual-safe-states.py diff --git a/problems/find-first-and-last-position-of-element-in-sorted-array.py b/problems/python/find-first-and-last-position-of-element-in-sorted-array.py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-first-and-last-position-of-element-in-sorted-array.py rename to problems/python/find-first-and-last-position-of-element-in-sorted-array.py diff --git a/problems/find-k-closest-elements.py b/problems/python/find-k-closest-elements.py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-k-closest-elements.py rename to problems/python/find-k-closest-elements.py diff --git a/problems/find-k-pairs-with-smallest-sums.py b/problems/python/find-k-pairs-with-smallest-sums.py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-k-pairs-with-smallest-sums.py rename to problems/python/find-k-pairs-with-smallest-sums.py diff --git a/problems/find-leaves-of-binary-tree.py b/problems/python/find-leaves-of-binary-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-leaves-of-binary-tree.py rename to problems/python/find-leaves-of-binary-tree.py diff --git a/problems/find-median-from-data-stream.py b/problems/python/find-median-from-data-stream.py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-median-from-data-stream.py rename to problems/python/find-median-from-data-stream.py diff --git a/problems/find-minimum-in-rotated-sorted-array-ii.py b/problems/python/find-minimum-in-rotated-sorted-array-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-minimum-in-rotated-sorted-array-ii.py rename to problems/python/find-minimum-in-rotated-sorted-array-ii.py diff --git a/problems/find-minimum-in-rotated-sorted-array.py b/problems/python/find-minimum-in-rotated-sorted-array.py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-minimum-in-rotated-sorted-array.py rename to problems/python/find-minimum-in-rotated-sorted-array.py diff --git a/problems/find-mode-in-binary-search-tree.py b/problems/python/find-mode-in-binary-search-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-mode-in-binary-search-tree.py rename to problems/python/find-mode-in-binary-search-tree.py diff --git a/problems/find-original-array-from-doubled-array,py b/problems/python/find-original-array-from-doubled-array,py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-original-array-from-doubled-array,py rename to problems/python/find-original-array-from-doubled-array,py diff --git a/problems/find-peak-element.py b/problems/python/find-peak-element.py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-peak-element.py rename to problems/python/find-peak-element.py diff --git a/problems/find-the-duplicate-number.py b/problems/python/find-the-duplicate-number.py old mode 100644 new mode 100755 similarity index 100% rename from problems/find-the-duplicate-number.py rename to problems/python/find-the-duplicate-number.py diff --git a/problems/first-bad-version.py b/problems/python/first-bad-version.py old mode 100644 new mode 100755 similarity index 100% rename from problems/first-bad-version.py rename to problems/python/first-bad-version.py diff --git a/problems/first-missing-positive.py b/problems/python/first-missing-positive.py old mode 100644 new mode 100755 similarity index 100% rename from problems/first-missing-positive.py rename to problems/python/first-missing-positive.py diff --git a/problems/first-unique-character-in-a-string.py b/problems/python/first-unique-character-in-a-string.py old mode 100644 new mode 100755 similarity index 100% rename from problems/first-unique-character-in-a-string.py rename to problems/python/first-unique-character-in-a-string.py diff --git a/problems/fizz-buzz.py b/problems/python/fizz-buzz.py old mode 100644 new mode 100755 similarity index 100% rename from problems/fizz-buzz.py rename to problems/python/fizz-buzz.py diff --git a/problems/flatten-binary-tree-to-linked-list.py b/problems/python/flatten-binary-tree-to-linked-list.py old mode 100644 new mode 100755 similarity index 100% rename from problems/flatten-binary-tree-to-linked-list.py rename to problems/python/flatten-binary-tree-to-linked-list.py diff --git a/problems/flip-binary-tree-to-match-preorder-traversal.py b/problems/python/flip-binary-tree-to-match-preorder-traversal.py old mode 100644 new mode 100755 similarity index 100% rename from problems/flip-binary-tree-to-match-preorder-traversal.py rename to problems/python/flip-binary-tree-to-match-preorder-traversal.py diff --git a/problems/flip-string-to-monotone-increasing.py b/problems/python/flip-string-to-monotone-increasing.py old mode 100644 new mode 100755 similarity index 100% rename from problems/flip-string-to-monotone-increasing.py rename to problems/python/flip-string-to-monotone-increasing.py diff --git a/problems/flood-fill.py b/problems/python/flood-fill.py old mode 100644 new mode 100755 similarity index 100% rename from problems/flood-fill.py rename to problems/python/flood-fill.py diff --git a/problems/friend-circles.py b/problems/python/friend-circles.py old mode 100644 new mode 100755 similarity index 100% rename from problems/friend-circles.py rename to problems/python/friend-circles.py diff --git a/problems/fruit-into-baskets.py b/problems/python/fruit-into-baskets.py old mode 100644 new mode 100755 similarity index 100% rename from problems/fruit-into-baskets.py rename to problems/python/fruit-into-baskets.py diff --git a/problems/game-of-life.py b/problems/python/game-of-life.py old mode 100644 new mode 100755 similarity index 100% rename from problems/game-of-life.py rename to problems/python/game-of-life.py diff --git a/problems/generate-parentheses.py b/problems/python/generate-parentheses.py old mode 100644 new mode 100755 similarity index 100% rename from problems/generate-parentheses.py rename to problems/python/generate-parentheses.py diff --git a/problems/graph-valid-tree.py b/problems/python/graph-valid-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/graph-valid-tree.py rename to problems/python/graph-valid-tree.py diff --git a/problems/greatest-sum-divisible-by-three.py b/problems/python/greatest-sum-divisible-by-three.py old mode 100644 new mode 100755 similarity index 100% rename from problems/greatest-sum-divisible-by-three.py rename to problems/python/greatest-sum-divisible-by-three.py diff --git a/problems/group-anagrams.py b/problems/python/group-anagrams.py old mode 100644 new mode 100755 similarity index 100% rename from problems/group-anagrams.py rename to problems/python/group-anagrams.py diff --git a/problems/group-shifted-strings.py b/problems/python/group-shifted-strings.py old mode 100644 new mode 100755 similarity index 100% rename from problems/group-shifted-strings.py rename to problems/python/group-shifted-strings.py diff --git a/problems/guess-number-higher-or-lower-ii.py b/problems/python/guess-number-higher-or-lower-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/guess-number-higher-or-lower-ii.py rename to problems/python/guess-number-higher-or-lower-ii.py diff --git a/problems/guess-number-higher-or-lower.py b/problems/python/guess-number-higher-or-lower.py old mode 100644 new mode 100755 similarity index 100% rename from problems/guess-number-higher-or-lower.py rename to problems/python/guess-number-higher-or-lower.py diff --git a/problems/guess-the-word.py b/problems/python/guess-the-word.py old mode 100644 new mode 100755 similarity index 100% rename from problems/guess-the-word.py rename to problems/python/guess-the-word.py diff --git a/problems/h-index-ii.py b/problems/python/h-index-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/h-index-ii.py rename to problems/python/h-index-ii.py diff --git a/problems/h-index.py b/problems/python/h-index.py old mode 100644 new mode 100755 similarity index 100% rename from problems/h-index.py rename to problems/python/h-index.py diff --git a/problems/hamming-distance.py b/problems/python/hamming-distance.py old mode 100644 new mode 100755 similarity index 100% rename from problems/hamming-distance.py rename to problems/python/hamming-distance.py diff --git a/problems/house-robber-ii.py b/problems/python/house-robber-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/house-robber-ii.py rename to problems/python/house-robber-ii.py diff --git a/problems/house-robber-iii.py b/problems/python/house-robber-iii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/house-robber-iii.py rename to problems/python/house-robber-iii.py diff --git a/problems/house-robber.py b/problems/python/house-robber.py old mode 100644 new mode 100755 similarity index 100% rename from problems/house-robber.py rename to problems/python/house-robber.py diff --git a/problems/implement-trie-prefix-tree.py b/problems/python/implement-trie-prefix-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/implement-trie-prefix-tree.py rename to problems/python/implement-trie-prefix-tree.py diff --git a/problems/increasing-triplet-subsequence.py b/problems/python/increasing-triplet-subsequence.py old mode 100644 new mode 100755 similarity index 100% rename from problems/increasing-triplet-subsequence.py rename to problems/python/increasing-triplet-subsequence.py diff --git a/problems/inorder-successor-in-bst-ii.py b/problems/python/inorder-successor-in-bst-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/inorder-successor-in-bst-ii.py rename to problems/python/inorder-successor-in-bst-ii.py diff --git a/problems/inorder-successor-in-bst.py b/problems/python/inorder-successor-in-bst.py old mode 100644 new mode 100755 similarity index 100% rename from problems/inorder-successor-in-bst.py rename to problems/python/inorder-successor-in-bst.py diff --git a/problems/insert-interval.py b/problems/python/insert-interval.py old mode 100644 new mode 100755 similarity index 100% rename from problems/insert-interval.py rename to problems/python/insert-interval.py diff --git a/problems/insert-into-a-binary-search-tree.py b/problems/python/insert-into-a-binary-search-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/insert-into-a-binary-search-tree.py rename to problems/python/insert-into-a-binary-search-tree.py diff --git a/problems/insert-into-a-sorted-circular-linked-list.py b/problems/python/insert-into-a-sorted-circular-linked-list.py old mode 100644 new mode 100755 similarity index 100% rename from problems/insert-into-a-sorted-circular-linked-list.py rename to problems/python/insert-into-a-sorted-circular-linked-list.py diff --git a/problems/insertion-sort-list.py b/problems/python/insertion-sort-list.py old mode 100644 new mode 100755 similarity index 100% rename from problems/insertion-sort-list.py rename to problems/python/insertion-sort-list.py diff --git a/problems/integer-to-english-words.py b/problems/python/integer-to-english-words.py old mode 100644 new mode 100755 similarity index 100% rename from problems/integer-to-english-words.py rename to problems/python/integer-to-english-words.py diff --git a/problems/interleaving-string.py b/problems/python/interleaving-string.py old mode 100644 new mode 100755 similarity index 100% rename from problems/interleaving-string.py rename to problems/python/interleaving-string.py diff --git a/problems/intersection-of-two-arrays-ii.py b/problems/python/intersection-of-two-arrays-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/intersection-of-two-arrays-ii.py rename to problems/python/intersection-of-two-arrays-ii.py diff --git a/problems/intersection-of-two-arrays.py b/problems/python/intersection-of-two-arrays.py old mode 100644 new mode 100755 similarity index 100% rename from problems/intersection-of-two-arrays.py rename to problems/python/intersection-of-two-arrays.py diff --git a/problems/invert-binary-tree.py b/problems/python/invert-binary-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/invert-binary-tree.py rename to problems/python/invert-binary-tree.py diff --git a/problems/is-graph-bipartite.py b/problems/python/is-graph-bipartite.py old mode 100644 new mode 100755 similarity index 100% rename from problems/is-graph-bipartite.py rename to problems/python/is-graph-bipartite.py diff --git a/problems/is-subsequence.py b/problems/python/is-subsequence.py old mode 100644 new mode 100755 similarity index 100% rename from problems/is-subsequence.py rename to problems/python/is-subsequence.py diff --git a/problems/isomorphic-strings.py b/problems/python/isomorphic-strings.py old mode 100644 new mode 100755 similarity index 100% rename from problems/isomorphic-strings.py rename to problems/python/isomorphic-strings.py diff --git a/problems/jewels-and-stones.py b/problems/python/jewels-and-stones.py old mode 100644 new mode 100755 similarity index 100% rename from problems/jewels-and-stones.py rename to problems/python/jewels-and-stones.py diff --git a/problems/jump-game.py b/problems/python/jump-game.py old mode 100644 new mode 100755 similarity index 100% rename from problems/jump-game.py rename to problems/python/jump-game.py diff --git a/problems/k-closest-points-to-origin.py b/problems/python/k-closest-points-to-origin.py old mode 100644 new mode 100755 similarity index 100% rename from problems/k-closest-points-to-origin.py rename to problems/python/k-closest-points-to-origin.py diff --git a/problems/k-empty-slots.py b/problems/python/k-empty-slots.py old mode 100644 new mode 100755 similarity index 100% rename from problems/k-empty-slots.py rename to problems/python/k-empty-slots.py diff --git a/problems/keys-and-rooms.py b/problems/python/keys-and-rooms.py old mode 100644 new mode 100755 similarity index 100% rename from problems/keys-and-rooms.py rename to problems/python/keys-and-rooms.py diff --git a/problems/knight-dialer.py b/problems/python/knight-dialer.py old mode 100644 new mode 100755 similarity index 100% rename from problems/knight-dialer.py rename to problems/python/knight-dialer.py diff --git a/problems/knight-probability-in-chessboard.py b/problems/python/knight-probability-in-chessboard.py old mode 100644 new mode 100755 similarity index 100% rename from problems/knight-probability-in-chessboard.py rename to problems/python/knight-probability-in-chessboard.py diff --git a/problems/koko-eating-bananas.py b/problems/python/koko-eating-bananas.py old mode 100644 new mode 100755 similarity index 100% rename from problems/koko-eating-bananas.py rename to problems/python/koko-eating-bananas.py diff --git a/problems/kth-largest-element-in-an-array.py b/problems/python/kth-largest-element-in-an-array.py old mode 100644 new mode 100755 similarity index 100% rename from problems/kth-largest-element-in-an-array.py rename to problems/python/kth-largest-element-in-an-array.py diff --git a/problems/kth-smallest-element-in-a-bst.py b/problems/python/kth-smallest-element-in-a-bst.py old mode 100644 new mode 100755 similarity index 100% rename from problems/kth-smallest-element-in-a-bst.py rename to problems/python/kth-smallest-element-in-a-bst.py diff --git a/problems/kth-smallest-element-in-a-sorted-matrix.py b/problems/python/kth-smallest-element-in-a-sorted-matrix.py old mode 100644 new mode 100755 similarity index 100% rename from problems/kth-smallest-element-in-a-sorted-matrix.py rename to problems/python/kth-smallest-element-in-a-sorted-matrix.py diff --git a/problems/largest-1-bordered-square.py b/problems/python/largest-1-bordered-square.py old mode 100644 new mode 100755 similarity index 100% rename from problems/largest-1-bordered-square.py rename to problems/python/largest-1-bordered-square.py diff --git a/problems/largest-bst-subtree.py b/problems/python/largest-bst-subtree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/largest-bst-subtree.py rename to problems/python/largest-bst-subtree.py diff --git a/problems/largest-sum-of-averages.py b/problems/python/largest-sum-of-averages.py old mode 100644 new mode 100755 similarity index 100% rename from problems/largest-sum-of-averages.py rename to problems/python/largest-sum-of-averages.py diff --git a/problems/last-stone-weight-ii.py b/problems/python/last-stone-weight-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/last-stone-weight-ii.py rename to problems/python/last-stone-weight-ii.py diff --git a/problems/last-stone-weight.py b/problems/python/last-stone-weight.py old mode 100644 new mode 100755 similarity index 100% rename from problems/last-stone-weight.py rename to problems/python/last-stone-weight.py diff --git a/problems/least-number-of-unique-integers-after-k-removals.py b/problems/python/least-number-of-unique-integers-after-k-removals.py old mode 100644 new mode 100755 similarity index 100% rename from problems/least-number-of-unique-integers-after-k-removals.py rename to problems/python/least-number-of-unique-integers-after-k-removals.py diff --git a/problems/letter-case-permutation.py b/problems/python/letter-case-permutation.py old mode 100644 new mode 100755 similarity index 100% rename from problems/letter-case-permutation.py rename to problems/python/letter-case-permutation.py diff --git a/problems/letter-combinations-of-a-phone-number.py b/problems/python/letter-combinations-of-a-phone-number.py old mode 100644 new mode 100755 similarity index 100% rename from problems/letter-combinations-of-a-phone-number.py rename to problems/python/letter-combinations-of-a-phone-number.py diff --git a/problems/license-key-formatting.py b/problems/python/license-key-formatting.py old mode 100644 new mode 100755 similarity index 100% rename from problems/license-key-formatting.py rename to problems/python/license-key-formatting.py diff --git a/problems/linked-list-cycle-ii.py b/problems/python/linked-list-cycle-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/linked-list-cycle-ii.py rename to problems/python/linked-list-cycle-ii.py diff --git a/problems/linked-list-cycle.py b/problems/python/linked-list-cycle.py old mode 100644 new mode 100755 similarity index 100% rename from problems/linked-list-cycle.py rename to problems/python/linked-list-cycle.py diff --git a/problems/linked-list-random-node.py b/problems/python/linked-list-random-node.py old mode 100644 new mode 100755 similarity index 100% rename from problems/linked-list-random-node.py rename to problems/python/linked-list-random-node.py diff --git a/problems/logger-rate-limiter.py b/problems/python/logger-rate-limiter.py old mode 100644 new mode 100755 similarity index 100% rename from problems/logger-rate-limiter.py rename to problems/python/logger-rate-limiter.py diff --git a/problems/longest-common-prefix.py b/problems/python/longest-common-prefix.py old mode 100644 new mode 100755 similarity index 100% rename from problems/longest-common-prefix.py rename to problems/python/longest-common-prefix.py diff --git a/problems/longest-common-subsequence.py b/problems/python/longest-common-subsequence.py old mode 100644 new mode 100755 similarity index 100% rename from problems/longest-common-subsequence.py rename to problems/python/longest-common-subsequence.py diff --git a/problems/longest-consecutive-sequence.py b/problems/python/longest-consecutive-sequence.py old mode 100644 new mode 100755 similarity index 100% rename from problems/longest-consecutive-sequence.py rename to problems/python/longest-consecutive-sequence.py diff --git a/problems/longest-increasing-path-in-a-matrix.py b/problems/python/longest-increasing-path-in-a-matrix.py old mode 100644 new mode 100755 similarity index 100% rename from problems/longest-increasing-path-in-a-matrix.py rename to problems/python/longest-increasing-path-in-a-matrix.py diff --git a/problems/longest-increasing-subsequence.py b/problems/python/longest-increasing-subsequence.py old mode 100644 new mode 100755 similarity index 100% rename from problems/longest-increasing-subsequence.py rename to problems/python/longest-increasing-subsequence.py diff --git a/problems/longest-palindromic-subsequence.py b/problems/python/longest-palindromic-subsequence.py old mode 100644 new mode 100755 similarity index 100% rename from problems/longest-palindromic-subsequence.py rename to problems/python/longest-palindromic-subsequence.py diff --git a/problems/longest-palindromic-substring.py b/problems/python/longest-palindromic-substring.py old mode 100644 new mode 100755 similarity index 100% rename from problems/longest-palindromic-substring.py rename to problems/python/longest-palindromic-substring.py diff --git a/problems/longest-repeating-character-replacement.py b/problems/python/longest-repeating-character-replacement.py old mode 100644 new mode 100755 similarity index 100% rename from problems/longest-repeating-character-replacement.py rename to problems/python/longest-repeating-character-replacement.py diff --git a/problems/longest-string-chain.py b/problems/python/longest-string-chain.py old mode 100644 new mode 100755 similarity index 100% rename from problems/longest-string-chain.py rename to problems/python/longest-string-chain.py diff --git a/problems/longest-substring-with-at-least-k-repeating-characters.py b/problems/python/longest-substring-with-at-least-k-repeating-characters.py old mode 100644 new mode 100755 similarity index 100% rename from problems/longest-substring-with-at-least-k-repeating-characters.py rename to problems/python/longest-substring-with-at-least-k-repeating-characters.py diff --git a/problems/longest-substring-without-repeating-characters.py b/problems/python/longest-substring-without-repeating-characters.py old mode 100644 new mode 100755 similarity index 100% rename from problems/longest-substring-without-repeating-characters.py rename to problems/python/longest-substring-without-repeating-characters.py diff --git a/problems/longest-univalue-path.py b/problems/python/longest-univalue-path.py old mode 100644 new mode 100755 similarity index 100% rename from problems/longest-univalue-path.py rename to problems/python/longest-univalue-path.py diff --git a/problems/lowest-common-ancestor-of-a-binary-search-tree.py b/problems/python/lowest-common-ancestor-of-a-binary-search-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/lowest-common-ancestor-of-a-binary-search-tree.py rename to problems/python/lowest-common-ancestor-of-a-binary-search-tree.py diff --git a/problems/lowest-common-ancestor-of-a-binary-search.py b/problems/python/lowest-common-ancestor-of-a-binary-search.py old mode 100644 new mode 100755 similarity index 100% rename from problems/lowest-common-ancestor-of-a-binary-search.py rename to problems/python/lowest-common-ancestor-of-a-binary-search.py diff --git a/problems/lowest-common-ancestor-of-a-binary-tree-ii.py b/problems/python/lowest-common-ancestor-of-a-binary-tree-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/lowest-common-ancestor-of-a-binary-tree-ii.py rename to problems/python/lowest-common-ancestor-of-a-binary-tree-ii.py diff --git a/problems/lowest-common-ancestor-of-a-binary-tree-iii.py b/problems/python/lowest-common-ancestor-of-a-binary-tree-iii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/lowest-common-ancestor-of-a-binary-tree-iii.py rename to problems/python/lowest-common-ancestor-of-a-binary-tree-iii.py diff --git a/problems/lowest-common-ancestor-of-a-binary-tree-iv.py b/problems/python/lowest-common-ancestor-of-a-binary-tree-iv.py old mode 100644 new mode 100755 similarity index 100% rename from problems/lowest-common-ancestor-of-a-binary-tree-iv.py rename to problems/python/lowest-common-ancestor-of-a-binary-tree-iv.py diff --git a/problems/lowest-common-ancestor-of-a-binary-tree.py b/problems/python/lowest-common-ancestor-of-a-binary-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/lowest-common-ancestor-of-a-binary-tree.py rename to problems/python/lowest-common-ancestor-of-a-binary-tree.py diff --git a/problems/lowest-common-ancestor-of-deepest-leaves.py b/problems/python/lowest-common-ancestor-of-deepest-leaves.py old mode 100644 new mode 100755 similarity index 100% rename from problems/lowest-common-ancestor-of-deepest-leaves.py rename to problems/python/lowest-common-ancestor-of-deepest-leaves.py diff --git a/problems/lru-cache.py b/problems/python/lru-cache.py old mode 100644 new mode 100755 similarity index 100% rename from problems/lru-cache.py rename to problems/python/lru-cache.py diff --git a/problems/majority-element-ii.py b/problems/python/majority-element-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/majority-element-ii.py rename to problems/python/majority-element-ii.py diff --git a/problems/majority-element.py b/problems/python/majority-element.py old mode 100644 new mode 100755 similarity index 100% rename from problems/majority-element.py rename to problems/python/majority-element.py diff --git a/problems/making-a-large-island.py b/problems/python/making-a-large-island.py old mode 100644 new mode 100755 similarity index 100% rename from problems/making-a-large-island.py rename to problems/python/making-a-large-island.py diff --git a/problems/max-area-of-island.py b/problems/python/max-area-of-island.py old mode 100644 new mode 100755 similarity index 100% rename from problems/max-area-of-island.py rename to problems/python/max-area-of-island.py diff --git a/problems/max-consecutive-ones-iii.py b/problems/python/max-consecutive-ones-iii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/max-consecutive-ones-iii.py rename to problems/python/max-consecutive-ones-iii.py diff --git a/problems/max-stack.py b/problems/python/max-stack.py old mode 100644 new mode 100755 similarity index 100% rename from problems/max-stack.py rename to problems/python/max-stack.py diff --git a/problems/max-sum-of-rectangle-no-larger-than-k.py b/problems/python/max-sum-of-rectangle-no-larger-than-k.py old mode 100644 new mode 100755 similarity index 100% rename from problems/max-sum-of-rectangle-no-larger-than-k.py rename to problems/python/max-sum-of-rectangle-no-larger-than-k.py diff --git a/problems/maximal-square.py b/problems/python/maximal-square.py old mode 100644 new mode 100755 similarity index 100% rename from problems/maximal-square.py rename to problems/python/maximal-square.py diff --git a/problems/maximum-average-subtree.py b/problems/python/maximum-average-subtree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/maximum-average-subtree.py rename to problems/python/maximum-average-subtree.py diff --git a/problems/maximum-compatibility-score-sum.py b/problems/python/maximum-compatibility-score-sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/maximum-compatibility-score-sum.py rename to problems/python/maximum-compatibility-score-sum.py diff --git a/problems/maximum-depth-of-binary-tree.py b/problems/python/maximum-depth-of-binary-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/maximum-depth-of-binary-tree.py rename to problems/python/maximum-depth-of-binary-tree.py diff --git a/problems/maximum-gap.py b/problems/python/maximum-gap.py old mode 100644 new mode 100755 similarity index 100% rename from problems/maximum-gap.py rename to problems/python/maximum-gap.py diff --git a/problems/maximum-length-of-repeated-subarray.py b/problems/python/maximum-length-of-repeated-subarray.py old mode 100644 new mode 100755 similarity index 100% rename from problems/maximum-length-of-repeated-subarray.py rename to problems/python/maximum-length-of-repeated-subarray.py diff --git a/problems/maximum-number-of-events-that-can-be-attended.py b/problems/python/maximum-number-of-events-that-can-be-attended.py old mode 100644 new mode 100755 similarity index 100% rename from problems/maximum-number-of-events-that-can-be-attended.py rename to problems/python/maximum-number-of-events-that-can-be-attended.py diff --git a/problems/maximum-number-of-points-with-cost.py b/problems/python/maximum-number-of-points-with-cost.py old mode 100644 new mode 100755 similarity index 100% rename from problems/maximum-number-of-points-with-cost.py rename to problems/python/maximum-number-of-points-with-cost.py diff --git a/problems/maximum-number-of-visible-points.py b/problems/python/maximum-number-of-visible-points.py old mode 100644 new mode 100755 similarity index 100% rename from problems/maximum-number-of-visible-points.py rename to problems/python/maximum-number-of-visible-points.py diff --git a/problems/maximum-product-of-three-numbers.py b/problems/python/maximum-product-of-three-numbers.py old mode 100644 new mode 100755 similarity index 100% rename from problems/maximum-product-of-three-numbers.py rename to problems/python/maximum-product-of-three-numbers.py diff --git a/problems/maximum-product-subarray.py b/problems/python/maximum-product-subarray.py old mode 100644 new mode 100755 similarity index 100% rename from problems/maximum-product-subarray.py rename to problems/python/maximum-product-subarray.py diff --git a/problems/maximum-subarray-sum-with-one-deletion.py b/problems/python/maximum-subarray-sum-with-one-deletion.py old mode 100644 new mode 100755 similarity index 100% rename from problems/maximum-subarray-sum-with-one-deletion.py rename to problems/python/maximum-subarray-sum-with-one-deletion.py diff --git a/problems/maximum-subarray.py b/problems/python/maximum-subarray.py old mode 100644 new mode 100755 similarity index 100% rename from problems/maximum-subarray.py rename to problems/python/maximum-subarray.py diff --git a/problems/maximum-swap.py b/problems/python/maximum-swap.py old mode 100644 new mode 100755 similarity index 100% rename from problems/maximum-swap.py rename to problems/python/maximum-swap.py diff --git a/problems/maximum-units-on-a-truck.py b/problems/python/maximum-units-on-a-truck.py old mode 100644 new mode 100755 similarity index 100% rename from problems/maximum-units-on-a-truck.py rename to problems/python/maximum-units-on-a-truck.py diff --git a/problems/median-of-two-sorted-arrays.py b/problems/python/median-of-two-sorted-arrays.py old mode 100644 new mode 100755 similarity index 100% rename from problems/median-of-two-sorted-arrays.py rename to problems/python/median-of-two-sorted-arrays.py diff --git a/problems/meeting-rooms-ii.py b/problems/python/meeting-rooms-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/meeting-rooms-ii.py rename to problems/python/meeting-rooms-ii.py diff --git a/problems/meeting-rooms.py b/problems/python/meeting-rooms.py old mode 100644 new mode 100755 similarity index 100% rename from problems/meeting-rooms.py rename to problems/python/meeting-rooms.py diff --git a/problems/merge-intervals.py b/problems/python/merge-intervals.py old mode 100644 new mode 100755 similarity index 100% rename from problems/merge-intervals.py rename to problems/python/merge-intervals.py diff --git a/problems/merge-k-sorted-lists.py b/problems/python/merge-k-sorted-lists.py old mode 100644 new mode 100755 similarity index 100% rename from problems/merge-k-sorted-lists.py rename to problems/python/merge-k-sorted-lists.py diff --git a/problems/merge-sorted-array.py b/problems/python/merge-sorted-array.py old mode 100644 new mode 100755 similarity index 100% rename from problems/merge-sorted-array.py rename to problems/python/merge-sorted-array.py diff --git a/problems/merge-two-sorted-lists.py b/problems/python/merge-two-sorted-lists.py old mode 100644 new mode 100755 similarity index 100% rename from problems/merge-two-sorted-lists.py rename to problems/python/merge-two-sorted-lists.py diff --git a/problems/min-cost-climbing-stairs.py b/problems/python/min-cost-climbing-stairs.py old mode 100644 new mode 100755 similarity index 100% rename from problems/min-cost-climbing-stairs.py rename to problems/python/min-cost-climbing-stairs.py diff --git a/problems/min-stack.py b/problems/python/min-stack.py old mode 100644 new mode 100755 similarity index 100% rename from problems/min-stack.py rename to problems/python/min-stack.py diff --git a/problems/minimize-malware-spread.py b/problems/python/minimize-malware-spread.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimize-malware-spread.py rename to problems/python/minimize-malware-spread.py diff --git a/problems/minimum-absolute-difference-in-bst.py b/problems/python/minimum-absolute-difference-in-bst.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-absolute-difference-in-bst.py rename to problems/python/minimum-absolute-difference-in-bst.py diff --git a/problems/minimum-ascii-delete-sum-for-two-strings.py b/problems/python/minimum-ascii-delete-sum-for-two-strings.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-ascii-delete-sum-for-two-strings.py rename to problems/python/minimum-ascii-delete-sum-for-two-strings.py diff --git a/problems/minimum-cost-to-connect-sticks.py b/problems/python/minimum-cost-to-connect-sticks.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-cost-to-connect-sticks.py rename to problems/python/minimum-cost-to-connect-sticks.py diff --git a/problems/minimum-cost-to-hire-k-workers.py b/problems/python/minimum-cost-to-hire-k-workers.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-cost-to-hire-k-workers.py rename to problems/python/minimum-cost-to-hire-k-workers.py diff --git a/problems/minimum-cost-to-make-at-least-one-valid-path-in-a-grid.py b/problems/python/minimum-cost-to-make-at-least-one-valid-path-in-a-grid.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-cost-to-make-at-least-one-valid-path-in-a-grid.py rename to problems/python/minimum-cost-to-make-at-least-one-valid-path-in-a-grid.py diff --git a/problems/minimum-cost-to-reach-city-with-discounts.py b/problems/python/minimum-cost-to-reach-city-with-discounts.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-cost-to-reach-city-with-discounts.py rename to problems/python/minimum-cost-to-reach-city-with-discounts.py diff --git a/problems/minimum-depth-of-binary-tree.py b/problems/python/minimum-depth-of-binary-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-depth-of-binary-tree.py rename to problems/python/minimum-depth-of-binary-tree.py diff --git a/problems/minimum-difficulty-of-a-job-schedule.py b/problems/python/minimum-difficulty-of-a-job-schedule.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-difficulty-of-a-job-schedule.py rename to problems/python/minimum-difficulty-of-a-job-schedule.py diff --git a/problems/minimum-falling-path-sum-ii.py b/problems/python/minimum-falling-path-sum-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-falling-path-sum-ii.py rename to problems/python/minimum-falling-path-sum-ii.py diff --git a/problems/minimum-knight-moves.py b/problems/python/minimum-knight-moves.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-knight-moves.py rename to problems/python/minimum-knight-moves.py diff --git a/problems/minimum-number-of-flips-to-convert-binary-matrix-to-zero-matrix.py b/problems/python/minimum-number-of-flips-to-convert-binary-matrix-to-zero-matrix.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-number-of-flips-to-convert-binary-matrix-to-zero-matrix.py rename to problems/python/minimum-number-of-flips-to-convert-binary-matrix-to-zero-matrix.py diff --git a/problems/minimum-path-sum.py b/problems/python/minimum-path-sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-path-sum.py rename to problems/python/minimum-path-sum.py diff --git a/problems/minimum-score-triangulation-of-polygon.py b/problems/python/minimum-score-triangulation-of-polygon.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-score-triangulation-of-polygon.py rename to problems/python/minimum-score-triangulation-of-polygon.py diff --git a/problems/minimum-size-subarray-sum.py b/problems/python/minimum-size-subarray-sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-size-subarray-sum.py rename to problems/python/minimum-size-subarray-sum.py diff --git a/problems/minimum-swaps-to-group-all-1s-together.py b/problems/python/minimum-swaps-to-group-all-1s-together.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-swaps-to-group-all-1s-together.py rename to problems/python/minimum-swaps-to-group-all-1s-together.py diff --git a/problems/minimum-swaps-to-make-sequences-increasing.py b/problems/python/minimum-swaps-to-make-sequences-increasing.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-swaps-to-make-sequences-increasing.py rename to problems/python/minimum-swaps-to-make-sequences-increasing.py diff --git a/problems/minimum-time-difference.py b/problems/python/minimum-time-difference.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-time-difference.py rename to problems/python/minimum-time-difference.py diff --git a/problems/minimum-window-substring.py b/problems/python/minimum-window-substring.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-window-substring.py rename to problems/python/minimum-window-substring.py diff --git a/problems/minimum-xor-sum-of-two-arrays.py b/problems/python/minimum-xor-sum-of-two-arrays.py old mode 100644 new mode 100755 similarity index 100% rename from problems/minimum-xor-sum-of-two-arrays.py rename to problems/python/minimum-xor-sum-of-two-arrays.py diff --git a/problems/missing-number.py b/problems/python/missing-number.py old mode 100644 new mode 100755 similarity index 100% rename from problems/missing-number.py rename to problems/python/missing-number.py diff --git a/problems/most-frequent-subtree-sum.py b/problems/python/most-frequent-subtree-sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/most-frequent-subtree-sum.py rename to problems/python/most-frequent-subtree-sum.py diff --git a/problems/most-stones-removed-with-same-row-or-column.py b/problems/python/most-stones-removed-with-same-row-or-column.py old mode 100644 new mode 100755 similarity index 100% rename from problems/most-stones-removed-with-same-row-or-column.py rename to problems/python/most-stones-removed-with-same-row-or-column.py diff --git a/problems/move-zeroes.py b/problems/python/move-zeroes.py old mode 100644 new mode 100755 similarity index 100% rename from problems/move-zeroes.py rename to problems/python/move-zeroes.py diff --git a/problems/moving-average-from-data-stream.py b/problems/python/moving-average-from-data-stream.py old mode 100644 new mode 100755 similarity index 100% rename from problems/moving-average-from-data-stream.py rename to problems/python/moving-average-from-data-stream.py diff --git a/problems/my-calendar-ii.py b/problems/python/my-calendar-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/my-calendar-ii.py rename to problems/python/my-calendar-ii.py diff --git a/problems/n-ary-tree-level-order-traversal.py b/problems/python/n-ary-tree-level-order-traversal.py old mode 100644 new mode 100755 similarity index 100% rename from problems/n-ary-tree-level-order-traversal.py rename to problems/python/n-ary-tree-level-order-traversal.py diff --git a/problems/n-ary-tree-postorder-traversal.py b/problems/python/n-ary-tree-postorder-traversal.py old mode 100644 new mode 100755 similarity index 100% rename from problems/n-ary-tree-postorder-traversal.py rename to problems/python/n-ary-tree-postorder-traversal.py diff --git a/problems/n-ary-tree-preorder-traversal.py b/problems/python/n-ary-tree-preorder-traversal.py old mode 100644 new mode 100755 similarity index 100% rename from problems/n-ary-tree-preorder-traversal.py rename to problems/python/n-ary-tree-preorder-traversal.py diff --git a/problems/nested-list-weight-sum.py b/problems/python/nested-list-weight-sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/nested-list-weight-sum.py rename to problems/python/nested-list-weight-sum.py diff --git a/problems/network-delay-time.py b/problems/python/network-delay-time.py old mode 100644 new mode 100755 similarity index 100% rename from problems/network-delay-time.py rename to problems/python/network-delay-time.py diff --git a/problems/next-closest-time.py b/problems/python/next-closest-time.py old mode 100644 new mode 100755 similarity index 100% rename from problems/next-closest-time.py rename to problems/python/next-closest-time.py diff --git a/problems/next-permutation.py b/problems/python/next-permutation.py old mode 100644 new mode 100755 similarity index 100% rename from problems/next-permutation.py rename to problems/python/next-permutation.py diff --git a/problems/number-complement.py b/problems/python/number-complement.py old mode 100644 new mode 100755 similarity index 100% rename from problems/number-complement.py rename to problems/python/number-complement.py diff --git a/problems/number-of-connected-components-in-an-undirected-graph.py b/problems/python/number-of-connected-components-in-an-undirected-graph.py old mode 100644 new mode 100755 similarity index 100% rename from problems/number-of-connected-components-in-an-undirected-graph.py rename to problems/python/number-of-connected-components-in-an-undirected-graph.py diff --git a/problems/number-of-islands-ii.py b/problems/python/number-of-islands-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/number-of-islands-ii.py rename to problems/python/number-of-islands-ii.py diff --git a/problems/number-of-islands.py b/problems/python/number-of-islands.py old mode 100644 new mode 100755 similarity index 100% rename from problems/number-of-islands.py rename to problems/python/number-of-islands.py diff --git a/problems/number-of-longest-increasing-subsequence.py b/problems/python/number-of-longest-increasing-subsequence.py old mode 100644 new mode 100755 similarity index 100% rename from problems/number-of-longest-increasing-subsequence.py rename to problems/python/number-of-longest-increasing-subsequence.py diff --git a/problems/number-of-matching-subsequences.py b/problems/python/number-of-matching-subsequences.py old mode 100644 new mode 100755 similarity index 100% rename from problems/number-of-matching-subsequences.py rename to problems/python/number-of-matching-subsequences.py diff --git a/problems/number-of-provinces.py b/problems/python/number-of-provinces.py old mode 100644 new mode 100755 similarity index 100% rename from problems/number-of-provinces.py rename to problems/python/number-of-provinces.py diff --git a/problems/number-of-recent-calls.py b/problems/python/number-of-recent-calls.py old mode 100644 new mode 100755 similarity index 100% rename from problems/number-of-recent-calls.py rename to problems/python/number-of-recent-calls.py diff --git a/problems/number-of-squareful-arrays.py b/problems/python/number-of-squareful-arrays.py old mode 100644 new mode 100755 similarity index 100% rename from problems/number-of-squareful-arrays.py rename to problems/python/number-of-squareful-arrays.py diff --git a/problems/number-of-substrings-containing-all-thre.py b/problems/python/number-of-substrings-containing-all-thre.py old mode 100644 new mode 100755 similarity index 100% rename from problems/number-of-substrings-containing-all-thre.py rename to problems/python/number-of-substrings-containing-all-thre.py diff --git a/problems/number-of-ways-to-arrive-at-destination.py b/problems/python/number-of-ways-to-arrive-at-destination.py old mode 100644 new mode 100755 similarity index 100% rename from problems/number-of-ways-to-arrive-at-destination.py rename to problems/python/number-of-ways-to-arrive-at-destination.py diff --git a/problems/odd-even-jump.py b/problems/python/odd-even-jump.py old mode 100644 new mode 100755 similarity index 100% rename from problems/odd-even-jump.py rename to problems/python/odd-even-jump.py diff --git a/problems/ones-and-zeroes.py b/problems/python/ones-and-zeroes.py old mode 100644 new mode 100755 similarity index 100% rename from problems/ones-and-zeroes.py rename to problems/python/ones-and-zeroes.py diff --git a/problems/open-the-lock.py b/problems/python/open-the-lock.py old mode 100644 new mode 100755 similarity index 100% rename from problems/open-the-lock.py rename to problems/python/open-the-lock.py diff --git a/problems/out-of-boundary-paths.py b/problems/python/out-of-boundary-paths.py old mode 100644 new mode 100755 similarity index 100% rename from problems/out-of-boundary-paths.py rename to problems/python/out-of-boundary-paths.py diff --git a/problems/pacific-atlantic-water-flow.py b/problems/python/pacific-atlantic-water-flow.py old mode 100644 new mode 100755 similarity index 100% rename from problems/pacific-atlantic-water-flow.py rename to problems/python/pacific-atlantic-water-flow.py diff --git a/problems/pairs-of-songs-with-total-durations-divisible-by-60.py b/problems/python/pairs-of-songs-with-total-durations-divisible-by-60.py old mode 100644 new mode 100755 similarity index 100% rename from problems/pairs-of-songs-with-total-durations-divisible-by-60.py rename to problems/python/pairs-of-songs-with-total-durations-divisible-by-60.py diff --git a/problems/palindrome-number.py b/problems/python/palindrome-number.py old mode 100644 new mode 100755 similarity index 100% rename from problems/palindrome-number.py rename to problems/python/palindrome-number.py diff --git a/problems/palindrome-pairs.py b/problems/python/palindrome-pairs.py old mode 100644 new mode 100755 similarity index 100% rename from problems/palindrome-pairs.py rename to problems/python/palindrome-pairs.py diff --git a/problems/palindrome-partitioning-iii.py b/problems/python/palindrome-partitioning-iii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/palindrome-partitioning-iii.py rename to problems/python/palindrome-partitioning-iii.py diff --git a/problems/palindrome-partitioning.py b/problems/python/palindrome-partitioning.py old mode 100644 new mode 100755 similarity index 100% rename from problems/palindrome-partitioning.py rename to problems/python/palindrome-partitioning.py diff --git a/problems/palindromic-substrings.py b/problems/python/palindromic-substrings.py old mode 100644 new mode 100755 similarity index 100% rename from problems/palindromic-substrings.py rename to problems/python/palindromic-substrings.py diff --git a/problems/partition-array-for-maximum-sum.py b/problems/python/partition-array-for-maximum-sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/partition-array-for-maximum-sum.py rename to problems/python/partition-array-for-maximum-sum.py diff --git a/problems/partition-labels.py b/problems/python/partition-labels.py old mode 100644 new mode 100755 similarity index 100% rename from problems/partition-labels.py rename to problems/python/partition-labels.py diff --git a/problems/partition-to-k-equal-sum-subsets.py b/problems/python/partition-to-k-equal-sum-subsets.py old mode 100644 new mode 100755 similarity index 100% rename from problems/partition-to-k-equal-sum-subsets.py rename to problems/python/partition-to-k-equal-sum-subsets.py diff --git a/problems/path-sum-ii.py b/problems/python/path-sum-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/path-sum-ii.py rename to problems/python/path-sum-ii.py diff --git a/problems/path-sum-iii.py b/problems/python/path-sum-iii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/path-sum-iii.py rename to problems/python/path-sum-iii.py diff --git a/problems/path-sum.py b/problems/python/path-sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/path-sum.py rename to problems/python/path-sum.py diff --git a/problems/path-with-maximum-probability.py b/problems/python/path-with-maximum-probability.py old mode 100644 new mode 100755 similarity index 100% rename from problems/path-with-maximum-probability.py rename to problems/python/path-with-maximum-probability.py diff --git a/problems/peak-index-in-a-mountain-array.PY b/problems/python/peak-index-in-a-mountain-array.py old mode 100644 new mode 100755 similarity index 100% rename from problems/peak-index-in-a-mountain-array.PY rename to problems/python/peak-index-in-a-mountain-array.py diff --git a/problems/perfect-squares.py b/problems/python/perfect-squares.py old mode 100644 new mode 100755 similarity index 100% rename from problems/perfect-squares.py rename to problems/python/perfect-squares.py diff --git a/problems/permutation-in-string.py b/problems/python/permutation-in-string.py old mode 100644 new mode 100755 similarity index 100% rename from problems/permutation-in-string.py rename to problems/python/permutation-in-string.py diff --git a/problems/permutation-sequence.py b/problems/python/permutation-sequence.py old mode 100644 new mode 100755 similarity index 100% rename from problems/permutation-sequence.py rename to problems/python/permutation-sequence.py diff --git a/problems/permutations-ii.py b/problems/python/permutations-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/permutations-ii.py rename to problems/python/permutations-ii.py diff --git a/problems/permutations.py b/problems/python/permutations.py old mode 100644 new mode 100755 similarity index 100% rename from problems/permutations.py rename to problems/python/permutations.py diff --git a/problems/populating-next-right-pointers-in-each-node-ii.py b/problems/python/populating-next-right-pointers-in-each-node-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/populating-next-right-pointers-in-each-node-ii.py rename to problems/python/populating-next-right-pointers-in-each-node-ii.py diff --git a/problems/populating-next-right-pointers-in-each-node.py b/problems/python/populating-next-right-pointers-in-each-node.py old mode 100644 new mode 100755 similarity index 100% rename from problems/populating-next-right-pointers-in-each-node.py rename to problems/python/populating-next-right-pointers-in-each-node.py diff --git a/problems/powx-n.py b/problems/python/powx-n.py old mode 100644 new mode 100755 similarity index 100% rename from problems/powx-n.py rename to problems/python/powx-n.py diff --git a/problems/product-of-array-except-self.py b/problems/python/product-of-array-except-self.py old mode 100644 new mode 100755 similarity index 100% rename from problems/product-of-array-except-self.py rename to problems/python/product-of-array-except-self.py diff --git a/problems/profitable-schemes.py b/problems/python/profitable-schemes.py old mode 100644 new mode 100755 similarity index 100% rename from problems/profitable-schemes.py rename to problems/python/profitable-schemes.py diff --git a/problems/queue-reconstruction-by-height.py b/problems/python/queue-reconstruction-by-height.py old mode 100644 new mode 100755 similarity index 100% rename from problems/queue-reconstruction-by-height.py rename to problems/python/queue-reconstruction-by-height.py diff --git a/problems/random-pick-with-weight.py b/problems/python/random-pick-with-weight.py old mode 100644 new mode 100755 similarity index 100% rename from problems/random-pick-with-weight.py rename to problems/python/random-pick-with-weight.py diff --git a/problems/range-addition.py b/problems/python/range-addition.py old mode 100644 new mode 100755 similarity index 100% rename from problems/range-addition.py rename to problems/python/range-addition.py diff --git a/problems/range-sum-of-bst.py b/problems/python/range-sum-of-bst.py old mode 100644 new mode 100755 similarity index 100% rename from problems/range-sum-of-bst.py rename to problems/python/range-sum-of-bst.py diff --git a/problems/range-sum-query-immutable.py b/problems/python/range-sum-query-immutable.py old mode 100644 new mode 100755 similarity index 100% rename from problems/range-sum-query-immutable.py rename to problems/python/range-sum-query-immutable.py diff --git a/problems/range-sum-query-mutable.py b/problems/python/range-sum-query-mutable.py old mode 100644 new mode 100755 similarity index 100% rename from problems/range-sum-query-mutable.py rename to problems/python/range-sum-query-mutable.py diff --git a/problems/rearrange-string-k-distance-apart.py b/problems/python/rearrange-string-k-distance-apart.py old mode 100644 new mode 100755 similarity index 100% rename from problems/rearrange-string-k-distance-apart.py rename to problems/python/rearrange-string-k-distance-apart.py diff --git a/problems/reconstruct-itinerary.py b/problems/python/reconstruct-itinerary.py old mode 100644 new mode 100755 similarity index 100% rename from problems/reconstruct-itinerary.py rename to problems/python/reconstruct-itinerary.py diff --git a/problems/recover-binary-search-tree.py b/problems/python/recover-binary-search-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/recover-binary-search-tree.py rename to problems/python/recover-binary-search-tree.py diff --git a/problems/redundant-connection.py b/problems/python/redundant-connection.py old mode 100644 new mode 100755 similarity index 100% rename from problems/redundant-connection.py rename to problems/python/redundant-connection.py diff --git a/problems/remove-all-adjacent-duplicates-in-string.py b/problems/python/remove-all-adjacent-duplicates-in-string.py old mode 100644 new mode 100755 similarity index 100% rename from problems/remove-all-adjacent-duplicates-in-string.py rename to problems/python/remove-all-adjacent-duplicates-in-string.py diff --git a/problems/remove-all-ones-with-row-and-column-flips.py b/problems/python/remove-all-ones-with-row-and-column-flips.py old mode 100644 new mode 100755 similarity index 100% rename from problems/remove-all-ones-with-row-and-column-flips.py rename to problems/python/remove-all-ones-with-row-and-column-flips.py diff --git a/problems/remove-duplicates-from-sorted-array-ii.py b/problems/python/remove-duplicates-from-sorted-array-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/remove-duplicates-from-sorted-array-ii.py rename to problems/python/remove-duplicates-from-sorted-array-ii.py diff --git a/problems/remove-duplicates-from-sorted-array.py b/problems/python/remove-duplicates-from-sorted-array.py old mode 100644 new mode 100755 similarity index 100% rename from problems/remove-duplicates-from-sorted-array.py rename to problems/python/remove-duplicates-from-sorted-array.py diff --git a/problems/remove-duplicates-from-sorted-list.py b/problems/python/remove-duplicates-from-sorted-list.py old mode 100644 new mode 100755 similarity index 100% rename from problems/remove-duplicates-from-sorted-list.py rename to problems/python/remove-duplicates-from-sorted-list.py diff --git a/problems/remove-element.py b/problems/python/remove-element.py old mode 100644 new mode 100755 similarity index 100% rename from problems/remove-element.py rename to problems/python/remove-element.py diff --git a/problems/remove-invalid-parentheses.py b/problems/python/remove-invalid-parentheses.py old mode 100644 new mode 100755 similarity index 100% rename from problems/remove-invalid-parentheses.py rename to problems/python/remove-invalid-parentheses.py diff --git a/problems/remove-linked-list-elements.py b/problems/python/remove-linked-list-elements.py old mode 100644 new mode 100755 similarity index 100% rename from problems/remove-linked-list-elements.py rename to problems/python/remove-linked-list-elements.py diff --git a/problems/remove-nth-node-from-end-of-list.py b/problems/python/remove-nth-node-from-end-of-list.py old mode 100644 new mode 100755 similarity index 100% rename from problems/remove-nth-node-from-end-of-list.py rename to problems/python/remove-nth-node-from-end-of-list.py diff --git a/problems/reorder-list.py b/problems/python/reorder-list.py old mode 100644 new mode 100755 similarity index 100% rename from problems/reorder-list.py rename to problems/python/reorder-list.py diff --git a/problems/repeated-string-match.py b/problems/python/repeated-string-match.py old mode 100644 new mode 100755 similarity index 100% rename from problems/repeated-string-match.py rename to problems/python/repeated-string-match.py diff --git a/problems/replace-the-substring-for-balanced-string.py b/problems/python/replace-the-substring-for-balanced-string.py old mode 100644 new mode 100755 similarity index 100% rename from problems/replace-the-substring-for-balanced-string.py rename to problems/python/replace-the-substring-for-balanced-string.py diff --git a/problems/restore-ip-addresses.py b/problems/python/restore-ip-addresses.py old mode 100644 new mode 100755 similarity index 100% rename from problems/restore-ip-addresses.py rename to problems/python/restore-ip-addresses.py diff --git a/problems/reverse-integer.py b/problems/python/reverse-integer.py old mode 100644 new mode 100755 similarity index 100% rename from problems/reverse-integer.py rename to problems/python/reverse-integer.py diff --git a/problems/reverse-linked-list.py b/problems/python/reverse-linked-list.py old mode 100644 new mode 100755 similarity index 100% rename from problems/reverse-linked-list.py rename to problems/python/reverse-linked-list.py diff --git a/problems/reverse-string.py b/problems/python/reverse-string.py old mode 100644 new mode 100755 similarity index 100% rename from problems/reverse-string.py rename to problems/python/reverse-string.py diff --git a/problems/reverse-vowels-of-a-string.py b/problems/python/reverse-vowels-of-a-string.py old mode 100644 new mode 100755 similarity index 100% rename from problems/reverse-vowels-of-a-string.py rename to problems/python/reverse-vowels-of-a-string.py diff --git a/problems/reverse-words-in-a-string.py b/problems/python/reverse-words-in-a-string.py old mode 100644 new mode 100755 similarity index 100% rename from problems/reverse-words-in-a-string.py rename to problems/python/reverse-words-in-a-string.py diff --git a/problems/robot-bounded-in-circle.py b/problems/python/robot-bounded-in-circle.py old mode 100644 new mode 100755 similarity index 100% rename from problems/robot-bounded-in-circle.py rename to problems/python/robot-bounded-in-circle.py diff --git a/problems/roman-to-integer.py b/problems/python/roman-to-integer.py old mode 100644 new mode 100755 similarity index 100% rename from problems/roman-to-integer.py rename to problems/python/roman-to-integer.py diff --git a/problems/rotate-array.py b/problems/python/rotate-array.py old mode 100644 new mode 100755 similarity index 100% rename from problems/rotate-array.py rename to problems/python/rotate-array.py diff --git a/problems/rotate-image.py b/problems/python/rotate-image.py old mode 100644 new mode 100755 similarity index 100% rename from problems/rotate-image.py rename to problems/python/rotate-image.py diff --git a/problems/russian-doll-envelopes.py b/problems/python/russian-doll-envelopes.py old mode 100644 new mode 100755 similarity index 100% rename from problems/russian-doll-envelopes.py rename to problems/python/russian-doll-envelopes.py diff --git a/problems/same-tree.py b/problems/python/same-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/same-tree.py rename to problems/python/same-tree.py diff --git a/problems/satisfiability-of-equality-equations.py b/problems/python/satisfiability-of-equality-equations.py old mode 100644 new mode 100755 similarity index 100% rename from problems/satisfiability-of-equality-equations.py rename to problems/python/satisfiability-of-equality-equations.py diff --git a/problems/score-of-parentheses.py b/problems/python/score-of-parentheses.py old mode 100644 new mode 100755 similarity index 100% rename from problems/score-of-parentheses.py rename to problems/python/score-of-parentheses.py diff --git a/problems/search-a-2d-matrix.py b/problems/python/search-a-2d-matrix.py old mode 100644 new mode 100755 similarity index 100% rename from problems/search-a-2d-matrix.py rename to problems/python/search-a-2d-matrix.py diff --git a/problems/search-in-a-binary-search-tree.py b/problems/python/search-in-a-binary-search-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/search-in-a-binary-search-tree.py rename to problems/python/search-in-a-binary-search-tree.py diff --git a/problems/search-in-rotated-sorted-array-ii.py b/problems/python/search-in-rotated-sorted-array-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/search-in-rotated-sorted-array-ii.py rename to problems/python/search-in-rotated-sorted-array-ii.py diff --git a/problems/search-in-rotated-sorted-array.py b/problems/python/search-in-rotated-sorted-array.py old mode 100644 new mode 100755 similarity index 100% rename from problems/search-in-rotated-sorted-array.py rename to problems/python/search-in-rotated-sorted-array.py diff --git a/problems/search-insert-position.py b/problems/python/search-insert-position.py old mode 100644 new mode 100755 similarity index 100% rename from problems/search-insert-position.py rename to problems/python/search-insert-position.py diff --git a/problems/search-suggestions-system.py b/problems/python/search-suggestions-system.py old mode 100644 new mode 100755 similarity index 100% rename from problems/search-suggestions-system.py rename to problems/python/search-suggestions-system.py diff --git a/problems/second-highest-salary.sql b/problems/python/second-highest-salary.sql old mode 100644 new mode 100755 similarity index 100% rename from problems/second-highest-salary.sql rename to problems/python/second-highest-salary.sql diff --git a/problems/sell-diminishing-valued-colored-balls.py b/problems/python/sell-diminishing-valued-colored-balls.py old mode 100644 new mode 100755 similarity index 100% rename from problems/sell-diminishing-valued-colored-balls.py rename to problems/python/sell-diminishing-valued-colored-balls.py diff --git a/problems/serialize-and-deserialize-binary-tree.py b/problems/python/serialize-and-deserialize-binary-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/serialize-and-deserialize-binary-tree.py rename to problems/python/serialize-and-deserialize-binary-tree.py diff --git a/problems/serialize-and-deserialize-bst.py b/problems/python/serialize-and-deserialize-bst.py old mode 100644 new mode 100755 similarity index 100% rename from problems/serialize-and-deserialize-bst.py rename to problems/python/serialize-and-deserialize-bst.py diff --git a/problems/set-matrix-zeroes.py b/problems/python/set-matrix-zeroes.py old mode 100644 new mode 100755 similarity index 100% rename from problems/set-matrix-zeroes.py rename to problems/python/set-matrix-zeroes.py diff --git a/problems/shortest-bridge.py b/problems/python/shortest-bridge.py old mode 100644 new mode 100755 similarity index 100% rename from problems/shortest-bridge.py rename to problems/python/shortest-bridge.py diff --git a/problems/shortest-common-supersequence.py b/problems/python/shortest-common-supersequence.py old mode 100644 new mode 100755 similarity index 100% rename from problems/shortest-common-supersequence.py rename to problems/python/shortest-common-supersequence.py diff --git a/problems/shortest-distance-from-all-buildings.py b/problems/python/shortest-distance-from-all-buildings.py old mode 100644 new mode 100755 similarity index 100% rename from problems/shortest-distance-from-all-buildings.py rename to problems/python/shortest-distance-from-all-buildings.py diff --git a/problems/shortest-path-in-a-grid-with-obstacles-elimination.py b/problems/python/shortest-path-in-a-grid-with-obstacles-elimination.py old mode 100644 new mode 100755 similarity index 100% rename from problems/shortest-path-in-a-grid-with-obstacles-elimination.py rename to problems/python/shortest-path-in-a-grid-with-obstacles-elimination.py diff --git a/problems/shortest-path-in-binary-matrix.py b/problems/python/shortest-path-in-binary-matrix.py old mode 100644 new mode 100755 similarity index 100% rename from problems/shortest-path-in-binary-matrix.py rename to problems/python/shortest-path-in-binary-matrix.py diff --git a/problems/shortest-path-to-get-food.py b/problems/python/shortest-path-to-get-food.py old mode 100644 new mode 100755 similarity index 100% rename from problems/shortest-path-to-get-food.py rename to problems/python/shortest-path-to-get-food.py diff --git a/problems/shuffle-an-array.py b/problems/python/shuffle-an-array.py old mode 100644 new mode 100755 similarity index 100% rename from problems/shuffle-an-array.py rename to problems/python/shuffle-an-array.py diff --git a/problems/simplify-path.py b/problems/python/simplify-path.py old mode 100644 new mode 100755 similarity index 100% rename from problems/simplify-path.py rename to problems/python/simplify-path.py diff --git a/problems/single-threaded-cpu.py b/problems/python/single-threaded-cpu.py old mode 100644 new mode 100755 similarity index 100% rename from problems/single-threaded-cpu.py rename to problems/python/single-threaded-cpu.py diff --git a/problems/sliding-window-maximum.py b/problems/python/sliding-window-maximum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/sliding-window-maximum.py rename to problems/python/sliding-window-maximum.py diff --git a/problems/snapshot-array.py b/problems/python/snapshot-array.py old mode 100644 new mode 100755 similarity index 100% rename from problems/snapshot-array.py rename to problems/python/snapshot-array.py diff --git a/problems/sort-colors.py b/problems/python/sort-colors.py old mode 100644 new mode 100755 similarity index 100% rename from problems/sort-colors.py rename to problems/python/sort-colors.py diff --git a/problems/sort-list.py b/problems/python/sort-list.py old mode 100644 new mode 100755 similarity index 100% rename from problems/sort-list.py rename to problems/python/sort-list.py diff --git a/problems/spiral-matrix.py b/problems/python/spiral-matrix.py old mode 100644 new mode 100755 similarity index 100% rename from problems/spiral-matrix.py rename to problems/python/spiral-matrix.py diff --git a/problems/split-array-into-fibonacci-sequence.py b/problems/python/split-array-into-fibonacci-sequence.py old mode 100644 new mode 100755 similarity index 100% rename from problems/split-array-into-fibonacci-sequence.py rename to problems/python/split-array-into-fibonacci-sequence.py diff --git a/problems/split-array-largest-sum.py b/problems/python/split-array-largest-sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/split-array-largest-sum.py rename to problems/python/split-array-largest-sum.py diff --git a/problems/sqrtx.py b/problems/python/sqrtx.py old mode 100644 new mode 100755 similarity index 100% rename from problems/sqrtx.py rename to problems/python/sqrtx.py diff --git a/problems/squares-of-a-sorted-array.py b/problems/python/squares-of-a-sorted-array.py old mode 100644 new mode 100755 similarity index 100% rename from problems/squares-of-a-sorted-array.py rename to problems/python/squares-of-a-sorted-array.py diff --git a/problems/step-by-step-directions-from-a-binary-tree-node-to-another.py b/problems/python/step-by-step-directions-from-a-binary-tree-node-to-another.py old mode 100644 new mode 100755 similarity index 100% rename from problems/step-by-step-directions-from-a-binary-tree-node-to-another.py rename to problems/python/step-by-step-directions-from-a-binary-tree-node-to-another.py diff --git a/problems/stock-price-fluctuation.py b/problems/python/stock-price-fluctuation.py old mode 100644 new mode 100755 similarity index 100% rename from problems/stock-price-fluctuation.py rename to problems/python/stock-price-fluctuation.py diff --git a/problems/stone-game-ii.py b/problems/python/stone-game-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/stone-game-ii.py rename to problems/python/stone-game-ii.py diff --git a/problems/student-attendance-record-ii.py b/problems/python/student-attendance-record-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/student-attendance-record-ii.py rename to problems/python/student-attendance-record-ii.py diff --git a/problems/subarray-sum-equals-k.py b/problems/python/subarray-sum-equals-k.py old mode 100644 new mode 100755 similarity index 100% rename from problems/subarray-sum-equals-k.py rename to problems/python/subarray-sum-equals-k.py diff --git a/problems/subarrays-with-k-different-integers.py b/problems/python/subarrays-with-k-different-integers.py old mode 100644 new mode 100755 similarity index 100% rename from problems/subarrays-with-k-different-integers.py rename to problems/python/subarrays-with-k-different-integers.py diff --git a/problems/subdomain-visit-count.py b/problems/python/subdomain-visit-count.py old mode 100644 new mode 100755 similarity index 100% rename from problems/subdomain-visit-count.py rename to problems/python/subdomain-visit-count.py diff --git a/problems/subsets-ii.py b/problems/python/subsets-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/subsets-ii.py rename to problems/python/subsets-ii.py diff --git a/problems/subsets.py b/problems/python/subsets.py old mode 100644 new mode 100755 similarity index 100% rename from problems/subsets.py rename to problems/python/subsets.py diff --git a/problems/substring-with-concatenation-of-all-words.py b/problems/python/substring-with-concatenation-of-all-words.py old mode 100644 new mode 100755 similarity index 99% rename from problems/substring-with-concatenation-of-all-words.py rename to problems/python/substring-with-concatenation-of-all-words.py index b11bb81..e3e6420 --- a/problems/substring-with-concatenation-of-all-words.py +++ b/problems/python/substring-with-concatenation-of-all-words.py @@ -47,4 +47,6 @@ def test(self, s, wl, countExpected): return True - \ No newline at end of file + + + diff --git a/problems/subtree-of-another-tree.py b/problems/python/subtree-of-another-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/subtree-of-another-tree.py rename to problems/python/subtree-of-another-tree.py diff --git a/problems/sum-of-subarray-minimums.py b/problems/python/sum-of-subarray-minimums.py old mode 100644 new mode 100755 similarity index 100% rename from problems/sum-of-subarray-minimums.py rename to problems/python/sum-of-subarray-minimums.py diff --git a/problems/sum-root-to-leaf-numbers.py b/problems/python/sum-root-to-leaf-numbers.py old mode 100644 new mode 100755 similarity index 100% rename from problems/sum-root-to-leaf-numbers.py rename to problems/python/sum-root-to-leaf-numbers.py diff --git a/problems/summary-ranges.py b/problems/python/summary-ranges.py old mode 100644 new mode 100755 similarity index 100% rename from problems/summary-ranges.py rename to problems/python/summary-ranges.py diff --git a/problems/super-ugly-number.py b/problems/python/super-ugly-number.py old mode 100644 new mode 100755 similarity index 100% rename from problems/super-ugly-number.py rename to problems/python/super-ugly-number.py diff --git a/problems/swap-adjacent-in-lr-string.py b/problems/python/swap-adjacent-in-lr-string.py old mode 100644 new mode 100755 similarity index 100% rename from problems/swap-adjacent-in-lr-string.py rename to problems/python/swap-adjacent-in-lr-string.py diff --git a/problems/swap-nodes-in-pairs.py b/problems/python/swap-nodes-in-pairs.py old mode 100644 new mode 100755 similarity index 100% rename from problems/swap-nodes-in-pairs.py rename to problems/python/swap-nodes-in-pairs.py diff --git a/problems/swim-in-rising-water.py b/problems/python/swim-in-rising-water.py old mode 100644 new mode 100755 similarity index 100% rename from problems/swim-in-rising-water.py rename to problems/python/swim-in-rising-water.py diff --git a/problems/symmetric-tree.py b/problems/python/symmetric-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/symmetric-tree.py rename to problems/python/symmetric-tree.py diff --git a/problems/tallest-billboard.py b/problems/python/tallest-billboard.py old mode 100644 new mode 100755 similarity index 100% rename from problems/tallest-billboard.py rename to problems/python/tallest-billboard.py diff --git a/problems/target-sum.py b/problems/python/target-sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/target-sum.py rename to problems/python/target-sum.py diff --git a/problems/task-scheduler.py b/problems/python/task-scheduler.py old mode 100644 new mode 100755 similarity index 100% rename from problems/task-scheduler.py rename to problems/python/task-scheduler.py diff --git a/problems/text-justification.py b/problems/python/text-justification.py old mode 100644 new mode 100755 similarity index 100% rename from problems/text-justification.py rename to problems/python/text-justification.py diff --git a/problems/the-kth-factor-of-n.py b/problems/python/the-kth-factor-of-n.py old mode 100644 new mode 100755 similarity index 100% rename from problems/the-kth-factor-of-n.py rename to problems/python/the-kth-factor-of-n.py diff --git a/problems/the-maze-ii.py b/problems/python/the-maze-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/the-maze-ii.py rename to problems/python/the-maze-ii.py diff --git a/problems/time-based-key-value-store.py b/problems/python/time-based-key-value-store.py old mode 100644 new mode 100755 similarity index 100% rename from problems/time-based-key-value-store.py rename to problems/python/time-based-key-value-store.py diff --git a/problems/to-lower-case.py b/problems/python/to-lower-case.py old mode 100644 new mode 100755 similarity index 100% rename from problems/to-lower-case.py rename to problems/python/to-lower-case.py diff --git a/problems/toeplitz-matrix.py b/problems/python/toeplitz-matrix.py old mode 100644 new mode 100755 similarity index 100% rename from problems/toeplitz-matrix.py rename to problems/python/toeplitz-matrix.py diff --git a/problems/top-k-frequent-elements.py b/problems/python/top-k-frequent-elements.py old mode 100644 new mode 100755 similarity index 100% rename from problems/top-k-frequent-elements.py rename to problems/python/top-k-frequent-elements.py diff --git a/problems/trapping-rain-water-ii.py b/problems/python/trapping-rain-water-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/trapping-rain-water-ii.py rename to problems/python/trapping-rain-water-ii.py diff --git a/problems/trapping-rain-water.py b/problems/python/trapping-rain-water.py old mode 100644 new mode 100755 similarity index 100% rename from problems/trapping-rain-water.py rename to problems/python/trapping-rain-water.py diff --git a/problems/trim-a-binary-search-tree.py b/problems/python/trim-a-binary-search-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/trim-a-binary-search-tree.py rename to problems/python/trim-a-binary-search-tree.py diff --git a/problems/two-out-of-three.py b/problems/python/two-out-of-three.py old mode 100644 new mode 100755 similarity index 100% rename from problems/two-out-of-three.py rename to problems/python/two-out-of-three.py diff --git a/problems/two-sum-ii-input-array-is-sorted.py b/problems/python/two-sum-ii-input-array-is-sorted.py old mode 100644 new mode 100755 similarity index 100% rename from problems/two-sum-ii-input-array-is-sorted.py rename to problems/python/two-sum-ii-input-array-is-sorted.py diff --git a/problems/two-sum.py b/problems/python/two-sum.py old mode 100644 new mode 100755 similarity index 100% rename from problems/two-sum.py rename to problems/python/two-sum.py diff --git a/problems/ugly-number-ii.py b/problems/python/ugly-number-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/ugly-number-ii.py rename to problems/python/ugly-number-ii.py diff --git a/problems/ugly-number.py b/problems/python/ugly-number.py old mode 100644 new mode 100755 similarity index 100% rename from problems/ugly-number.py rename to problems/python/ugly-number.py diff --git a/problems/umber-of-islands-ii.py b/problems/python/umber-of-islands-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/umber-of-islands-ii.py rename to problems/python/umber-of-islands-ii.py diff --git a/problems/unique-binary-search-trees-ii,py b/problems/python/unique-binary-search-trees-ii,py old mode 100644 new mode 100755 similarity index 100% rename from problems/unique-binary-search-trees-ii,py rename to problems/python/unique-binary-search-trees-ii,py diff --git a/problems/unique-binary-search-trees.py b/problems/python/unique-binary-search-trees.py old mode 100644 new mode 100755 similarity index 100% rename from problems/unique-binary-search-trees.py rename to problems/python/unique-binary-search-trees.py diff --git a/problems/unique-email-addres.py b/problems/python/unique-email-addres.py old mode 100644 new mode 100755 similarity index 100% rename from problems/unique-email-addres.py rename to problems/python/unique-email-addres.py diff --git a/problems/unique-paths.py b/problems/python/unique-paths.py old mode 100644 new mode 100755 similarity index 100% rename from problems/unique-paths.py rename to problems/python/unique-paths.py diff --git a/problems/univalued-binary-tree.py b/problems/python/univalued-binary-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/univalued-binary-tree.py rename to problems/python/univalued-binary-tree.py diff --git a/problems/valid-anagram.py b/problems/python/valid-anagram.py old mode 100644 new mode 100755 similarity index 100% rename from problems/valid-anagram.py rename to problems/python/valid-anagram.py diff --git a/problems/valid-number.py b/problems/python/valid-number.py old mode 100644 new mode 100755 similarity index 100% rename from problems/valid-number.py rename to problems/python/valid-number.py diff --git a/problems/valid-palindrome-ii.py b/problems/python/valid-palindrome-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/valid-palindrome-ii.py rename to problems/python/valid-palindrome-ii.py diff --git a/problems/valid-palindrome.py b/problems/python/valid-palindrome.py old mode 100644 new mode 100755 similarity index 100% rename from problems/valid-palindrome.py rename to problems/python/valid-palindrome.py diff --git a/problems/valid-parentheses.py b/problems/python/valid-parentheses.py old mode 100644 new mode 100755 similarity index 100% rename from problems/valid-parentheses.py rename to problems/python/valid-parentheses.py diff --git a/problems/valid-word-abbreviation.py b/problems/python/valid-word-abbreviation.py old mode 100644 new mode 100755 similarity index 100% rename from problems/valid-word-abbreviation.py rename to problems/python/valid-word-abbreviation.py diff --git a/problems/validate-binary-search-tree.py b/problems/python/validate-binary-search-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/validate-binary-search-tree.py rename to problems/python/validate-binary-search-tree.py diff --git a/problems/verify-preorder-serialization-of-a-binary-tree.py b/problems/python/verify-preorder-serialization-of-a-binary-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/verify-preorder-serialization-of-a-binary-tree.py rename to problems/python/verify-preorder-serialization-of-a-binary-tree.py diff --git a/problems/vertical-order-traversal-of-a-binary-tree.py b/problems/python/vertical-order-traversal-of-a-binary-tree.py old mode 100644 new mode 100755 similarity index 100% rename from problems/vertical-order-traversal-of-a-binary-tree.py rename to problems/python/vertical-order-traversal-of-a-binary-tree.py diff --git a/problems/wiggle-subsequence.py b/problems/python/wiggle-subsequence.py old mode 100644 new mode 100755 similarity index 100% rename from problems/wiggle-subsequence.py rename to problems/python/wiggle-subsequence.py diff --git a/problems/word-break.py b/problems/python/word-break.py old mode 100644 new mode 100755 similarity index 100% rename from problems/word-break.py rename to problems/python/word-break.py diff --git a/problems/word-ladder-ii.py b/problems/python/word-ladder-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/word-ladder-ii.py rename to problems/python/word-ladder-ii.py diff --git a/problems/word-ladder.py b/problems/python/word-ladder.py old mode 100644 new mode 100755 similarity index 100% rename from problems/word-ladder.py rename to problems/python/word-ladder.py diff --git a/problems/word-search-ii.py b/problems/python/word-search-ii.py old mode 100644 new mode 100755 similarity index 100% rename from problems/word-search-ii.py rename to problems/python/word-search-ii.py diff --git a/problems/word-search.py b/problems/python/word-search.py old mode 100644 new mode 100755 similarity index 100% rename from problems/word-search.py rename to problems/python/word-search.py diff --git a/problems/python3/3sum-closest.py b/problems/python3/3sum-closest.py new file mode 100755 index 0000000..472c80f --- /dev/null +++ b/problems/python3/3sum-closest.py @@ -0,0 +1,24 @@ +""" +Time: O(N^2) +Space: O(1) +""" +class Solution: + def threeSumClosest(self, nums: List[int], target: int) -> int: + nums.sort() + + N = len(nums) + ans = float('inf') + + for i in range(N): + j = i+1 + k = N-1 + + while jabs(target-total): ans = total + if total>target: + k -= 1 + elif total int: + N = len(nums) + ans = 0 + + nums.sort() + + + for i in range(N): + j = i+1 + k = N-1 + while j List[List[int]]: + ans = [] + nums.sort() + + for i in range(len(nums)): + if 00: break #[1] + + j, k = i+1, len(nums)-1 + while j0: + k -= 1 + elif nums[i]+nums[j]+nums[k]<0: + j += 1 + else: + ans.append((nums[i], nums[j], nums[k])) + while 0 List[List[int]]: + ans = set() + seen = set() + N = len(nums) + + for i, v1 in enumerate(nums): + if v1 in seen: continue + seen.add(v1) + needed = set() + for j, v2 in enumerate(nums[i+1:]): + if v2 in needed: + ans.add(tuple(sorted((v1, v2, -v1-v2)))) + needed.add(-v1-v2) + return ans + + + +class Solution: + def threeSum(self, nums: List[int]) -> List[List[int]]: + ans = [] + + nums.sort() + + for i in range(len(nums)): + if nums[i]>0: break + if i>0 and nums[i]==nums[i-1]: continue + + j = i+1 + k = len(nums)-1 + while j0: + k -= 1 + elif nums[j]+nums[k]+nums[i]<0: + j += 1 + else: + ans.append((nums[i], nums[j], nums[k])) + + while j O(N^3) +Space: O(K) -> O(1) +""" +class Solution: + def fourSum(self, nums: List[int], target: int) -> List[List[int]]: + def kSum(k, start, target): + if k>2: + for i in range(start, len(nums)-k+1): + if i!=start and nums[i]==nums[i-1]: continue + temp.append(nums[i]) + kSum(k-1, i+1, target-nums[i]) + temp.pop() + else: + l, r = start, len(nums)-1 + + while ltarget: + r -= 1 + elif nums[l]+nums[r] Optional[ListNode]: + carry = 0 + dummy = ListNode() + curr = dummy + + while l1 or l2 or carry: + n = (l1.val if l1 else 0) + (l2.val if l2 else 0) + carry + if n>=10: + curr.next = ListNode(n-10) + carry = 1 + else: + curr.next = ListNode(n) + carry = 0 + curr = curr.next + if l1: l1 = l1.next + if l2: l2 = l2.next + + return dummy.next \ No newline at end of file diff --git a/problems/python3/alien-dictionary.py b/problems/python3/alien-dictionary.py new file mode 100644 index 0000000..23ca1ee --- /dev/null +++ b/problems/python3/alien-dictionary.py @@ -0,0 +1,36 @@ +class Solution: + def alienOrder(self, words: List[str]) -> str: + adj = collections.defaultdict(list) + inbounds = collections.Counter() + q = collections.deque() + ans = '' + + adj = {c: set() for word in words for c in word} + for i in range(len(words)-1): + w1, w2 = words[i], words[i+1] + minLen = min(len(w1), len(w2)) + if w1[:minLen]==w2[:minLen] and len(w1)>len(w2): return "" + + for j in range(minLen): + if w1[j]!=w2[j]: + adj[w1[j]].add(w2[j]) + break + + for c in adj: + for nc in list(adj[c]): + inbounds[nc] += 1 + + for c in adj: + if inbounds[c]==0: q.append(c) + + while q: + c = q.popleft() + + ans += c + + for nc in adj[c]: + inbounds[nc] -= 1 + if inbounds[nc]==0: q.append(nc) + + return ans if len(ans)==len(adj) else '' + diff --git a/problems/python3/balanced-binary-tree.py b/problems/python3/balanced-binary-tree.py new file mode 100755 index 0000000..65c749e --- /dev/null +++ b/problems/python3/balanced-binary-tree.py @@ -0,0 +1,18 @@ +""" +Time: O(N) +Space: O(LogN) Recursion stack. If the tree is balanced. +""" +class Solution: + def isBalanced(self, root: Optional[TreeNode]) -> bool: + def getHeight(node) -> (bool, int): + if not node: return True, 0 + leftIsBalanced, leftHeight = getHeight(node.left) + if not leftIsBalanced: return False, 0 + + rightIsBalanced, rightHeight = getHeight(node.right) + if not rightIsBalanced: return False, 0 + + return abs(leftHeight-rightHeight)<2, 1+max(leftHeight, rightHeight) + + isBalanced, h = getHeight(root) + return isBalanced \ No newline at end of file diff --git a/problems/python3/best-time-to-buy-and-sell-stock-with-cooldown.py b/problems/python3/best-time-to-buy-and-sell-stock-with-cooldown.py new file mode 100644 index 0000000..06644e3 --- /dev/null +++ b/problems/python3/best-time-to-buy-and-sell-stock-with-cooldown.py @@ -0,0 +1,16 @@ +#dp[i][0] := max profit when last action is buy +#dp[i][1] := max profit when last action is sell +class Solution: + def maxProfit(self, prices: List[int]) -> int: + if not prices or len(prices)<=1: return 0 + + N = len(prices) + dp = [[0, 0] for _ in range(N)] + dp[0] = [-prices[0], 0] + dp[1][0] = max(-prices[1], -prices[0]) + dp[1][1] = max(prices[1]+dp[0][0], dp[0][1]) + + for i in range(2, N): + dp[i][0] = max(dp[i-2][1]-prices[i], dp[i-1][0]) + dp[i][1] = max(prices[i]+dp[i-1][0], dp[i-1][1]) + return max(dp[-1][0], dp[-1][1], 0) \ No newline at end of file diff --git a/problems/python3/best-time-to-buy-and-sell-stock.py b/problems/python3/best-time-to-buy-and-sell-stock.py new file mode 100644 index 0000000..f04ad91 --- /dev/null +++ b/problems/python3/best-time-to-buy-and-sell-stock.py @@ -0,0 +1,10 @@ +class Solution: + def maxProfit(self, prices: List[int]) -> int: + minPrice = prices[0] + ans = 0 + + for i in range(1, len(prices)): + ans = max(ans, prices[i]-minPrice) + minPrice = min(prices[i], minPrice) + + return ans \ No newline at end of file diff --git a/problems/python3/binary-search.py b/problems/python3/binary-search.py new file mode 100644 index 0000000..2e65a63 --- /dev/null +++ b/problems/python3/binary-search.py @@ -0,0 +1,16 @@ +class Solution: + def search(self, nums: List[int], target: int) -> int: + l = 0 + r = len(nums)-1 + + while l<=r: + m = l + int((r-l)/2) + + if nums[m]>target: + r = m-1 + elif nums[m] List[List[int]]: + def helper(node, level): + if not node: return + if level==len(ans): ans.append([]) + ans[level].append(node.val) + helper(node.left, level+1) + helper(node.right, level+1) + + ans = [] + helper(root, 0) + + return ans + + +""" +Time: O(N), since we need to go through all the nodes. +Space: O(N) for queue. +""" +class Solution: + def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: + if not root: return [] + + q = collections.deque([(root, 0)]) + ans = [] + + while q: + node, level = q.popleft() + + if level==len(ans): ans.append([]) + ans[level].append(node.val) + if node.left: q.append((node.left, level+1)) + if node.right: q.append((node.right, level+1)) + + return ans \ No newline at end of file diff --git a/problems/python3/binary-tree-maximum-path-sum.py b/problems/python3/binary-tree-maximum-path-sum.py new file mode 100644 index 0000000..e024506 --- /dev/null +++ b/problems/python3/binary-tree-maximum-path-sum.py @@ -0,0 +1,27 @@ +""" +helper(node) will return the max path sum from the node to the leaf. [0] + +Along the way we update the ans. [1] +The path of ans must pass through one of the node in the tree. +`node.val+left+right` means the max path sum that pass through the node. +So after all `helper()` is executed, we tested all the nodes. + +Since there are some negative values in the tree, each node can decided not to take the negative path sum into account. [3] + +Time: O(N) +Space: O(LogN) for the recursive stack (if the tree is balanced). +""" +class Solution: + def maxPathSum(self, root: Optional[TreeNode]) -> int: + def helper(node): + nonlocal ans + + if not node: return 0 + left = max(helper(node.left), 0) #[3] + right = max(helper(node.right), 0) #[3] + ans = max(ans, node.val+left+right) #[1] + return node.val+max(left, right) #[0] + + ans = float('-inf') + helper(root) + return ans \ No newline at end of file diff --git a/problems/python3/binary-tree-right-side-view.py b/problems/python3/binary-tree-right-side-view.py new file mode 100755 index 0000000..53b4d13 --- /dev/null +++ b/problems/python3/binary-tree-right-side-view.py @@ -0,0 +1,18 @@ +""" +Time: O(N) +Space: O(LogN) if the tree is balanced. + +BFS is a more intuitive way to do this, but the time complexity will be at least O(N). +Using recursion instead, will take O(LogN) for the recursion stack size. +""" +class Solution: + def rightSideView(self, root: Optional[TreeNode]) -> List[int]: + def helper(node, level): + if not node: return + if len(ans) int: + def dfs(l, r)->int: + if l>r: return 0 + if (l, r) in dp: return dp[(l, r)] + + dp[(l, r)] = 0 + for i in range(l, r+1): + dp[(l, r)] = max(dp[(l, r)], nums[l-1]*nums[i]*nums[r+1] + dfs(l, i-1) + dfs(i+1, r)) + return dp[(l, r)] + + nums = [1]+nums+[1] + dp = {} + return dfs(1, len(nums)-2) \ No newline at end of file diff --git a/problems/python3/car-fleet.py b/problems/python3/car-fleet.py new file mode 100644 index 0000000..24ccba8 --- /dev/null +++ b/problems/python3/car-fleet.py @@ -0,0 +1,16 @@ +class Solution: + def carFleet(self, target: int, position: List[int], speed: List[int]) -> int: + N = len(position) + + timeInfo = [] + for i in range(N): + timeInfo.append((position[i], (target-position[i])/speed[i])) + timeInfo.sort(reverse=True) + + stack = [] + for _, time in timeInfo: + stack.append(time) + if len(stack)>=2 and stack[-2]>=stack[-1]: + stack.pop() + + return len(stack) \ No newline at end of file diff --git a/problems/python3/cheapest-flights-within-k-stops.py b/problems/python3/cheapest-flights-within-k-stops.py new file mode 100644 index 0000000..4595802 --- /dev/null +++ b/problems/python3/cheapest-flights-within-k-stops.py @@ -0,0 +1,17 @@ +""" +Bellman-Ford. +Time: O(KE) +""" +class Solution: + def findCheapestPrice(self, N: int, flights: List[List[int]], src: int, dst: int, K: int) -> int: + prices = {n:float('inf') for n in range(N)} + prices[src] = 0 + + for k in range(K+1): + temp = prices.copy() + for source, destination, price in flights: + if prices[source]==float('inf'): continue + if prices[source]+price int: + dp = [0]*(N+1) + dp[0] = 1 + for i in range(len(dp)): + if i-1>=0: + dp[i] += dp[i-1] + if i-2>=0: + dp[i] += dp[i-2] + return dp[-1] \ No newline at end of file diff --git a/problems/python3/clone-graph.py b/problems/python3/clone-graph.py new file mode 100644 index 0000000..9a6765f --- /dev/null +++ b/problems/python3/clone-graph.py @@ -0,0 +1,16 @@ +class Solution: + def cloneGraph(self, start: 'Node') -> 'Node': + def dfs(node): + if node in clones: return clones[node] + + copy = Node(node.val) + clones[node] = copy + + for neighbor in node.neighbors: + copy.neighbors.append(dfs(neighbor)) + + return clones[node] + if not start: return start + clones = {} + dfs(start) + return clones[start] \ No newline at end of file diff --git a/problems/python3/coin-change-ii.py b/problems/python3/coin-change-ii.py new file mode 100644 index 0000000..8b4ad26 --- /dev/null +++ b/problems/python3/coin-change-ii.py @@ -0,0 +1,12 @@ +class Solution: + def change(self, amount: int, coins: List[int]) -> int: + dp = [0]*(amount+1) + dp[0] = 1 + + coins.sort() + + for coin in coins: + for a in range(1, amount+1): + if a-coin<0: continue + dp[a] += dp[a-coin] + return dp[-1] \ No newline at end of file diff --git a/problems/python3/coin-change.py b/problems/python3/coin-change.py new file mode 100644 index 0000000..19571e4 --- /dev/null +++ b/problems/python3/coin-change.py @@ -0,0 +1,14 @@ +class Solution: + def coinChange(self, coins: List[int], amount: int) -> int: + dp = [float('inf')]*(amount+1) + dp[0] = 0 + for coin in coins: + if coin List[List[int]]: + def helper(i, target): + if target==0: + ans.append(combination.copy()) + return + + if i==len(candidates) or candidates[i]>target: + return + + combination.append(candidates[i]) + helper(i+1, target-candidates[i]) + combination.pop() + + while i+1 List[List[int]]: + def helper(i, currSum, target): + if currSum>target: + return + + if currSum==target: + ans.append(combination.copy()) + return + + for j in range(i, len(candidates)): + combination.append(candidates[j]) + helper(j, currSum+candidates[j], target) + combination.pop() + + ans = [] + combination = [] + helper(0, 0, target) + return ans \ No newline at end of file diff --git a/problems/python3/construct-binary-tree-from-preorder-and-inorder-traversal.py b/problems/python3/construct-binary-tree-from-preorder-and-inorder-traversal.py new file mode 100644 index 0000000..eb7f19c --- /dev/null +++ b/problems/python3/construct-binary-tree-from-preorder-and-inorder-traversal.py @@ -0,0 +1,34 @@ +""" +preorder: [root][left][right] +inorder: [left][root][right] + +[0] +As you can see, the root is always located at the first index of the preorder list. + +[2] +Using the same logic, we can recursively get the left and right node +Inorder to do that, we need to define left and right nodes' range. +And we can get the length of the left subtree by locating the index of the root in the in order list. [1] +i and j is the startIndex and the (endIndex+1) of the preorder list. +k and l is the startIndex and the (endIndex+1) of the inorder list. + +Time: O(N) +Space: O(N) +""" +class Solution: + def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]: + def helper(i, j, k, l): + if i==j or k==l: return None + + root = TreeNode(preorder[i]) #[0] + + rootInorderIndex = getInorderIndex[root.val] #[1] + leftLen = rootInorderIndex-k + + root.left = helper(i+1, i+1+leftLen, k, k+leftLen) #[2] + root.right = helper(i+1+leftLen, j, rootInorderIndex+1, l) + return root + + getInorderIndex = {} + for i, v in enumerate(inorder): getInorderIndex[v] = i + return helper(0, len(preorder), 0, len(inorder)) \ No newline at end of file diff --git a/problems/python3/container-with-most-water.py b/problems/python3/container-with-most-water.py new file mode 100755 index 0000000..a560441 --- /dev/null +++ b/problems/python3/container-with-most-water.py @@ -0,0 +1,42 @@ +""" +Time: O(N) +Space: O(1) + +i and j starts from the leftest and rightest. Move the one that has less height. + +Why we won't miss any i and j? +For example, currently i is heigher than j. +If between i~j, there are no height that is larger or equal to i, than since the area is `min(height[i], height[j]) * (j-i)`, you cannot find any area that is larger than the current one. +If between i~j, there is a height that is larger or equal to i, j will on it, and it will be tested. +Thus, given any i and j, any other future i and j that have the potential of forming larger area will be tested. +""" +class Solution: + def maxArea(self, height: List[int]) -> int: + i = 0 + j = len(height)-1 + ans = 0 + + while iheight[j]: + j -= 1 + else: + i += 1 + return ans + + + +class Solution: + def maxArea(self, height: List[int]) -> int: + i = 0 + j = len(height)-1 + ans = 0 + + while iheight[j]: + j -= 1 + else: + i += 1 + return ans \ No newline at end of file diff --git a/problems/python3/contains-duplicate.py b/problems/python3/contains-duplicate.py new file mode 100644 index 0000000..7849e84 --- /dev/null +++ b/problems/python3/contains-duplicate.py @@ -0,0 +1,7 @@ +class Solution: + def containsDuplicate(self, nums: List[int]) -> bool: + seen = set() + for num in nums: + if num in seen: return True + seen.add(num) + return False \ No newline at end of file diff --git a/problems/python3/copy-list-with-random-pointer.py b/problems/python3/copy-list-with-random-pointer.py new file mode 100644 index 0000000..4436b78 --- /dev/null +++ b/problems/python3/copy-list-with-random-pointer.py @@ -0,0 +1,34 @@ +""" +Time: O(N) +Space: O(1) + +The easiest way would be maintaining a hash map for original node to the copy and the other way around. Then the rest is easy. +But this will take us O(N) of extra space. + +Two pass solution with constant space. +First pass. +Create a copy of the original and store it inside "random". +The copy points to original's next and original's random. + +Second pass. +Iterate through the nodes again. +This time we adjust the copy to point to the other copies. +""" +class Solution: + def copyRandomList(self, head: 'Optional[Node]') -> 'Optional[Node]': + if not head: return head + + node = head + while node: + copy = Node(node.val, node.next, node.random) + node.random = copy + node = node.next + + node = head + while node: + newNode = node.random + if node.next: newNode.next = node.next.random + if newNode.random: newNode.random = newNode.random.random + node = node.next + + return head.random \ No newline at end of file diff --git a/problems/python3/count-good-nodes-in-binary-tree.py b/problems/python3/count-good-nodes-in-binary-tree.py new file mode 100755 index 0000000..2288d12 --- /dev/null +++ b/problems/python3/count-good-nodes-in-binary-tree.py @@ -0,0 +1,16 @@ +""" +Time: O(N) +Space: O(LogN) for recursion stack if the tree is balanced. +""" +class Solution: + def goodNodes(self, root: TreeNode) -> int: + def helper(node, maxVal): + nonlocal count + if not node: return + if node.val>=maxVal: count += 1 + helper(node.left, max(maxVal, node.val)) + helper(node.right, max(maxVal, node.val)) + + count = 0 + helper(root, float('-inf')) + return count \ No newline at end of file diff --git a/problems/python3/counting-bits.py b/problems/python3/counting-bits.py new file mode 100644 index 0000000..7325596 --- /dev/null +++ b/problems/python3/counting-bits.py @@ -0,0 +1,9 @@ +class Solution: + def countBits(self, n: int) -> List[int]: + ans = [0]*(n+1) + offset = 1 + + for i in range(1, n+1): + if offset*2==i: offset = offset*2 + ans[i] = 1+ans[i-offset] + return ans \ No newline at end of file diff --git a/problems/python3/course-schedule-ii.py b/problems/python3/course-schedule-ii.py new file mode 100644 index 0000000..00725b4 --- /dev/null +++ b/problems/python3/course-schedule-ii.py @@ -0,0 +1,30 @@ +#Topological Sort +class Solution: + def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]: + sortedCourse = [] + G = collections.defaultdict(list) #graph + inbounds = collections.Counter() + q = collections.deque() + + #build graph + for c1, c2 in prerequisites: + G[c2].append(c1) + inbounds[c1] += 1 + + #add the starting point to the q. (the ones that have 0 inbounds) + for course in range(numCourses): + if inbounds[course]==0: q.append(course) + + #add the course that have 0 inbounds to the sortedCourse. + #after that, imagine we remove it from the graph, so nextCourse inbound will -1 + #add to q if nextCourse have 0 inbounds + while q: + course = q.popleft() + + sortedCourse.append(course) + + for nextCourse in G[course]: + inbounds[nextCourse] -= 1 + if inbounds[nextCourse]==0: q.append(nextCourse) + + return sortedCourse if len(sortedCourse)==numCourses else [] \ No newline at end of file diff --git a/problems/python3/course-schedule.py b/problems/python3/course-schedule.py new file mode 100644 index 0000000..f52d07d --- /dev/null +++ b/problems/python3/course-schedule.py @@ -0,0 +1,23 @@ +class Solution: + def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool: + sortedCourse = [] + inbounds = collections.Counter() + G = collections.defaultdict(list) + q = collections.deque() + + for c1, c2 in prerequisites: + G[c2].append(c1) + inbounds[c1] += 1 + + for c in range(numCourses): + if inbounds[c]==0: q.append(c) + + while q: + c = q.popleft() + + for c2 in G[c]: + inbounds[c2] -= 1 + if inbounds[c2]==0: q.append(c2) + sortedCourse.append(c) + + return len(sortedCourse)==numCourses \ No newline at end of file diff --git a/problems/python3/daily-temperatures.py b/problems/python3/daily-temperatures.py new file mode 100644 index 0000000..d6e4c98 --- /dev/null +++ b/problems/python3/daily-temperatures.py @@ -0,0 +1,12 @@ +class Solution: + def dailyTemperatures(self, temperatures: List[int]) -> List[int]: + ans = [0]*len(temperatures) + stack = [] + + for i, temp in enumerate(temperatures): + while stack and stack[-1][0] int: + mapping = set([str(n) for n in range(1, 27)]) + N = len(s) + dp = [0]*(N+1) + dp[0] = 1 + + for i in range(1, N+1): + if i-1>=0 and s[i-1] in mapping: dp[i] += dp[i-1] + if i-2>=0 and s[i-2:i] in mapping: dp[i] += dp[i-2] + return dp[-1] \ No newline at end of file diff --git a/problems/python3/design-add-and-search-words-data-structure.py b/problems/python3/design-add-and-search-words-data-structure.py new file mode 100644 index 0000000..52effc8 --- /dev/null +++ b/problems/python3/design-add-and-search-words-data-structure.py @@ -0,0 +1,33 @@ +class WordDictionary: + + def __init__(self): + self.root = {} + + def addWord(self, word: str) -> None: + node = self.root + for c in word: + if c not in node: node[c] = {} + node = node[c] + node['$'] = {} #'.' means the end of the word + + def search(self, word: str) -> bool: + def helper(node, i): + if i==len(word): return '$' in node + + if word[i]=='.': + for c in node: + if helper(node[c], i+1): return True + return False + else: + if word[i] not in node: return False + return helper(node[word[i]], i+1) + return helper(self.root, 0) + + + + + + + + + \ No newline at end of file diff --git a/problems/python3/design-twitter.py b/problems/python3/design-twitter.py new file mode 100644 index 0000000..a2781ae --- /dev/null +++ b/problems/python3/design-twitter.py @@ -0,0 +1,49 @@ +class Twitter: + + def __init__(self): + self.followData = collections.defaultdict(set) + self.tweetData = collections.defaultdict(list) + self.count = 0 + + + def postTweet(self, userId: int, tweetId: int) -> None: + self.tweetData[userId].append((self.count, tweetId)) + self.count -= 1 + + + def getNewsFeed(self, userId: int) -> List[int]: + newsFeed = [] + h = [] + + self.followData[userId].add(userId) + for followeeId in self.followData[userId]: + if followeeId not in self.tweetData: continue + index = len(self.tweetData[followeeId])-1 + count, tweetId = self.tweetData[followeeId][index] + h.append((count, tweetId, followeeId, index-1)) + heapq.heapify(h) + + while h and len(newsFeed)<10: + _, tweetId, userId, index = heapq.heappop(h) + newsFeed.append(tweetId) + if index>=0: + count, tweetId2 = self.tweetData[userId][index] + heapq.heappush(h, (count, tweetId2, userId, index-1)) + return newsFeed + + + + def follow(self, followerId: int, followeeId: int) -> None: + self.followData[followerId].add(followeeId) + + def unfollow(self, followerId: int, followeeId: int) -> None: + if followerId not in self.followData: return + self.followData[followerId].remove(followeeId) + + +# Your Twitter object will be instantiated and called as such: +# obj = Twitter() +# obj.postTweet(userId,tweetId) +# param_2 = obj.getNewsFeed(userId) +# obj.follow(followerId,followeeId) +# obj.unfollow(followerId,followeeId) \ No newline at end of file diff --git a/problems/python3/detect-squares.py b/problems/python3/detect-squares.py new file mode 100644 index 0000000..af86946 --- /dev/null +++ b/problems/python3/detect-squares.py @@ -0,0 +1,22 @@ +class DetectSquares: + + def __init__(self): + self.store = collections.Counter() + + def add(self, point: List[int]) -> None: + self.store[tuple(point)] += 1 + + def count(self, point: List[int]) -> int: + x, y = point + ans = 0 + + for dx, dy in self.store: + if abs(x-dx)!=abs(y-dy) or x==dx or y==dy: continue + ans += self.store[(dx, dy)]*self.store[(dx, y)]*self.store[(x, dy)] + return ans + + +# Your DetectSquares object will be instantiated and called as such: +# obj = DetectSquares() +# obj.add(point) +# param_2 = obj.count(point) \ No newline at end of file diff --git a/problems/python3/diameter-of-binary-tree.py b/problems/python3/diameter-of-binary-tree.py new file mode 100755 index 0000000..1f9704d --- /dev/null +++ b/problems/python3/diameter-of-binary-tree.py @@ -0,0 +1,17 @@ +""" +Time: O(N) +Space: O(LogN) for the recursion stack. If the tree is balanced. +""" +class Solution: + def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int: + def helper(node): + if not node: return 0 + l = helper(node.left) + r = helper(node.right) + self.ans = max(self.ans, 1+l+r) + return 1+max(l, r) + + self.ans = 0 + + helper(root) + return self.ans-1 \ No newline at end of file diff --git a/problems/python3/distinct-subsequences.py b/problems/python3/distinct-subsequences.py new file mode 100644 index 0000000..d84fcf6 --- /dev/null +++ b/problems/python3/distinct-subsequences.py @@ -0,0 +1,17 @@ +class Solution: + def numDistinct(self, s: str, t: str) -> int: + def dfs(i, j): + if (i, j) in visited: return visited[(i, j)] + + if j>=len(t): return 1 + if i>=len(s): return 0 + + if s[i]==t[j]: + visited[(i, j)] = dfs(i+1, j+1)+dfs(i+1, j) + else: + visited[(i, j)] = dfs(i+1, j) + return visited[(i, j)] + + visited = {} + dfs(0, 0) + return dfs(0, 0) \ No newline at end of file diff --git a/problems/python3/edit-distance.py b/problems/python3/edit-distance.py new file mode 100644 index 0000000..c8fa8f4 --- /dev/null +++ b/problems/python3/edit-distance.py @@ -0,0 +1,37 @@ +""" +dfs(i, j) +i being the unprocessed index in word1. +j, word2. + +MAIN LOGIC: +if word1[i]==word2[j], no operation need, return dfs(i+1, j+1) +if not, need 1 operation, so +replace: dfs(i+1, j+1) +insert: dfs(i, j+1) +delete: dfs(i+1, j) + +BASE CASE: +If both string are empty (i==N and j==M), no operation needed. +If one string are empty, then the remain operation is the length of the non-empty one. +""" +class Solution: + def minDistance(self, word1: str, word2: str) -> int: + N = len(word1) + M = len(word2) + def dfs(i, j)->int: + if i==N and j==M: return 0 + if i==N: return M-j + if j==M: return N-i + + if (i, j) in history: + return history[(i, j)] + + if word1[i]==word2[j]: + history[(i, j)] = dfs(i+1, j+1) + else: + history[(i, j)] = 1+min(dfs(i+1, j+1), dfs(i+1, j), dfs(i, j+1)) + + return history[(i, j)] + + history = {} + return dfs(0, 0) \ No newline at end of file diff --git a/problems/python3/encode-and-decode-strings.py b/problems/python3/encode-and-decode-strings.py new file mode 100644 index 0000000..f38c4e4 --- /dev/null +++ b/problems/python3/encode-and-decode-strings.py @@ -0,0 +1,23 @@ +class Codec: + def encode(self, strs: List[str]) -> str: + output = '' + for string in strs: + output += str(len(string))+'#'+string + return output + + + def decode(self, s: str) -> List[str]: + output = [] + i = 0 + + while i int: + operators = set(['+', '-', '*', '/']) + stack = [] + + for c in tokens: + if c in operators: + n2 = stack.pop() + n1 = stack.pop() + + if c=='+': + stack.append(n1+n2) + elif c=='-': + stack.append(n1-n2) + elif c=='*': + stack.append(n1*n2) + elif c=='/': + stack.append(int(n1/n2)) + else: + stack.append(int(c)) + + return stack.pop() \ No newline at end of file diff --git a/problems/python3/find-median-from-data-stream.py b/problems/python3/find-median-from-data-stream.py new file mode 100644 index 0000000..f83ee40 --- /dev/null +++ b/problems/python3/find-median-from-data-stream.py @@ -0,0 +1,32 @@ +class MedianFinder: + + def __init__(self): + self.large = [] #store nums larger or equal to the median + self.small = [] #store nums samaller to the median + + def addNum(self, num: int) -> None: + if not self.large and not self.small: + heapq.heappush(self.large, num) + elif num>=self.findMedian(): + heapq.heappush(self.large, num) + self.balance() + else: + heapq.heappush(self.small, -num) + self.balance() + + def balance(self) -> None: + #make the length of two heaps as even as posible + if len(self.large)>len(self.small)+1: + num = heapq.heappop(self.large) + heapq.heappush(self.small, -num) + + if len(self.small)>len(self.large): + num = -heapq.heappop(self.small) + heapq.heappush(self.large, num) + + + def findMedian(self) -> float: + if (len(self.large)+len(self.small))%2==0: + return (self.large[0]-self.small[0])/2 + else: + return self.large[0] \ No newline at end of file diff --git a/problems/python3/find-minimum-in-rotated-sorted-array.py b/problems/python3/find-minimum-in-rotated-sorted-array.py new file mode 100644 index 0000000..c9af305 --- /dev/null +++ b/problems/python3/find-minimum-in-rotated-sorted-array.py @@ -0,0 +1,22 @@ +""" +Usually the binary search problem, the hard part is to clear all the edge cases. +What will be the edge case? It will be when the recursive function executed at the deepest level. Usually the list with only one or two element. +So I will suggest before submit, try out the case like [0,1] or [1,0] to make sure it will not run unstop. +""" +class Solution: + def findMin(self, nums: List[int]) -> int: + def helper(l, r): + nonlocal ans + if l>r: return + + m = l + int((r-l)/2) + if nums[l]<=nums[m]: + ans = min(ans, nums[l]) + helper(m+1, r) + else: + ans = min(ans, nums[m+1]) + helper(l, m) + + ans = float('inf') + helper(0, len(nums)-1) + return ans \ No newline at end of file diff --git a/problems/python3/find-the-duplicate-number.py b/problems/python3/find-the-duplicate-number.py new file mode 100644 index 0000000..41636df --- /dev/null +++ b/problems/python3/find-the-duplicate-number.py @@ -0,0 +1,16 @@ +class Solution: + def findDuplicate(self, nums: List[int]) -> int: + head = nums[0] + slow = head + fast = head + + while True: + slow = nums[slow] + fast = nums[nums[fast]] + if slow==fast: break + + slow = head + while slow!=fast: + slow = nums[slow] + fast = nums[fast] + return slow \ No newline at end of file diff --git a/problems/python3/gas-station.py b/problems/python3/gas-station.py new file mode 100644 index 0000000..017eaa6 --- /dev/null +++ b/problems/python3/gas-station.py @@ -0,0 +1,23 @@ +""" +First thing, you must understand that if sum(gas)>=sum(cost) there must be an answer. Guaranteed. +If we know there is an answer, we can simply test all the index. +If the currGas ever drops to below 0, it means that we need to switch a "start". + +Time: O(N) +Space: O(1) +""" +class Solution: + def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int: + if sum(gas) List[str]: + def helper(parentheses, left, right): + if len(parentheses)==n*2: + ans.append("".join(parentheses)) + return + + if leftright: + parentheses.append(')') + helper(parentheses, left, right+1) + parentheses.pop() + + ans = [] + helper([], 0, 0) + return ans \ No newline at end of file diff --git a/problems/python3/graph-valid-tree.py b/problems/python3/graph-valid-tree.py new file mode 100644 index 0000000..2168e9a --- /dev/null +++ b/problems/python3/graph-valid-tree.py @@ -0,0 +1,33 @@ +class Solution: + def validTree(self, N: int, edges: List[List[int]]) -> bool: + def union(n1, n2) -> bool: + p1 = find(n1) + p2 = find(n2) + + if p1==p2: + return False + elif p1 int: + p = parents[n] + while p!=parents[p]: p = find(p) + parents[n] = p + return p + + parents = [n for n in range(N)] + + for n1, n2 in edges: + if not union(n1, n2): return False + + #check if all node trace back to the same root + root = find(0) + for n in range(1, N): + if root!=find(n): return False + + return True \ No newline at end of file diff --git a/problems/python3/group-anagrams.py b/problems/python3/group-anagrams.py new file mode 100644 index 0000000..7430f48 --- /dev/null +++ b/problems/python3/group-anagrams.py @@ -0,0 +1,23 @@ +class Solution: + def groupAnagrams(self, strs: List[str]) -> List[List[str]]: + def normalize(string: str) -> str: + counter = collections.Counter() + ans = '' + + for c in string: + counter[c] += 1 + + for c in 'abcdefghijklmnopqrstuvwxyz': + if counter[c]>0: + ans += c+str(counter[c]) + return ans + + group = collections.defaultdict(list) + ans = [] + + for string in strs: + group[normalize(string)].append(string) + + for normalizedString in group: + ans.append(group[normalizedString]) + return ans \ No newline at end of file diff --git a/problems/python3/hand-of-straights.py b/problems/python3/hand-of-straights.py new file mode 100644 index 0000000..f20c32d --- /dev/null +++ b/problems/python3/hand-of-straights.py @@ -0,0 +1,18 @@ +class Solution: + def isNStraightHand(self, hand: List[int], groupSize: int) -> bool: + if len(hand)%groupSize!=0: return False + + counter = collections.Counter(hand) + h = list(counter.keys()) + heapq.heapify(h) + + while h: + minNum = h[0] + for n in range(minNum, minNum+groupSize): + if counter[n]<=0: return False + counter[n] -= 1 + if counter[n]==0: + if h[0]!=n: return False + heapq.heappop(h) + + return True \ No newline at end of file diff --git a/problems/python3/happy-number.py b/problems/python3/happy-number.py new file mode 100644 index 0000000..7756197 --- /dev/null +++ b/problems/python3/happy-number.py @@ -0,0 +1,17 @@ +class Solution: + def isHappy(self, n: int) -> bool: + def digitSquare(n) -> int: + ans = 0 + while n>0: + ans += (n%10)**2 + n = n//10 + return ans + + visited = set() + visited.add(1) + + while n not in visited: + visited.add(n) + n = digitSquare(n) + + return n==1 diff --git a/problems/python3/house-robber-ii.py b/problems/python3/house-robber-ii.py new file mode 100644 index 0000000..1ed9b82 --- /dev/null +++ b/problems/python3/house-robber-ii.py @@ -0,0 +1,18 @@ +class Solution: + def rob(self, nums: List[int]) -> int: + if len(nums)<=1: return max(nums) + + N = len(nums) + dp = [[0, 0] for _ in range(N)] + dp[0][0] = nums[0] + + for i in range(1, N): + dp[i][0] = nums[i]+dp[i-1][1] + dp[i][1] = max(dp[i-1]) + + dp2 = [[0, 0] for _ in range(N)] + for i in range(1, N): + dp2[i][0] = nums[i]+dp2[i-1][1] + dp2[i][1] = max(dp2[i-1]) + + return max(dp[-1][1], dp2[-1][0]) \ No newline at end of file diff --git a/problems/python3/house-robber.py b/problems/python3/house-robber.py new file mode 100644 index 0000000..fbd86a5 --- /dev/null +++ b/problems/python3/house-robber.py @@ -0,0 +1,17 @@ +""" +Time: O(N) +Space: O(N), can reduece to O(1). + +dp[i][0] := max revenue if house i robbed +dp[i][1] := max revenue if house i not robbed +""" +class Solution: + def rob(self, nums: List[int]) -> int: + N = len(nums) + dp = [[0, 0] for _ in range(N)] + dp[0][0] = nums[0] + + for i in range(1, N): + dp[i][0] = nums[i]+dp[i-1][1] + dp[i][1] = max(dp[i-1]) + return max(dp[-1]) \ No newline at end of file diff --git a/problems/python3/implement-trie-prefix-tree.py b/problems/python3/implement-trie-prefix-tree.py new file mode 100644 index 0000000..1118e97 --- /dev/null +++ b/problems/python3/implement-trie-prefix-tree.py @@ -0,0 +1,26 @@ +class Trie: + + def __init__(self): + self.root = {} + + def insert(self, word: str) -> None: + node = self.root + for c in word: + if c not in node: node[c] = {} + node = node[c] + node['.'] = {} #'.' means the end of the word + + + def search(self, word: str) -> bool: + node = self.root + for c in word: + if c not in node: return False + node = node[c] + return '.' in node + + def startsWith(self, prefix: str) -> bool: + node = self.root + for c in prefix: + if c not in node: return False + node = node[c] + return True diff --git a/problems/python3/insert-interval.py b/problems/python3/insert-interval.py new file mode 100644 index 0000000..667ba04 --- /dev/null +++ b/problems/python3/insert-interval.py @@ -0,0 +1,23 @@ +class Solution: + def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]: + ans = [] + i = 0 + + #add intervals before newInterval + while i bool: + def dfs(i, j): + if (i, j) in history: return False + if i+j==len(s3): return True + if i Optional[TreeNode]: + if not root: return root + left = root.left + right = root.right + root.left = self.invertTree(right) + root.right = self.invertTree(left) + return root + + +""" +Iterative +Time: O(N) +Space: O(N) +""" +class Solution: + def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: + if not root: return root + q = collections.deque([root]) + + while q: + node = q.popleft() + left = node.left + right = node.right + node.right = left + node.left = right + + if node.left: q.append(node.left) + if node.right: q.append(node.right) + + return root \ No newline at end of file diff --git a/problems/python3/jump-game-ii.py b/problems/python3/jump-game-ii.py new file mode 100644 index 0000000..35be09f --- /dev/null +++ b/problems/python3/jump-game-ii.py @@ -0,0 +1,22 @@ +""" +l and r is the index range we can reach within "steps". +So while r can not reach the end (`r int: + l = r = 0 + steps = 0 + + while r bool: + maxIndex = 0 + + for i, num in enumerate(nums): + if maxIndex List[List[int]]: + h = [] + + for x, y in points: + dis = (x**2+y**2)**0.5 + heapq.heappush(h, (-dis, x, y)) + if len(h)>k: heapq.heappop(h) + + return [(x, y) for dis, x, y in h] \ No newline at end of file diff --git a/problems/python3/koko-eating-bananas.py b/problems/python3/koko-eating-bananas.py new file mode 100644 index 0000000..fe03197 --- /dev/null +++ b/problems/python3/koko-eating-bananas.py @@ -0,0 +1,21 @@ +class Solution: + def minEatingSpeed(self, piles: List[int], h: int) -> int: + def canFinish(k): + timeNeeded = 0 + for pile in piles: + timeNeeded += math.ceil(pile/k) + return timeNeeded<=h + + kMin = 1 + kMax = max(piles) + ans = kMax + + while kMin<=kMax: + k = kMin + int((kMax-kMin)/2) + if canFinish(k): + ans = min(ans, k) + kMax = k-1 + else: + kMin = k+1 + + return ans \ No newline at end of file diff --git a/problems/python3/kth-largest-element-in-a-stream.py b/problems/python3/kth-largest-element-in-a-stream.py new file mode 100644 index 0000000..1eb9095 --- /dev/null +++ b/problems/python3/kth-largest-element-in-a-stream.py @@ -0,0 +1,14 @@ +class KthLargest: + + def __init__(self, k: int, nums: List[int]): + self.k = k + self.nums = nums + + heapq.heapify(self.nums) + while len(self.nums)>self.k: heapq.heappop(self.nums) + + + def add(self, val: int) -> int: + heapq.heappush(self.nums, val) + if len(self.nums)>self.k: heapq.heappop(self.nums) + return self.nums[0] \ No newline at end of file diff --git a/problems/python3/kth-smallest-element-in-a-bst.py b/problems/python3/kth-smallest-element-in-a-bst.py new file mode 100755 index 0000000..c8a1555 --- /dev/null +++ b/problems/python3/kth-smallest-element-in-a-bst.py @@ -0,0 +1,21 @@ +""" +Time: O(N) for the inorder traversal +Space: O(LogN) if the tree is balanced. +""" +class Solution: + def kthSmallest(self, root: Optional[TreeNode], k: int) -> int: + count = 0 + stack = [] + node = root + + while stack or node: + while node: + stack.append(node) + node = node.left + node = stack.pop() + + count += 1 + if count==k: return node.val + + node = node.right + return 0 \ No newline at end of file diff --git a/problems/python3/largest-rectangle-in-histogram.py b/problems/python3/largest-rectangle-in-histogram.py new file mode 100644 index 0000000..1cf8508 --- /dev/null +++ b/problems/python3/largest-rectangle-in-histogram.py @@ -0,0 +1,21 @@ +""" +[0] For each height, if the it is lower than the previous one, it means that the previous are not able to extend anymore. So we calculate its area. + +[1] If the previous area, is larger than the current one, it means that the current one are able to extand backward. +""" +class Solution: + def largestRectangleArea(self, heights: List[int]) -> int: + maxArea = 0 + stack = [] + + heights.append(0) #dummy for the ending + + for i, h in enumerate(heights): + start = i + while stack and h int: + stones = [-stone for stone in stones] + heapq.heapify(stones) + + while len(stones)>=2: + w1 = -heapq.heappop(stones) + w2 = -heapq.heappop(stones) + + if w1-w2>0: heapq.heappush(stones, -(w1-w2)) + + return -stones[0] if stones else 0 \ No newline at end of file diff --git a/problems/python3/letter-combinations-of-a-phone-number.py b/problems/python3/letter-combinations-of-a-phone-number.py new file mode 100644 index 0000000..582106c --- /dev/null +++ b/problems/python3/letter-combinations-of-a-phone-number.py @@ -0,0 +1,25 @@ +""" +Time: O(4^N * N), there are around 4^N of combination. Each taking O(N) to form. +Space: O(N). O(N) for recursion stack. O(N). O(N) for `combination`. O(N+N) ~= O(N). +""" +class Solution: + def letterCombinations(self, digits: str) -> List[str]: + def helper(i): + if i==len(digits): + ans.append(''.join(combination)) + return + + for c in mapping[digits[i]]: + combination.append(c) + helper(i+1) + combination.pop() + + mapping = {'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')} + + if not digits: return [] + ans = [] + combination = [] + helper(0) + return ans \ No newline at end of file diff --git a/problems/python3/linked-list-cycle.py b/problems/python3/linked-list-cycle.py new file mode 100644 index 0000000..d2e5395 --- /dev/null +++ b/problems/python3/linked-list-cycle.py @@ -0,0 +1,16 @@ +class Solution: + def hasCycle(self, head: Optional[ListNode]) -> bool: + if not head: return False + + slow = head + fast = head + + while fast: + slow = slow.next + + if not fast.next: return False + fast = fast.next.next + + if slow==fast: return True + + return False \ No newline at end of file diff --git a/problems/python3/longest-common-subsequence.py b/problems/python3/longest-common-subsequence.py new file mode 100644 index 0000000..5ba3a68 --- /dev/null +++ b/problems/python3/longest-common-subsequence.py @@ -0,0 +1,16 @@ +class Solution: + def longestCommonSubsequence(self, text1: str, text2: str) -> int: + #dp[i][j] := number of longest Common Subsequence with text2[:i] and text2[:j] + + N = len(text1) + M = len(text2) + + dp = [[0]*(M+1) for _ in range(N+1)] + + for i in range(1, N+1): + for j in range(1, M+1): + if text1[i-1]==text2[j-1]: + dp[i][j] = dp[i-1][j-1]+1 + else: + dp[i][j] = max(dp[i][j-1], dp[i-1][j]) + return dp[-1][-1] \ No newline at end of file diff --git a/problems/python3/longest-consecutive-sequence.py b/problems/python3/longest-consecutive-sequence.py new file mode 100644 index 0000000..dec2cfa --- /dev/null +++ b/problems/python3/longest-consecutive-sequence.py @@ -0,0 +1,15 @@ +class Solution: + def longestConsecutive(self, nums: List[int]) -> int: + numSet = set(nums) + ans = 0 + + for num in nums: + isStart = num-1 not in numSet + if isStart: + count = 0 + temp = num + while temp in numSet: + count += 1 + temp += 1 + ans = max(count, ans) + return ans \ No newline at end of file diff --git a/problems/python3/longest-increasing-path-in-a-matrix.py b/problems/python3/longest-increasing-path-in-a-matrix.py new file mode 100644 index 0000000..99fed7d --- /dev/null +++ b/problems/python3/longest-increasing-path-in-a-matrix.py @@ -0,0 +1,26 @@ +""" +Time: O(MN) since the memo at most has MN index. +Space: O(MN) +""" +class Solution: + def longestIncreasingPath(self, matrix: List[List[int]]) -> int: + def dfs(i0, j0): + if (i0, j0) in memo: return memo[(i0, j0)] + ans = 1 + + for i, j in ((i0+1, j0), (i0-1, j0), (i0, j0+1),(i0, j0-1)): + if i<0 or i>=N or j<0 or j>=M: continue + if matrix[i][j]<=matrix[i0][j0]: continue + ans = max(ans, 1+dfs(i, j)) + + memo[(i0, j0)] = ans + return ans + + N = len(matrix) + M = len(matrix[0]) + memo = {} + ans = 0 + for i in range(N): + for j in range(M): + ans = max(ans, dfs(i, j)) + return ans \ No newline at end of file diff --git a/problems/python3/longest-palindromic-substring.py b/problems/python3/longest-palindromic-substring.py new file mode 100644 index 0000000..9edb477 --- /dev/null +++ b/problems/python3/longest-palindromic-substring.py @@ -0,0 +1,45 @@ +""" +Time: O(N^2) +Space: O(N^2) + +DP, TLE +""" +class Solution: + def longestPalindrome(self, s: str) -> str: + ans = s[0] + N = len(s) + dp = [[False]*N for _ in range(N)] + + for i in range(N): dp[i][i] = True + + for l in range(2, N+1): + for i in range(N): + j = i+l-1 + if j>=N: continue + dp[i][j] = s[i]==s[j] and (dp[i+1][j-1] or j-1 str: + N = len(s) + ans = s[0] + + for i in range(N): + l, r = i, i + while l>=0 and rlen(ans): ans = s[l:r+1] + l -= 1 + r += 1 + + l, r = i, i+1 + while l>=0 and rlen(ans): ans = s[l:r+1] + l -= 1 + r += 1 + return ans \ No newline at end of file diff --git a/problems/python3/longest-repeating-character-replacement.py b/problems/python3/longest-repeating-character-replacement.py new file mode 100644 index 0000000..714d8f1 --- /dev/null +++ b/problems/python3/longest-repeating-character-replacement.py @@ -0,0 +1,13 @@ +class Solution: + def characterReplacement(self, s: str, k: int) -> int: + counter = collections.Counter() + l = 0 + ans = 0 + + for r in range(len(s)): + counter[s[r]] += 1 + while (r-l+1)-max(counter.values()) > k: + counter[s[l]] -= 1 + l += 1 + ans = max(ans, r-l+1) + return ans \ No newline at end of file diff --git a/problems/python3/longest-substring-without-repeating-char.py b/problems/python3/longest-substring-without-repeating-char.py new file mode 100644 index 0000000..9902bb5 --- /dev/null +++ b/problems/python3/longest-substring-without-repeating-char.py @@ -0,0 +1,14 @@ +class Solution: + def lengthOfLongestSubstring(self, s: str) -> int: + ans = 0 + l = 0 + seen = set() + + for r in range(len(s)): + while s[r] in seen: + seen.remove(s[l]) + l += 1 + seen.add(s[r]) + ans = max(ans, r-l+1) + + return ans \ No newline at end of file diff --git a/problems/python3/lowest-common-ancestor-of-a-binary-search-tree.py b/problems/python3/lowest-common-ancestor-of-a-binary-search-tree.py new file mode 100755 index 0000000..12e1743 --- /dev/null +++ b/problems/python3/lowest-common-ancestor-of-a-binary-search-tree.py @@ -0,0 +1,28 @@ +""" +Recursive +Time: O(LogN) if the tree is balanced. +Space: O(LogN) for the recursion stack. +""" +class Solution: + def lowestCommonAncestor(self, node: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': + if q.val<=node.val<=p.val or p.val<=node.val<=q.val: + return node + elif q.val 'TreeNode': + while not (q.val<=node.val<=p.val or p.val<=node.val<=q.val): + if q.val int: + if key in self.dic: + node = self.dic[key] + self.remove(node) + self.promote(node) + return node.val + return -1 + + def put(self, key: int, value: int) -> None: + if key in self.dic: + self.remove(self.dic[key]) + node = Node(key, value) + self.promote(node) + self.dic[key] = node + + if len(self.dic)>self.capacity: #[2] + del self.dic[self.tail.prev.key] + self.remove(self.tail.prev) diff --git a/problems/python3/max-area-of-island.py b/problems/python3/max-area-of-island.py new file mode 100644 index 0000000..fd55a94 --- /dev/null +++ b/problems/python3/max-area-of-island.py @@ -0,0 +1,23 @@ +class Solution: + def maxAreaOfIsland(self, grid: List[List[int]]) -> int: + def dfs(i, j) -> int: + if i<0 or j<0 or i>=MAX_ROW or j>=MAX_COL: return 0 + if grid[i][j]==0 or grid[i][j]==2: return 0 + + grid[i][j] = 2 #mark as visited + + area = 1 + area += dfs(i+1, j) + area += dfs(i-1, j) + area += dfs(i, j+1) + area += dfs(i, j-1) + return area + + ans = 0 + MAX_ROW = len(grid) + MAX_COL = len(grid[0]) + + for i in range(MAX_ROW): + for j in range(MAX_COL): + ans = max(ans, dfs(i, j)) + return ans \ No newline at end of file diff --git a/problems/python3/maximum-depth-of-binary-tree.py b/problems/python3/maximum-depth-of-binary-tree.py new file mode 100755 index 0000000..3146dcf --- /dev/null +++ b/problems/python3/maximum-depth-of-binary-tree.py @@ -0,0 +1,8 @@ +""" +Time: O(N) +Space:O(LogN), for recursion stack space. +""" +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if not root: return 0 + return 1+max(self.maxDepth(root.left), self.maxDepth(root.right)) \ No newline at end of file diff --git a/problems/python3/maximum-product-subarray.py b/problems/python3/maximum-product-subarray.py new file mode 100644 index 0000000..243bf41 --- /dev/null +++ b/problems/python3/maximum-product-subarray.py @@ -0,0 +1,25 @@ +""" +Time: O(N) +Space: O(N), can be reduce to O(1) + +dp[i][0] := The max product from subarray that end with nums[i] +dp[i][1] := The min product from subarray that end with nums[i] +""" +class Solution: + def maxProduct(self, nums: List[int]) -> int: + N = len(nums) + dp = [[1, 1] for _ in range(N+1)] + ans = float('-inf') + + for i in range(1, N+1): + dp[i][0] = dp[i][1] = nums[i-1] + + if nums[i-1]>0: + dp[i][0] = max(dp[i][0], nums[i-1]*dp[i-1][0]) + dp[i][1] = min(dp[i][1], nums[i-1]*dp[i-1][1]) + else: + dp[i][0] = max(dp[i][0], nums[i-1]*dp[i-1][1]) + dp[i][1] = min(dp[i][1], nums[i-1]*dp[i-1][0]) + ans = max(ans, dp[i][0]) + + return ans \ No newline at end of file diff --git a/problems/python3/maximum-subarray.py b/problems/python3/maximum-subarray.py new file mode 100644 index 0000000..6f749fa --- /dev/null +++ b/problems/python3/maximum-subarray.py @@ -0,0 +1,17 @@ +""" +Time: O(N) +Space: O(1) + +Calculate the prefix sum. Whenever the prefix is negative, we ignore all the value before. +Update the ans along the way. +""" +class Solution: + def maxSubArray(self, nums: List[int]) -> int: + ans = float('-inf') + currSum = 0 + + for num in nums: + if currSum<0: currSum = 0 + currSum += num + ans = max(ans, currSum) + return ans \ No newline at end of file diff --git a/problems/python3/median-of-two-sorted-arrays.py b/problems/python3/median-of-two-sorted-arrays.py new file mode 100644 index 0000000..0fa31da --- /dev/null +++ b/problems/python3/median-of-two-sorted-arrays.py @@ -0,0 +1,40 @@ +""" +Try to find a i on array A and corespoding j on array B. + +Aleft = A[i] +Aright = A[i+1] +Bleft = B[j] +Bright = B[j+1] + +Such that Aleft<=Bright and Bleft<=Aright + +This means that A[:i+1] and B[:j+1] holds all the elements that is less than the median. +Aright A[i+1:] and B[j+1:] holds all the elements that is larger or equal to the median. +""" +class Solution: + def findMedianSortedArrays(self, A: List[int], B: List[int]) -> float: + if len(A)>len(B): A, B = B, A + + total = len(A)+len(B) + half = total//2 + l = 0 + r = len(A)-1 + + while True: + i = l + (r-l)//2 + j = half-(i+1)-1 + + Aleft = A[i] if i>=0 else float('-inf') + Aright = A[i+1] if i+1=0 else float('-inf') + Bright = B[j+1] if j+1Bright: + r = i-1 + else: + l = i+1 \ No newline at end of file diff --git a/problems/python3/meeting-rooms-ii.py b/problems/python3/meeting-rooms-ii.py new file mode 100644 index 0000000..1eb4eb4 --- /dev/null +++ b/problems/python3/meeting-rooms-ii.py @@ -0,0 +1,12 @@ +class Solution: + def minMeetingRooms(self, intervals: List[List[int]]) -> int: + intervals.sort() + h = [] + ans = 0 + + for s, e in intervals: + while h and s>=h[0][0]: + heapq.heappop(h) + heapq.heappush(h, (e, s)) + ans = max(ans, len(h)) + return ans \ No newline at end of file diff --git a/problems/python3/meeting-rooms.py b/problems/python3/meeting-rooms.py new file mode 100644 index 0000000..60cf429 --- /dev/null +++ b/problems/python3/meeting-rooms.py @@ -0,0 +1,10 @@ +class Solution: + def canAttendMeetings(self, intervals: List[List[int]]) -> bool: + intervals.sort() + lastEnd = float('-inf') + for s, e in intervals: + if lastEnd>s: + return False + else: + lastEnd = e + return True \ No newline at end of file diff --git a/problems/python3/merge-intervals.py b/problems/python3/merge-intervals.py new file mode 100644 index 0000000..c8a4678 --- /dev/null +++ b/problems/python3/merge-intervals.py @@ -0,0 +1,17 @@ +""" +Time: O(NLogN) for sorting +Space: O(1) excluding the output. +""" +class Solution: + def merge(self, intervals: List[List[int]]) -> List[List[int]]: + ans = [] + intervals.sort() + + for s, e in intervals: + if not ans: + ans.append([s, e]) + elif ans[-1][1]>=s: + ans[-1][1] = max(ans[-1][1], e) + else: + ans.append([s, e]) + return ans \ No newline at end of file diff --git a/problems/python3/merge-triplets-to-form-target-triplet.py b/problems/python3/merge-triplets-to-form-target-triplet.py new file mode 100644 index 0000000..4708e4f --- /dev/null +++ b/problems/python3/merge-triplets-to-form-target-triplet.py @@ -0,0 +1,15 @@ +""" +If any element in the triplets is larger than the element in target, it cannot be used. +Check if we have all 3 index found the same value. +""" +class Solution: + def mergeTriplets(self, triplets: List[List[int]], target: List[int]) -> bool: + okIndex = set() + + for a, b, c in triplets: + if a>target[0] or b>target[1] or c>target[2]: continue + if a==target[0]: okIndex.add(0) + if b==target[1]: okIndex.add(1) + if c==target[2]: okIndex.add(2) + + return len(okIndex)==3 \ No newline at end of file diff --git a/problems/python3/merge-two-sorted-lists.py b/problems/python3/merge-two-sorted-lists.py new file mode 100644 index 0000000..2b31352 --- /dev/null +++ b/problems/python3/merge-two-sorted-lists.py @@ -0,0 +1,15 @@ +class Solution: + def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: + head = ListNode() #dummy + node = head + while list1 and list2: + if list1.val O(1). + +dp[i] := the cost to get to index i. +""" +class Solution: + def minCostClimbingStairs(self, cost: List[int]) -> int: + N = len(cost) + dp = [float('inf')]*(N+1) + dp[0] = 0 + dp[1] = 0 + + for i in range(2, len(dp)): + dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]) + return dp[-1] \ No newline at end of file diff --git a/problems/python3/min-cost-to-connect-all-points.py b/problems/python3/min-cost-to-connect-all-points.py new file mode 100644 index 0000000..4cd6ada --- /dev/null +++ b/problems/python3/min-cost-to-connect-all-points.py @@ -0,0 +1,28 @@ +class Solution: + def minCostConnectPoints(self, points: List[List[int]]) -> int: + ans = 0 + visited = set() + adj = collections.defaultdict(list) + N = len(points) + + #build adjacency list + for i in range(N): + x0, y0 = points[i] + for j in range(i+1, N): + x1, y1 = points[j] + dis = abs(x0-x1)+abs(y0-y1) + adj[(x0, y0)].append((dis, x1, y1)) + adj[(x1, y1)].append((dis, x0, y0)) + + h = [(0, points[0][0], points[0][1])] #min heap + while len(visited) None: + self.stack.append(val) + self.minStack.append(val if (not self.minStack or val None: + self.minStack.pop() + return self.stack.pop() + + def top(self) -> int: + return self.stack[-1] + + def getMin(self) -> int: + return self.minStack[-1] \ No newline at end of file diff --git a/problems/python3/minimum-interval-to-include-each-query.py b/problems/python3/minimum-interval-to-include-each-query.py new file mode 100644 index 0000000..ca43de3 --- /dev/null +++ b/problems/python3/minimum-interval-to-include-each-query.py @@ -0,0 +1,23 @@ +class Solution: + def minInterval(self, intervals: List[List[int]], queries: List[int]) -> List[int]: + ans = [-1]*len(queries) + queries = sorted([(query, i) for i, query in enumerate(queries)]) + intervals.sort() + h = [] + + itervalIndex = 0 + for query, queryIndex in queries: + #push all intervals that include 'query' to the min heap + while itervalIndex str: + if len(t)>len(s): return "" + + ans = "" + counter1 = collections.Counter(t) + charSet = set(t) + counter2 = collections.Counter() #sliding window in string s, index between l and r + charSet2 = set(s) + matchCount = 0 #count of char in the sliding window that counts are larger than the char count in t. + + l = 0 + for r in range(len(s)): + counter2[s[r]] += 1 + + if s[r] in charSet and counter1[s[r]]==counter2[s[r]]: matchCount += 1 + + while lcounter1[s[l]]): + counter2[s[l]] -= 1 + l += 1 + + if matchCount==len(charSet) and (ans=="" or r-l+1 int: + N = len(nums) + ans = 0 + + for n in range(N+1): + ans ^= n + + for n in nums: + ans ^= n + + return ans \ No newline at end of file diff --git a/problems/python3/multiply-strings.py b/problems/python3/multiply-strings.py new file mode 100644 index 0000000..be9f675 --- /dev/null +++ b/problems/python3/multiply-strings.py @@ -0,0 +1,22 @@ +class Solution: + def multiply(self, num1: str, num2: str) -> str: + if num1=='0' or num2=='0': return '0' + M, N = len(num1), len(num2) + temp = [0]*(M+N+1) + + num1, num2 = num1[::-1], num2[::-1] + for i in range(M): + for j in range(N): + digits = int(num1[i])*int(num2[j]) + temp[i+j] += digits + temp[i+j+1] += temp[i+j]//10 + temp[i+j] = temp[i+j]%10 + + ans = '' + temp = temp[::-1] + isLeadingZero = True + for d in temp: + if d!=0 or not isLeadingZero: + isLeadingZero = False + ans += str(d) + return ans \ No newline at end of file diff --git a/problems/python3/n-queens.py b/problems/python3/n-queens.py new file mode 100644 index 0000000..2ab7335 --- /dev/null +++ b/problems/python3/n-queens.py @@ -0,0 +1,45 @@ +class Solution: + def solveNQueens(self, n: int) -> List[List[str]]: + def helper(row: int): + if row==n: + ans.append(convertFormat(queenCols)) + return + + for col in range(n): + posDiag = row+col + negDiag = row-col + + if col in colUsed or posDiag in posDiagUsed or negDiag in negDiagUsed: continue + + queenCols.append(col) + colUsed.add(col) + posDiagUsed.add(posDiag) + negDiagUsed.add(negDiag) + + helper(row+1) + + queenCols.pop() + colUsed.remove(col) + posDiagUsed.remove(posDiag) + negDiagUsed.remove(negDiag) + + def convertFormat(queenCols: List[int]) -> List[str]: + output = [] + for col in queenCols: + row = '' + for i in range(n): + if i==col: + row += 'Q' + else: + row += '.' + output.append(row) + return output + + ans = [] + queenCols = [] + colUsed = set() + posDiagUsed = set() + negDiagUsed = set() + + helper(0) + return ans \ No newline at end of file diff --git a/problems/python3/network-delay-time.py b/problems/python3/network-delay-time.py new file mode 100644 index 0000000..6da8613 --- /dev/null +++ b/problems/python3/network-delay-time.py @@ -0,0 +1,23 @@ +class Solution: + def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int: + ans = 0 + adj = collections.defaultdict(list) + h = [] + visited = set() + + for u, v, w in times: + adj[u].append((v, w)) + + heapq.heappush(h, (0, k)) + while h: + timeNeededToGetHere, node = heapq.heappop(h) + + if node in visited: continue + visited.add(node) + ans = max(ans, timeNeededToGetHere) + + for nei, time in adj[node]: + if nei in visited: continue + heapq.heappush(h, (time+timeNeededToGetHere, nei)) + + return ans if len(visited)==n else -1 \ No newline at end of file diff --git a/problems/python3/non-overlapping-intervals.py b/problems/python3/non-overlapping-intervals.py new file mode 100644 index 0000000..b3b6a0d --- /dev/null +++ b/problems/python3/non-overlapping-intervals.py @@ -0,0 +1,17 @@ +""" +Time: O(NLogN) for sorting. +""" +class Solution: + def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int: + intervals.sort() + + ans = 0 + prevEnd = intervals[0][1] + + for s, e in intervals[1:]: + if s>=prevEnd: + prevEnd = e + else: + ans += 1 + prevEnd = min(prevEnd, e) + return ans \ No newline at end of file diff --git a/problems/python3/number-of-1-bits.py b/problems/python3/number-of-1-bits.py new file mode 100644 index 0000000..2273859 --- /dev/null +++ b/problems/python3/number-of-1-bits.py @@ -0,0 +1,10 @@ +""" +n = n&(n-1) will turn the right most 1 to 0. +""" +class Solution: + def hammingWeight(self, n: int) -> int: + ans = 0 + while n>0: + n = n&(n-1) + ans += 1 + return ans \ No newline at end of file diff --git a/problems/python3/number-of-connected-components-in-an-undirected-graph.py b/problems/python3/number-of-connected-components-in-an-undirected-graph.py new file mode 100644 index 0000000..28571ea --- /dev/null +++ b/problems/python3/number-of-connected-components-in-an-undirected-graph.py @@ -0,0 +1,25 @@ +class Solution: + def countComponents(self, N: int, edges: List[List[int]]) -> int: + def union(n1, n2): + p1 = find(n1) + p2 = find(n2) + if p1==p2: + return + elif p1 int: + def dfs(i, j): + if i<0 or j<0 or i>=MAX_ROWS or j>=MAX_COLS: return + if grid[i][j]!='1': return + + grid[i][j] = '2' + dfs(i+1, j) + dfs(i-1, j) + dfs(i, j+1) + dfs(i, j-1) + + count = 0 + MAX_ROWS = len(grid) + MAX_COLS = len(grid[0]) + + for i in range(MAX_ROWS): + for j in range(MAX_COLS): + if grid[i][j]=='1': + dfs(i, j) + count += 1 + return count \ No newline at end of file diff --git a/problems/python3/pacific-atlantic-water-flow.py b/problems/python3/pacific-atlantic-water-flow.py new file mode 100644 index 0000000..05032b0 --- /dev/null +++ b/problems/python3/pacific-atlantic-water-flow.py @@ -0,0 +1,30 @@ +class Solution: + def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]: + def bfs(q, ocian): + while q: + i0, j0 = q.popleft() + if (i0, j0) in ocian: continue + ocian.add((i0, j0)) + + for i, j in ((i0+1, j0), (i0-1, j0), (i0, j0+1), (i0, j0-1)): + if i<0 or j<0 or i>=MAX_ROW or j>=MAX_COL: continue + if heights[i][j]>=heights[i0][j0]: q.append((i, j)) + + MAX_ROW = len(heights) + MAX_COL = len(heights[0]) + + #add the top and left to q1 + pacific = set() + q1 = collections.deque() + for j in range(MAX_COL): q1.append((0, j)) + for i in range(MAX_ROW): q1.append((i, 0)) + + #add botton and right to q2 + atlantic = set() + q2 = collections.deque() + for j in range(MAX_COL): q2.append((MAX_ROW-1, j)) + for i in range(MAX_ROW): q2.append((i, MAX_COL-1)) + + bfs(q1, pacific) + bfs(q2, atlantic) + return pacific.intersection(atlantic) \ No newline at end of file diff --git a/problems/python3/palindrome-partitioning.py b/problems/python3/palindrome-partitioning.py new file mode 100644 index 0000000..d02ef17 --- /dev/null +++ b/problems/python3/palindrome-partitioning.py @@ -0,0 +1,64 @@ +""" +`helper(i)` finds all the palindrome substring from i to j see if we can get an answer by recursively calling `helper(j+1)`. + +Time: O(2^N * N), for a string length S, there will be 2^N combination of substrings. For each substring, it will take O(N) to test if they are all palindrome. +Space: O(N). `partition` will takes O(N) and recursion stack will also take O(N). O(N + N) ~= O(N) +""" +class Solution: + def partition(self, s: str) -> List[List[str]]: + def helper(i): + if i>=len(s): + ans.append(partition.copy()) + return + + for j in range(i, len(s)): + if isPalindrome(i, j): + partition.append(s[i:j+1]) + helper(j+1) + partition.pop() + + def isPalindrome(i, j): + while i<=j: + if s[i]!=s[j]: return False + i += 1 + j -= 1 + return True + + ans = [] + partition = [] + helper(0) + return ans + +""" +If you look closely you can see that we execute `isPalindrome` on many repeated substrings. +We can optimize this by storing the result in `dp` and reuse it. +Since all the less difference i and j (shorter substring s[i:j+1]) will be process first in the `isPalindrome`. +When checking if s[i:j+1] is a palindrome or not, we can simply check the if s[i]==s[j] and the previous result (dp[i+1][j-1]) + +Time: O(2^N * N), The overall time complexity is the same, but isPalindrome is actually a lot faster. +Space: O(N^2) for `dp`. +""" +class Solution: + def partition(self, s: str) -> List[List[str]]: + def helper(i): + if i>=N: + ans.append(partition.copy()) + return + + for j in range(i, N): + if isPalindrome(i, j): + partition.append(s[i:j+1]) + helper(j+1) + partition.pop() + + def isPalindrome(i, j): + dp[i][j] = i==j or (j-i==1 and s[i]==s[j]) or (s[i]==s[j] and dp[i+1][j-1]) #len==1 palindrome or len==2 palindrome or len>=3 palindrome + return dp[i][j] + + N = len(s) + ans = [] + partition = [] + dp = [[False]*N for _ in range(N)] + + helper(0) + return ans \ No newline at end of file diff --git a/problems/python3/palindromic-substrings.py b/problems/python3/palindromic-substrings.py new file mode 100644 index 0000000..7ef7e96 --- /dev/null +++ b/problems/python3/palindromic-substrings.py @@ -0,0 +1,16 @@ +class Solution: + def countSubstrings(self, s: str) -> int: + def countPalindrome(l, r) -> int: + count = 0 + while l>=0 and r bool: + total = sum(nums) + if total%2!=0: return False + + target = total/2 + possibleSum = set() + possibleSum.add(0) + for num in nums: + temp = set() + for p in possibleSum: + if p==target or p+num==target: return True + temp.add(p) + temp.add(p+num) + possibleSum = temp + return False \ No newline at end of file diff --git a/problems/python3/partition-labels.py b/problems/python3/partition-labels.py new file mode 100644 index 0000000..0c12d00 --- /dev/null +++ b/problems/python3/partition-labels.py @@ -0,0 +1,26 @@ +""" +Time: O(N) +Space: O(N) + +For each char, store its max index in maxIndex. +Iterate through the string, update the "currMax" along the way. +currMax is the place we can partition unless it get updated again. +If the current index is the currMax, update "ans". +""" +class Solution: + def partitionLabels(self, s: str) -> List[int]: + ans = [] + maxIndex = {} + + for i, c in enumerate(s): + maxIndex[c] = i + + currMax = 0 + processedLength = 0 + for i, c in enumerate(s): + currMax = max(currMax, maxIndex[c]) + if i==currMax: + ans.append(i+1 - processedLength) + processedLength += ans[-1] + + return ans \ No newline at end of file diff --git a/problems/python3/permutation-in-string.py b/problems/python3/permutation-in-string.py new file mode 100644 index 0000000..cd22781 --- /dev/null +++ b/problems/python3/permutation-in-string.py @@ -0,0 +1,28 @@ +class Solution: + def checkInclusion(self, s1: str, s2: str) -> bool: + if len(s1)>len(s2): return False + + counter1 = collections.Counter(s1) + counter2 = collections.Counter(s2[:len(s1)]) + matches = 0 + for c in 'abcdefghijklmnopqrstuvwxyz': + if counter1[c]==counter2[c]: matches += 1 + if matches==26: return True + + l = 0 + for r in range(len(s1), len(s2)): + counter2[s2[r]] += 1 + if counter1[s2[r]]==counter2[s2[r]]: + matches += 1 + elif counter1[s2[r]]+1==counter2[s2[r]]: + matches -= 1 + + counter2[s2[l]] -= 1 + if counter1[s2[l]]==counter2[s2[l]]: + matches += 1 + elif counter1[s2[l]]-1==counter2[s2[l]]: + matches -= 1 + l += 1 + + if matches==26: return True + return False \ No newline at end of file diff --git a/problems/python3/permutations.py b/problems/python3/permutations.py new file mode 100644 index 0000000..98d536d --- /dev/null +++ b/problems/python3/permutations.py @@ -0,0 +1,28 @@ +""" +Time: O(N!), since we call helper() N! times. +Space: O(N) for recursion stacks. + +Whenever we call `helper()`, we pick a num that is not "used" and add it to the `permutation`. +Recursively call the `helper()` until we filled the `permutation`. +Resotre `permutation` and `used` and try another `num`. +""" +class Solution: + def permute(self, nums: List[int]) -> List[List[int]]: + def helper(): + if len(permutation)==len(nums): + ans.append(permutation.copy()) + return + + for num in nums: + if num in used: continue + used.add(num) + permutation.append(num) + helper() + used.remove(num) + permutation.pop() + + ans = [] + permutation = [] + used = set() + helper() + return ans \ No newline at end of file diff --git a/problems/python3/plus-one.py b/problems/python3/plus-one.py new file mode 100644 index 0000000..8cfedb4 --- /dev/null +++ b/problems/python3/plus-one.py @@ -0,0 +1,16 @@ +class Solution: + def plusOne(self, digits: List[int]) -> List[int]: + i = len(digits)-1 + needAdditionDigit = True + + while i>=0 and needAdditionDigit: + if digits[i]==9: + digits[i] = 0 + i -= 1 + needAdditionDigit = True + else: + digits[i] += 1 + needAdditionDigit = False + if needAdditionDigit: digits.insert(0, 1) + return digits + \ No newline at end of file diff --git a/problems/python3/powx-n.py b/problems/python3/powx-n.py new file mode 100644 index 0000000..2b1b4fc --- /dev/null +++ b/problems/python3/powx-n.py @@ -0,0 +1,14 @@ +class Solution: + def myPow(self, x: float, k: int) -> float: + if k<0: return 1/self.myPow(x, -k) + + if k==0: + return 1 + elif k==1: + return x + elif k%2==0: + half = self.myPow(x, k//2) + return half * half + else: + half = self.myPow(x, (k-1)//2) + return half * half * x \ No newline at end of file diff --git a/problems/python3/product-of-array-except-self.py b/problems/python3/product-of-array-except-self.py new file mode 100644 index 0000000..2309896 --- /dev/null +++ b/problems/python3/product-of-array-except-self.py @@ -0,0 +1,45 @@ +class Solution: + def productExceptSelf(self, nums: List[int]) -> List[int]: + #left[i] := product of all nums left of nums[i] (not include nums[i]) + left = [1] + temp = 1 + for num in nums: + temp *= num + left.append(temp) + + #right[i] := product of all nums right of nums[i] (not include nums[i]) + right = [] + temp = 1 + for num in reversed(nums): + temp *= num + right.append(temp) + right.reverse() + right.append(1) + right = right[1:] + + ans = [] + for i in range(len(nums)): + ans.append(left[i]*right[i]) + return ans + +#In Place +class Solution: + def productExceptSelf(self, nums: List[int]) -> List[int]: + N = len(nums) + ans = [0]*N + + #generate "left" + ans[0] = 1 + for i in range(1, N): + ans[i] = ans[i-1]*nums[i-1] + + #generate "right" + temp = 1 + for i in range(N-2, -1, -1): + temp *= nums[i+1] + ans[i] *= temp + + return ans + + + \ No newline at end of file diff --git a/problems/python3/reconstruct-itinerary.py b/problems/python3/reconstruct-itinerary.py new file mode 100644 index 0000000..14c928f --- /dev/null +++ b/problems/python3/reconstruct-itinerary.py @@ -0,0 +1,27 @@ +""" +DFS with backtracking. +""" +class Solution: + def findItinerary(self, tickets: List[List[str]]) -> List[str]: + def dfs(start) -> bool: + if len(ans)==len(tickets)+1: return True + if start not in adj: return False + + temp = list(adj[start]) + for i, arr in enumerate(temp): + adj[start].pop(i) + ans.append(arr) + if dfs(arr): return True + adj[start].insert(i, arr) + ans.pop() + return False + + ans = ['JFK'] + adj = collections.defaultdict(list) + + tickets.sort() + for des, arr in tickets: + adj[des].append(arr) + + dfs('JFK') + return ans \ No newline at end of file diff --git a/problems/python3/redundant-connection.py b/problems/python3/redundant-connection.py new file mode 100644 index 0000000..47bda2e --- /dev/null +++ b/problems/python3/redundant-connection.py @@ -0,0 +1,32 @@ +class Solution: + def findRedundantConnection(self, edges: List[List[int]]) -> List[int]: + def union(n1, n2): + p1 = find(n1) + p2 = find(n2) + + if p1==p2: + return False #union failed, already united. + elif p1 bool: + def dfs(i, j): + if (i, j) in cache: return cache[(i, j)] + if i>=M and j>=N: return True + if j>=N: return False + + match = i Optional[ListNode]: + #count the length of the linked list + node = head + count = 0 + while node: + count += 1 + node = node.next + + + node = head + steps = count-n-1 + + #steps==-1 means that we need to remove the first node + if steps==-1: return head.next + + #traverse to the node before the node we wanted to remove + while steps>0: + node = node.next + steps -= 1 + + #remove "node.next" + node.next = node.next.next + + return head + + +#One pass. Fast pointer is ahead of slow pointer by n+1 +#So slow pointer will stop at the node before the node we wanted to remove +class Solution: + def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]: + dummy = ListNode() + dummy.next = head + + ahead = n+1 + fast = dummy + slow = dummy + + while fast: + fast = fast.next + ahead -= 1 + if ahead<0: slow = slow.next + + slow.next = slow.next.next + + return dummy.next \ No newline at end of file diff --git a/problems/python3/reorder-list.py b/problems/python3/reorder-list.py new file mode 100644 index 0000000..89c6ba2 --- /dev/null +++ b/problems/python3/reorder-list.py @@ -0,0 +1,37 @@ +class Solution: + def reorderList(self, head: Optional[ListNode]) -> None: + #find the middle point + slow = head + fast = head + while fast and fast.next: + slow = slow.next + fast = fast.next.next + middle = slow.next + + #reverse the linked list after the middle point + middle = self.reverseList(middle) + + #separate the linked list before the middle + slow.next = None + + #merge two linked list + node = head + while middle and node: + nextNode = node.next + node.next = middle + middle = middle.next + node.next.next = nextNode + node = nextNode + return head + + def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: + pre = None + node = head + + while node: + nextNode = node.next + node.next = pre + if not nextNode: return node + pre = node + node = nextNode + \ No newline at end of file diff --git a/problems/python3/reverse-bits.py b/problems/python3/reverse-bits.py new file mode 100644 index 0000000..dfc5191 --- /dev/null +++ b/problems/python3/reverse-bits.py @@ -0,0 +1,7 @@ +class Solution: + def reverseBits(self, n: int) -> int: + res = 0 + for i in range(32): + bit = (n >> i) & 1 + res = res | (bit << (31 - i)) + return res \ No newline at end of file diff --git a/problems/python3/reverse-integer.py b/problems/python3/reverse-integer.py new file mode 100644 index 0000000..76137ab --- /dev/null +++ b/problems/python3/reverse-integer.py @@ -0,0 +1,16 @@ +class Solution: + def reverse(self, x: int) -> int: + MAX = 2**31-1 + MIN = -2**31 + ans = 0 + + while x: + digit = int(math.fmod(x, 10)) + x = int(x/10) + + if ans>MAX//10 or (ans==MAX//10 and digit>MAX%10): return 0 + if ans Optional[ListNode]: + if not head or not head.next: return head + temp = self.reverseList(head.next) + head.next.next = head + head.next = None + return temp + +#Iterative +class Solution: + def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: + pre = None + node = head + + while node: + nextNode = node.next + node.next = pre + if not nextNode: return node + pre = node + node = nextNode \ No newline at end of file diff --git a/problems/python3/rotate-image.py b/problems/python3/rotate-image.py new file mode 100644 index 0000000..c8a872a --- /dev/null +++ b/problems/python3/rotate-image.py @@ -0,0 +1,16 @@ +class Solution: + def rotate(self, matrix: List[List[int]]) -> None: + l, r = 0, len(matrix[0])-1 + + while l int: + time = 0 + rotten = set() + aboutToRot = set() + fresh = set() + + for i in range(len(grid)): + for j in range((len(grid[0]))): + if grid[i][j]==2: + rotten.add((i, j)) + elif grid[i][j]==1: + fresh.add((i, j)) + + while rotten: + i0, j0 = rotten.pop() #randomly get one + grid[i0][j0] = 2 + + for i, j in ((i0+1, j0), (i0-1, j0), (i0, j0+1), (i0, j0-1)): + if i<0 or j<0 or i>=len(grid) or j>=len(grid[0]): continue + if (i, j) in rotten or (i, j) in aboutToRot: continue + if (i, j) in fresh: + fresh.remove((i, j)) + aboutToRot.add((i, j)) + + if not rotten and not aboutToRot: break + + if not rotten: + time += 1 + rotten = aboutToRot + aboutToRot = set() + + if fresh: return -1 + + return time \ No newline at end of file diff --git a/problems/python3/same-tree.py b/problems/python3/same-tree.py new file mode 100755 index 0000000..6687f04 --- /dev/null +++ b/problems/python3/same-tree.py @@ -0,0 +1,16 @@ +""" +Time: O(N) +Space: O(LogN) if the tree is balanced. +""" +class Solution: + def isSameTree(self, node1: Optional[TreeNode], node2: Optional[TreeNode]) -> bool: + if not node1 and not node2: + return True + + if (not node1 and node2) or (node1 and not node2): + return False + + if node1.val!=node2.val: + return False + + return self.isSameTree(node1.left, node2.left) and self.isSameTree(node1.right, node2.right) \ No newline at end of file diff --git a/problems/python3/search-a-2d-matrix.py b/problems/python3/search-a-2d-matrix.py new file mode 100644 index 0000000..2afe301 --- /dev/null +++ b/problems/python3/search-a-2d-matrix.py @@ -0,0 +1,22 @@ +class Solution: + def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: + N = len(matrix) + M = len(matrix[0]) + + l = 0 + r = N*M-1 + + while l<=r: + m = l + int((r-l)/2) + + i = int(m/M) + j = m%M + + if matrix[i][j]target: + r = m-1 + else: + return True + + return False \ No newline at end of file diff --git a/problems/python3/serialize-and-deserialize-binary-tree.py b/problems/python3/serialize-and-deserialize-binary-tree.py new file mode 100644 index 0000000..1b057d0 --- /dev/null +++ b/problems/python3/serialize-and-deserialize-binary-tree.py @@ -0,0 +1,22 @@ +class Codec: + + def serialize(self, root): + if not root: return '#' + return str(root.val)+','+self.serialize(root.left)+','+self.serialize(root.right) + + + def deserialize(self, data): + def helper(): + if data[self.i]=='#': + self.i += 1 + return None + + node = TreeNode(int(data[self.i])) + self.i += 1 + node.left = helper() + node.right = helper() + return node + + data = data.split(",") + self.i = 0 + return helper() \ No newline at end of file diff --git a/problems/python3/set-matrix-zeroes.py b/problems/python3/set-matrix-zeroes.py new file mode 100644 index 0000000..dd836e5 --- /dev/null +++ b/problems/python3/set-matrix-zeroes.py @@ -0,0 +1,28 @@ +class Solution: + def setZeroes(self, matrix: List[List[int]]) -> None: + M = len(matrix) + N = len(matrix[0]) + firstRowZero = False + + for i in range(M): + for j in range(N): + if matrix[i][j]==0: + matrix[0][j] = 0 + if i==0: + firstRowZero = True + else: + matrix[i][0] = 0 + + for i in range(1, M): + if matrix[i][0]==0: + for j in range(N): + matrix[i][j] = 0 + + for j in range(N): + if matrix[0][j]==0: + for i in range(M): + matrix[i][j] = 0 + + if firstRowZero: + for j in range(N): + matrix[0][j] = 0 \ No newline at end of file diff --git a/problems/python3/single-number.py b/problems/python3/single-number.py new file mode 100644 index 0000000..daa3268 --- /dev/null +++ b/problems/python3/single-number.py @@ -0,0 +1,15 @@ +""" +^ (XOR) +The same will be 0 +0^0 = 0 +1^1 = 0 + +Different will be 1 +1^0 = 1 +0^1 = 1 +""" +class Solution: + def singleNumber(self, nums: List[int]) -> int: + ans = 0 + for num in nums: ans ^= num + return ans \ No newline at end of file diff --git a/problems/python3/sliding-window-maximum.py b/problems/python3/sliding-window-maximum.py new file mode 100644 index 0000000..a535c16 --- /dev/null +++ b/problems/python3/sliding-window-maximum.py @@ -0,0 +1,18 @@ +class Solution: + def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: + ans = [] + q = collections.deque() + l = r = 0 + + while r List[int]: + ans = [] + x0 = 0 + y0 = 0 + dx = len(matrix[0])-1 + dy = len(matrix)-1 + direction = 'right' + isFirst = True + + ans.append(matrix[x0][y0]) + while True: + if direction=='right': + for x in range(x0+1, x0+dx+1): + ans.append(matrix[y0][x]) + x0 += dx + direction = 'down' + + if isFirst: + isFirst = False + else: + dx -= 1 + + if dy==0: break + + elif direction=='left': + for x in range(x0-1, x0-dx-1, -1): + ans.append(matrix[y0][x]) + x0 -= dx + direction = 'up' + dx -= 1 + if dy==0: break + + elif direction=='down': + for y in range(y0+1, y0+dy+1): + ans.append(matrix[y][x0]) + y0 += dy + direction = 'left' + dy -= 1 + if dx==0: break + + elif direction=='up': + for y in range(y0-1, y0-dy-1, -1): + ans.append(matrix[y][x0]) + y0 -= dy + direction = 'right' + dy -= 1 + if dx==0: break + return ans + + +""" +Answer from Neetcode, more elegant. +left, right, top, bottom is the border (index is exclusive on the border. +In other words, for matrix[i][j] +i: top List[int]: + res = [] + left, right = 0, len(matrix[0]) + top, bottom = 0, len(matrix) + + while left < right and top < bottom: + # get every i in the top row + for i in range(left, right): + res.append(matrix[top][i]) + top += 1 + # get every i in the right col + for i in range(top, bottom): + res.append(matrix[i][right - 1]) + right -= 1 + if not (left < right and top < bottom): + break + # get every i in the bottom row + for i in range(right - 1, left - 1, -1): + res.append(matrix[bottom - 1][i]) + bottom -= 1 + # get every i in the left col + for i in range(bottom - 1, top - 1, -1): + res.append(matrix[i][left]) + left += 1 + + return res \ No newline at end of file diff --git a/problems/python3/subsets-ii.py b/problems/python3/subsets-ii.py new file mode 100644 index 0000000..be0b0b7 --- /dev/null +++ b/problems/python3/subsets-ii.py @@ -0,0 +1,23 @@ +""" +Time: O(N * 2^N) +Space: O(N) +""" +class Solution: + def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: + def helper(i): + if i==len(nums): + ans.append(subset.copy()) + return + + subset.append(nums[i]) + helper(i+1) + subset.pop() + + while i+1 List[List[int]]: + def helper(i): + if not i List[int]: + N = len(s) + M = len(words) + W = len(words[0]) + wordSet = set(words) + ans = [] + counter = collections.Counter(words) + + for i in range(W): #[0] + windowCounter = collections.Counter() #counter for the word in words + notInWords = 0 #number of word not in the wordSet + theSame = 0 #number of word with the same count with "counter" + j = i + + while jcounter[word]: + theSame -= 1 + else: + notInWords += 1 + + popStart = j-M*W + if popStart>=0: + popWord = s[popStart:popStart+W] + if popWord in wordSet: + windowCounter[popWord] -= 1 + if windowCounter[popWord]==counter[popWord]: + theSame += 1 + elif windowCounter[popWord] bool: + if not root or not subRoot: return root==subRoot + if self.isSame(root, subRoot): return True + return self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot) + + def isSame(self, p, q): + if not p or not q: return p==q + if p.val!=q.val: return False + return self.isSame(p.left, q.left) and self.isSame(p.right, q.right) \ No newline at end of file diff --git a/problems/python3/sum-of-two-integers.py b/problems/python3/sum-of-two-integers.py new file mode 100644 index 0000000..25f16f9 --- /dev/null +++ b/problems/python3/sum-of-two-integers.py @@ -0,0 +1,12 @@ +""" +Does not work with negative values yet. +""" +class Solution: + def getSum(self, a: int, b: int) -> int: + ans = a^b + carry = (a&b)<<1 + + while carry!=0: + ans, carry = ans^carry, (ans&carry)<<1 + + return ans \ No newline at end of file diff --git a/problems/python3/surrounded-regions.py b/problems/python3/surrounded-regions.py new file mode 100644 index 0000000..42aa4c0 --- /dev/null +++ b/problems/python3/surrounded-regions.py @@ -0,0 +1,34 @@ +""" +Time: O(N) +Space: O(N) +""" +class Solution: + def solve(self, board: List[List[str]]) -> None: + def dfs(i0, j0): + if i0<0 or j0<0 or i0>=MAX_ROW or j0>=MAX_COL: return + if board[i0][j0]!='O': return + if (i0, j0) in survived: return + + survived.add((i0, j0)) + dfs(i0+1, j0) + dfs(i0-1, j0) + dfs(i0, j0+1) + dfs(i0, j0-1) + + + MAX_ROW = len(board) + MAX_COL = len(board[0]) + survived = set() + + for i in range(MAX_ROW): + dfs(i, 0) + dfs(i, MAX_COL-1) + + for j in range(MAX_COL): + dfs(0, j) + dfs(MAX_ROW-1, j) + + for i in range(MAX_ROW): + for j in range(MAX_COL): + board[i][j] = 'O' if (i, j) in survived else 'X' + return board \ No newline at end of file diff --git a/problems/python3/swim-in-rising-water.py b/problems/python3/swim-in-rising-water.py new file mode 100644 index 0000000..dd5dbef --- /dev/null +++ b/problems/python3/swim-in-rising-water.py @@ -0,0 +1,23 @@ +""" +Time: O(N^2 * LogN^2) = O(N^2 * 2LogN) = O(N^2LogN), N is the number of elements in a row or column. +Space: O(N^2) +""" +class Solution: + def swimInWater(self, grid: List[List[int]]) -> int: + ROWS = len(grid) + COLS = len(grid[0]) + + visited = set() + h = [(grid[0][0], 0, 0)] + + while h: + t, r0, c0 = heapq.heappop(h) + + if (r0, c0) in visited: continue + visited.add((r0, c0)) + if r0==ROWS-1 and c0==COLS-1: return t + + for r, c in ((r0+1, c0), (r0-1, c0), (r0, c0+1), (r0, c0-1)): + if r<0 or c<0 or r>=ROWS or c>=COLS: continue + if (r, c) in visited: continue + heapq.heappush(h, (max(t, grid[r][c]), r, c)) \ No newline at end of file diff --git a/problems/python3/target-sum.py b/problems/python3/target-sum.py new file mode 100644 index 0000000..832fadd --- /dev/null +++ b/problems/python3/target-sum.py @@ -0,0 +1,25 @@ +""" +Time: O(NS), S is sum(nums), N is len(nums). This is the max possible number of element in "history". Which will be lesser than 2^N. +Space: O(NS) +""" +class Solution: + def findTargetSumWays(self, nums: List[int], target: int) -> int: + def dfs(i, curr): + #cache + if (i, curr) in history: + return history[(i, curr)] + + #ending condition + if i==len(nums): + if curr==target: + history[(i, curr)] = 1 + else: + history[(i, curr)] = 0 + return history[(i, curr)] + + history[(i, curr)] = dfs(i+1, curr+nums[i])+dfs(i+1, curr-nums[i]) + return history[(i, curr)] + + ans = 0 + history = {} + return dfs(0, 0) \ No newline at end of file diff --git a/problems/python3/task-scheduler.py b/problems/python3/task-scheduler.py new file mode 100644 index 0000000..ddc4625 --- /dev/null +++ b/problems/python3/task-scheduler.py @@ -0,0 +1,23 @@ +class Solution: + def leastInterval(self, tasks: List[str], n: int) -> int: + q = collections.deque() + h = [] + time = 0 + + counter = collections.Counter(tasks) + for task in counter: + heapq.heappush(h, (-counter[task], task)) + + while h or q: + if q and q[0][0]<=time: + _, count, task = q.popleft() + heapq.heappush(h, (-count, task)) + + if h: + count, task = heapq.heappop(h) + count*=-1 + count -= 1 + if count>0: q.append((time+n+1, count, task)) + time += 1 + + return time \ No newline at end of file diff --git a/problems/python3/time-based-key-value-store.py b/problems/python3/time-based-key-value-store.py new file mode 100644 index 0000000..f43facf --- /dev/null +++ b/problems/python3/time-based-key-value-store.py @@ -0,0 +1,28 @@ +class TimeMap: + + def __init__(self): + self.data = collections.defaultdict(list) + + def set(self, key: str, value: str, timestamp: int) -> None: + self.data[key].append((timestamp, value)) + + def get(self, key: str, timestamp: int) -> str: + dataList = self.data[key] + l = 0 + r = len(dataList)-1 + ans = '' + + while l<=r: + m = l + int((r-l)/2) + t = dataList[m][0] + + if ttimestamp: + r = m-1 + else: + ans = dataList[m][1] + break + + return ans \ No newline at end of file diff --git a/problems/python3/top-k-frequent-elements.py b/problems/python3/top-k-frequent-elements.py new file mode 100644 index 0000000..7d728cb --- /dev/null +++ b/problems/python3/top-k-frequent-elements.py @@ -0,0 +1,53 @@ +#Bucket Sort +class Solution: + def topKFrequent(self, nums: List[int], k: int) -> List[int]: + bucket = collections.defaultdict(list) + counter = collections.Counter(nums) + ans = [] + + for num in counter: + bucket[counter[num]].append(num) + + tempCount = len(nums) + while len(ans) List[int]: + def quickSelect(freqs, s, e, K): + i = s + t = s + j = e + pivot = freqs[(s+e)//2][1] + + while t<=j: + if freqs[t][1]pivot: + freqs[j], freqs[t] = freqs[t], freqs[j] + j -= 1 + else: + t += 1 + if e-j>=K: + return quickSelect(freqs, j+1, e, K) + elif e-(i-1)>=K: + return pivot + else: + return quickSelect(freqs, s, i-1, K-(e-i+1)) + + counts = collections.Counter(nums) + freqs = [(num, counts[num]) for num in counts] + ans = [] + + KthLargestFreq = quickSelect(freqs, 0, len(freqs)-1, K) + + for num, freq in freqs: + if freq>=KthLargestFreq: + ans.append(num) + return ans \ No newline at end of file diff --git a/problems/python3/trapping-rain-water.py b/problems/python3/trapping-rain-water.py new file mode 100644 index 0000000..fe01411 --- /dev/null +++ b/problems/python3/trapping-rain-water.py @@ -0,0 +1,35 @@ +""" +The water stored at i is `min(leftMax, rightMax) - height[i]` +leftMax: max height left of i +rightMax: max height right of i + +To use only constant space. +We can calculete the leftMax or rightMax and update ans along the way. +And we always go with the side where leftMax or rightMax is smaller. + +Time: O(N) +Space: O(1) +""" +class Solution: + def trap(self, height: List[int]) -> int: + ans = 0 + l = 0 + r = len(height)-1 + + leftMax = float('-inf') + rightMax = float('-inf') + + while l<=r: + if leftMax=leftMax: + leftMax = height[l] + else: + ans += leftMax-height[l] + l += 1 + else: + if height[r]>=rightMax: + rightMax = height[r] + else: + ans += rightMax-height[r] + r -= 1 + return ans \ No newline at end of file diff --git a/problems/python3/two-sum-ii-input-array-is-sorted.py b/problems/python3/two-sum-ii-input-array-is-sorted.py new file mode 100644 index 0000000..2890404 --- /dev/null +++ b/problems/python3/two-sum-ii-input-array-is-sorted.py @@ -0,0 +1,11 @@ +class Solution: + def twoSum(self, numbers: List[int], target: int) -> List[int]: + i = 0 + j = len(numbers)-1 + + while numbers[i]+numbers[j] != target: + if numbers[i]+numbers[j] > target: + j -= 1 + else: + i += 1 + return (i+1, j+1) \ No newline at end of file diff --git a/problems/python3/two-sum.py b/problems/python3/two-sum.py new file mode 100644 index 0000000..aa90d66 --- /dev/null +++ b/problems/python3/two-sum.py @@ -0,0 +1,8 @@ +class Solution: + def twoSum(self, nums: List[int], target: int) -> List[int]: + #needed: {number required : counter part index} + needed = {} + for i, num in enumerate(nums): + if num in needed: + return (needed[num], i) + needed[target-num] = i \ No newline at end of file diff --git a/problems/python3/unique-paths.py b/problems/python3/unique-paths.py new file mode 100644 index 0000000..9c7ce40 --- /dev/null +++ b/problems/python3/unique-paths.py @@ -0,0 +1,11 @@ +class Solution: + def uniquePaths(self, m: int, n: int) -> int: + m = m-1 #number of steps need to move down + n = n-1 #number of steps need to move right + + #the total combination of m and n to sort will be (m+n)! + #since all "move down" are consider the same, we need to remove the repeatition of it sorting: m!. + #since all "move right" are consider the same, we need to remove the repeatition of it sorting: n!. + #(m+n)!/m!n! + + return math.factorial(m+n)//(math.factorial(m)*math.factorial(n)) \ No newline at end of file diff --git a/problems/python3/valid-anagram.py b/problems/python3/valid-anagram.py new file mode 100644 index 0000000..6c37cb0 --- /dev/null +++ b/problems/python3/valid-anagram.py @@ -0,0 +1,17 @@ +class Solution: + def isAnagram(self, s: str, t: str) -> bool: + counter = collections.Counter() + + for c in s: + counter[c] += 1 + + for c in t: + if c not in counter: + return False + counter[c] -= 1 + + for c in counter: + if counter[c]>0: + return False + + return True \ No newline at end of file diff --git a/problems/python3/valid-palindrome.py b/problems/python3/valid-palindrome.py new file mode 100644 index 0000000..0069c83 --- /dev/null +++ b/problems/python3/valid-palindrome.py @@ -0,0 +1,15 @@ +class Solution: + def isPalindrome(self, s: str) -> bool: + i = 0 + j = len(s)-1 + + while i<=j: + while i bool: + mapping = {')': '(', ']': '[', '}':'{'} + stack = [] + + for c in s: + if c not in mapping: + #open parentheses + stack.append(c) + else: + #close parentheses + if stack and stack[-1]==mapping[c]: + stack.pop() + else: + return False + + return not stack \ No newline at end of file diff --git a/problems/python3/valid-parenthesis-string.py b/problems/python3/valid-parenthesis-string.py new file mode 100644 index 0000000..52ea446 --- /dev/null +++ b/problems/python3/valid-parenthesis-string.py @@ -0,0 +1,23 @@ +class Solution: + def checkValidString(self, s: str) -> bool: + leftMin = 0 + leftMax = 0 + + for c in s: + if c=='(': + leftMin += 1 + leftMax += 1 + elif c==')': + leftMin -= 1 + leftMax -= 1 + else: + leftMin -= 1 + leftMax += 1 + + if leftMax<0: + return False + + if leftMin<0: + leftMin = 0 + + return leftMin == 0 \ No newline at end of file diff --git a/problems/python3/valid-sudoku.py b/problems/python3/valid-sudoku.py new file mode 100644 index 0000000..b2e6fa7 --- /dev/null +++ b/problems/python3/valid-sudoku.py @@ -0,0 +1,37 @@ +class Solution: + def isValidSudoku(self, board: List[List[str]]) -> bool: + def rowIsValid(i): + used = set() + for j in range(N): + if board[i][j]=='.': continue + if board[i][j] in used: return False + used.add(board[i][j]) + return True + + def columnIsValid(i): + used = set() + for j in range(N): + if board[j][i]=='.': continue + if board[j][i] in used: return False + used.add(board[j][i]) + return True + + def isBoxValid(i1, i2, j1, j2): + used = set() + for i in range(i1, i2+1): + for j in range(j1, j2+1): + if board[i][j]=='.': continue + if board[i][j] in used: return False + used.add(board[i][j]) + return True + + N = 9 + for i in range(N): + if not rowIsValid(i): return False + if not columnIsValid(i): return False + + for i in range(0, N, 3): + for j in range(0, N, 3): + if not isBoxValid(i, i+2, j, j+2): return False + + return True \ No newline at end of file diff --git a/problems/python3/validate-binary-search-tree.py b/problems/python3/validate-binary-search-tree.py new file mode 100755 index 0000000..4185bc6 --- /dev/null +++ b/problems/python3/validate-binary-search-tree.py @@ -0,0 +1,24 @@ +""" +The inorder travsersal of a BST is always increasing. + +Time: O(N) +Space: O(N) +""" +class Solution: + def isValidBST(self, root: Optional[TreeNode]) -> bool: + lastVal = float('-inf') + stack = [] + + node = root + while stack or node: + while node: + stack.append(node) + node = node.left + + node = stack.pop() + + if not lastVal None: + def bfs(i0, j0) -> None: + q = collections.deque([(i0+1, j0, 1), (i0-1, j0, 1), (i0, j0+1, 1), (i0, j0-1, 1)]) + visited = set() + + while q: + i, j, dis = q.popleft() + + if i<0 or j<0 or i>=MAX_ROW or j>=MAX_COL: continue + if rooms[i][j]==0 or rooms[i][j]==-1: continue + if (i, j, dis) in visited: continue + visited.add((i, j, dis)) + + if dis bool: + def dfs(i): + if i==len(s): return True + if i in history and not history[i]: return False + + for word in wordDict: + if i+len(word)<=len(s) and s[i:i+len(word)]==word: + history[i] = True + if dfs(i+len(word)): return True + history[i] = False + return False + + history = {} + return dfs(0) \ No newline at end of file diff --git a/problems/python3/word-ladder.py b/problems/python3/word-ladder.py new file mode 100644 index 0000000..453fb4a --- /dev/null +++ b/problems/python3/word-ladder.py @@ -0,0 +1,40 @@ +""" +Time: O(NxM^2). N is the number of words. M is the length of the word. +Note that, getPatterns() takes O(M^2) since creating new string will also takes O(M) and for each word we do that O(M) times. + +Space: O(NxM^2) +""" +class Solution: + def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int: + def getPatterns(word) -> List[str]: + patterns = [] + for i in range(len(word)): + pattern = word[:i]+'*'+word[i+1:] + patterns.append(pattern) + return patterns + + + if endWord not in wordList: return 0 + wordList.append(beginWord) + + #build adjacency list + nei = collections.defaultdict(list) + for word in wordList: + for pattern in getPatterns(word): + nei[pattern].append(word) + + #BFS + q = collections.deque([(beginWord, 1)]) + visited = set() + while q: + word, steps = q.popleft() + + if word in visited: continue + visited.add(word) + if word==endWord: return steps + + for pattern in getPatterns(word): + for nextWord in nei[pattern]: + if nextWord in visited: continue + q.append((nextWord, steps+1)) + return 0 \ No newline at end of file diff --git a/problems/python3/word-search-ii.py b/problems/python3/word-search-ii.py new file mode 100644 index 0000000..a285655 --- /dev/null +++ b/problems/python3/word-search-ii.py @@ -0,0 +1,54 @@ +""" +Time: O(M * 4 * 3^(L-1)), M is board elements count, L is the average word length. +Space: O(N), N is the number of char in the words + +This solution will TLE. We need to further "prune" the trie once we reach the leaf node. +""" +class TrieNode(): + def __init__(self): + self.children = {} + self.isEnd = False + def addWord(self, word): + curr = self + for c in word: + if c not in curr.children: + curr.children[c] = TrieNode() + curr = curr.children[c] + curr.isEnd = True + +class Solution: + def findWords(self, board: List[List[str]], words: List[str]) -> List[str]: + def dfs(r, c, node, word): + if c<0 or r<0 or c==COLS or r==ROWS: return + if board[r][c] not in node.children: return + if (r, c) in visited: return + + visited.add((r, c)) + node = node.children[board[r][c]] + word += board[r][c] + if node.isEnd: + ans.add(word) + node.isEnd = False + + dfs(r+1, c, node, word) + dfs(r-1, c, node, word) + dfs(r, c+1, node, word) + dfs(r, c-1, node, word) + + visited.remove((r, c)) + + + root = TrieNode() + for word in words: + root.addWord(word) + + ROWS = len(board) + COLS = len(board[0]) + + visited = set() + ans = set() + node = root + for r in range(ROWS): + for c in range(COLS): + dfs(r, c, root, '') + return ans \ No newline at end of file diff --git a/problems/python3/word-search.py b/problems/python3/word-search.py new file mode 100644 index 0000000..b7ebb09 --- /dev/null +++ b/problems/python3/word-search.py @@ -0,0 +1,27 @@ +class Solution: + def exist(self, board: List[List[str]], word: str) -> bool: + def helper(x, i, j): + if i<0 or i>=N or j<0 or j>=M: return False + if (i, j) in usedWords: return False + usedWords.add((i, j)) + + if word[x]==board[i][j]: + if x==len(word)-1: + return True + else: + if helper(x+1, i+1, j): return True + if helper(x+1, i, j+1): return True + if helper(x+1, i-1, j): return True + if helper(x+1, i, j-1): return True + + + usedWords.remove((i, j)) + return False + + usedWords = set() + N = len(board) + M = len(board[0]) + for i in range(N): + for j in range(M): + if helper(0, i, j): return True + return False \ No newline at end of file