From fe0540bde1f5352f7ae249e8d9e96eb1d4b6ed95 Mon Sep 17 00:00:00 2001 From: lyandut Date: Sun, 28 Jul 2019 17:19:54 +0800 Subject: [PATCH 01/37] add C++ implementation for Array/ --- Array/01.TwoSum/README.md | 2 +- Array/01.TwoSum/TwoSum.cpp | 18 ++++++++++ Array/02.ThreeSum/README.md | 6 ++-- Array/02.ThreeSum/ThreeSum.cpp | 33 +++++++++++++++++++ Array/03.MajorityElement/MajorityElement.cpp | 13 ++++++++ Array/03.MajorityElement/README.md | 6 ++-- Array/04.FizzBuzz/FizzBuzz.cpp | 17 ++++++++++ Array/04.FizzBuzz/README.md | 2 +- .../05.MergeSortedArray/MergeSortedArray.cpp | 20 +++++++++++ Array/05.MergeSortedArray/README.md | 2 +- .../FirstMissingPositive.cpp | 20 +++++++++++ Array/06.FirstMissingPositive/README.md | 2 +- .../KthLargestElement.cpp | 32 ++++++++++++++++++ Array/07.KthLargestElement/README.md | 2 +- .../README.md | 2 +- Array/08.SingleNumber/SingleNumber.cpp | 9 +++++ .../SingleNumber.js | 0 .../FindAllDuplicates.cpp | 13 ++++++++ Array/09.FindAllDuplicates/README.md | 2 +- 19 files changed, 188 insertions(+), 13 deletions(-) create mode 100644 Array/01.TwoSum/TwoSum.cpp create mode 100644 Array/02.ThreeSum/ThreeSum.cpp create mode 100644 Array/03.MajorityElement/MajorityElement.cpp create mode 100644 Array/04.FizzBuzz/FizzBuzz.cpp create mode 100644 Array/05.MergeSortedArray/MergeSortedArray.cpp create mode 100644 Array/06.FirstMissingPositive/FirstMissingPositive.cpp create mode 100644 Array/07.KthLargestElement/KthLargestElement.cpp rename Array/{08.SingleNnumber => 08.SingleNumber}/README.md (88%) create mode 100644 Array/08.SingleNumber/SingleNumber.cpp rename Array/{08.SingleNnumber => 08.SingleNumber}/SingleNumber.js (100%) create mode 100644 Array/09.FindAllDuplicates/FindAllDuplicates.cpp diff --git a/Array/01.TwoSum/README.md b/Array/01.TwoSum/README.md index 2eb086f..64745ef 100644 --- a/Array/01.TwoSum/README.md +++ b/Array/01.TwoSum/README.md @@ -27,4 +27,4 @@ ## 代码实现 | C | C++ | Java | Python | JavaScript | PHP | | :--: | :--: | :--: | :--: | :---: | :---: | -| 🤔 | 🤔 | 🤔 | [😀](TwoSum.py) | [😀](TwoSum.js) | 🤔 | +| 🤔 | [😀](TwoSum.cpp) | [😀](TwoSum.java) | [😀](TwoSum.py) | [😀](TwoSum.js) | 🤔 | diff --git a/Array/01.TwoSum/TwoSum.cpp b/Array/01.TwoSum/TwoSum.cpp new file mode 100644 index 0000000..d8f7bc6 --- /dev/null +++ b/Array/01.TwoSum/TwoSum.cpp @@ -0,0 +1,18 @@ + +class Solution { +public: + vector twoSum(vector& nums, int target) { + vector res; + map hashMap; + for(int i=0; i> threeSum(vector& nums) { + vector> res; + if(nums.size() < 3) { return res; } + sort(nums.begin(), nums.end()); + for(int i=0; i 0) { break; } + if(i>0 && nums[i] == nums[i-1]) { continue; } + int l = i + 1, r = nums.size() - 1; + while(l < r) { + int sum = nums[i] + nums[l] + nums[r]; + if(sum == 0) { + res.push_back({nums[i], nums[l], nums[r]}); + while(l < r && nums[l] == nums[l+1]) { l++; } + while(l < r && nums[r] == nums[r-1]) { r--; } + l++; + r--; + } + else if(sum < 0) { + while(l < r && nums[l] == nums[l+1]) { l++; } + l++; + } + else { + while(l < r && nums[r] == nums[r-1]) { r--; } + r--; + } + } + } + return res; + } +}; \ No newline at end of file diff --git a/Array/03.MajorityElement/MajorityElement.cpp b/Array/03.MajorityElement/MajorityElement.cpp new file mode 100644 index 0000000..9b93e82 --- /dev/null +++ b/Array/03.MajorityElement/MajorityElement.cpp @@ -0,0 +1,13 @@ + +class Solution { +public: + int majorityElement(vector& nums) { + int major; + int count = 0; + for(auto num : nums) { + if(count == 0) { major = num; } + count += (num == major) ? 1 : -1; + } + return major; + } +}; \ No newline at end of file diff --git a/Array/03.MajorityElement/README.md b/Array/03.MajorityElement/README.md index 2212f0a..c82d3dd 100644 --- a/Array/03.MajorityElement/README.md +++ b/Array/03.MajorityElement/README.md @@ -29,6 +29,6 @@ 使用 major 变量记录众数,count 记录遇到 major +1,非 major -1,最终 count 会大于0,major 即代表众数。 ## 代码实现 -| C | C++ | Java | Python | JavaScript | PHP | -| :--: | :--: | :--: | :--: | :---: | :---: | -| 🤔 | 🤔 | 🤔 | 🤔 | [😀](./MajorityElement.js) | 🤔 | +| C | C++ | Java | Python | JavaScript | PHP | Go | +| :--: | :--: | :--: | :--: | :---: | :---: | :---: | +| 🤔 | [😀](./MajorityElement.cpp) | [😀](./MajorityElement.java) | 🤔 | [😀](./MajorityElement.js) | 🤔 | [😀](./majority_elements.go) | diff --git a/Array/04.FizzBuzz/FizzBuzz.cpp b/Array/04.FizzBuzz/FizzBuzz.cpp new file mode 100644 index 0000000..b38b2ee --- /dev/null +++ b/Array/04.FizzBuzz/FizzBuzz.cpp @@ -0,0 +1,17 @@ + +class Solution { +public: + vector fizzBuzz(int n) { + vector res(n, ""); + for(int i = 1; i<=n; ++i) { + bool multiplesOfThree = (i % 3 == 0); + bool multiplesOfFive = (i % 5 == 0); + + if(multiplesOfThree && multiplesOfFive) { res[i-1] = "FizzBuzz"; } + else if(multiplesOfThree) { res[i-1] = "Fizz"; } + else if(multiplesOfFive) {res[i-1] = "Buzz"; } + else { res[i-1] = to_string(i); } + } + return res; + } +}; \ No newline at end of file diff --git a/Array/04.FizzBuzz/README.md b/Array/04.FizzBuzz/README.md index 310393b..1c2680e 100644 --- a/Array/04.FizzBuzz/README.md +++ b/Array/04.FizzBuzz/README.md @@ -41,4 +41,4 @@ n = 15, ## 代码实现 | C | C++ | Java | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | 🤔 | 🤔 | [😀](./FizzBuzz.py) | 🤔 | 🤔 | 🤔 | +| 🤔 | [😀](./FizzBuzz.cpp) | 🤔 | [😀](./FizzBuzz.py) | 🤔 | 🤔 | 🤔 | diff --git a/Array/05.MergeSortedArray/MergeSortedArray.cpp b/Array/05.MergeSortedArray/MergeSortedArray.cpp new file mode 100644 index 0000000..368f74d --- /dev/null +++ b/Array/05.MergeSortedArray/MergeSortedArray.cpp @@ -0,0 +1,20 @@ + +class Solution { +public: + void merge(vector& nums1, int m, vector& nums2, int n) { + while(m && n) { + if(nums1[m-1] > nums2[n-1]) { + nums1[m+n-1] = nums1[m-1]; + m--; + } + else { + nums1[m+n-1] = nums2[n-1]; + n--; + } + } + while(n) { + nums1[n-1] = nums2[n-1]; + n--; + } + } +}; \ No newline at end of file diff --git a/Array/05.MergeSortedArray/README.md b/Array/05.MergeSortedArray/README.md index 396722e..d39dad9 100644 --- a/Array/05.MergeSortedArray/README.md +++ b/Array/05.MergeSortedArray/README.md @@ -28,4 +28,4 @@ nums2 = [2,5,6], n = 3 ## 代码实现 | C | C++ | Java | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | 🤔 | 🤔 | [😀](MergeSortedArray.py) | 🤔 | 🤔 | 🤔 | +| 🤔 | [😀](MergeSortedArray.cpp) | 🤔 | [😀](MergeSortedArray.py) | 🤔 | 🤔 | 🤔 | diff --git a/Array/06.FirstMissingPositive/FirstMissingPositive.cpp b/Array/06.FirstMissingPositive/FirstMissingPositive.cpp new file mode 100644 index 0000000..1eb95f4 --- /dev/null +++ b/Array/06.FirstMissingPositive/FirstMissingPositive.cpp @@ -0,0 +1,20 @@ + +class Solution { +public: + int firstMissingPositive(vector& nums) { + int len = nums.size(); + for (int i = 0; i < len; ++i) { + int tmp = nums[i]; + while (tmp > 0 && tmp <= len && nums[tmp-1] != tmp) { + nums[i] = nums[tmp-1]; + nums[tmp-1] = tmp; + tmp = nums[i]; + } + } + for (int i = 0; i < len; ++i) { + if (nums[i]-1 != i) { return i + 1; } + } + + return len + 1; + } +}; \ No newline at end of file diff --git a/Array/06.FirstMissingPositive/README.md b/Array/06.FirstMissingPositive/README.md index a312995..4074262 100644 --- a/Array/06.FirstMissingPositive/README.md +++ b/Array/06.FirstMissingPositive/README.md @@ -31,4 +31,4 @@ ## 代码实现 | C | C++ | Java | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | 🤔 | 🤔 | [😀](FirstMissingPositive.py) | 🤔 | 🤔 | 🤔 | +| 🤔 | [😀](FirstMissingPositive.cpp) | 🤔 | [😀](FirstMissingPositive.py) | 🤔 | 🤔 | 🤔 | diff --git a/Array/07.KthLargestElement/KthLargestElement.cpp b/Array/07.KthLargestElement/KthLargestElement.cpp new file mode 100644 index 0000000..cbdda60 --- /dev/null +++ b/Array/07.KthLargestElement/KthLargestElement.cpp @@ -0,0 +1,32 @@ + +class Solution { +public: + int findKthLargest(vector& nums, int k) { + return _quickSelect(nums, 0, nums.size()-1, k-1); + } + + int _quickSelect(vector nums, int left, int right, int k) { + int origin_left = left, origin_right = right; + int pivot = nums[origin_right]; + while (left < right) { + while (left < right && nums[left] > pivot) { left++; } + while (left < right && nums[right] <= pivot) { right--; } + int tmp = nums[left]; + nums[left] = nums[right]; + nums[right] = tmp; + } + nums[origin_right] = nums[left]; + nums[left] = pivot; + + + if (k == left) { + return nums[left]; + } + else if (k > left) { + return _quickSelect(nums, left+1, origin_right, k); + } + else { + return _quickSelect(nums, origin_left, left-1, k); + } + } +}; \ No newline at end of file diff --git a/Array/07.KthLargestElement/README.md b/Array/07.KthLargestElement/README.md index 6535a63..f3314a1 100644 --- a/Array/07.KthLargestElement/README.md +++ b/Array/07.KthLargestElement/README.md @@ -34,4 +34,4 @@ | C | C++ | Java | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | 🤔 | 🤔 | [😀](KthLargestElement.py) | 🤔 | 🤔 | 🤔 | +| 🤔 | [😀](KthLargestElement.cpp) | 🤔 | [😀](KthLargestElement.py) | 🤔 | 🤔 | 🤔 | diff --git a/Array/08.SingleNnumber/README.md b/Array/08.SingleNumber/README.md similarity index 88% rename from Array/08.SingleNnumber/README.md rename to Array/08.SingleNumber/README.md index 21781c0..2f464fc 100644 --- a/Array/08.SingleNnumber/README.md +++ b/Array/08.SingleNumber/README.md @@ -34,5 +34,5 @@ ## 代码实现 | C | C++ | Java | Objective-C | Swift | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | [😀](./SingleNumber.js) | 🤔 | 🤔 | +| 🤔 | [😀](./SingleNumber.cpp) | 🤔 | 🤔 | 🤔 | 🤔 | [😀](./SingleNumber.js) | 🤔 | 🤔 | diff --git a/Array/08.SingleNumber/SingleNumber.cpp b/Array/08.SingleNumber/SingleNumber.cpp new file mode 100644 index 0000000..f727a17 --- /dev/null +++ b/Array/08.SingleNumber/SingleNumber.cpp @@ -0,0 +1,9 @@ + +class Solution { +public: + int singleNumber(vector& nums) { + int res = 0; + for(auto num : nums) { res^=num; } + return res; + } +}; \ No newline at end of file diff --git a/Array/08.SingleNnumber/SingleNumber.js b/Array/08.SingleNumber/SingleNumber.js similarity index 100% rename from Array/08.SingleNnumber/SingleNumber.js rename to Array/08.SingleNumber/SingleNumber.js diff --git a/Array/09.FindAllDuplicates/FindAllDuplicates.cpp b/Array/09.FindAllDuplicates/FindAllDuplicates.cpp new file mode 100644 index 0000000..feca9e7 --- /dev/null +++ b/Array/09.FindAllDuplicates/FindAllDuplicates.cpp @@ -0,0 +1,13 @@ + +class Solution { +public: + vector findDuplicates(vector& nums) { + vector res; + for(int i=0; i Date: Wed, 31 Jul 2019 21:57:55 +0800 Subject: [PATCH 02/37] add NextPremutation --- Array/10.NextPremutation/README.md | 6 +++++ Array/10.NextPremutation/index.js | 36 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 Array/10.NextPremutation/README.md create mode 100644 Array/10.NextPremutation/index.js diff --git a/Array/10.NextPremutation/README.md b/Array/10.NextPremutation/README.md new file mode 100644 index 0000000..481be39 --- /dev/null +++ b/Array/10.NextPremutation/README.md @@ -0,0 +1,6 @@ +https://leetcode.com/problems/next-permutation/ + +1. 从右往左查找,找到第一个破坏递增序列的数,所在的下标 k,如果没找到返回原序列的逆序列; +2. 在 k 下标的右侧查找比 nums[k] 大的,下标最大的数 nums[l]。 +3. 交换 nums[l] 和 nums[k]; +4. 将 k 下标之后的元素,从小到大排序。 diff --git a/Array/10.NextPremutation/index.js b/Array/10.NextPremutation/index.js new file mode 100644 index 0000000..2aa1761 --- /dev/null +++ b/Array/10.NextPremutation/index.js @@ -0,0 +1,36 @@ +var nextPermutation = function(nums) { + const len = nums.length; + if (len < 2) return nums; + + let prev = nums[len - 1]; + let k = len - 2; + for (k; k >= 0; --k) { + if (prev > nums[k]) { + break; + } + prev = nums[k]; + } + if (k < 0) { + return nums.reverse(); + } + // find rightest index for which value larger than nums[k] + let l = len - 1; + for(l; l > k; --l) { + if (nums[l] > nums[k]) { + break; + } + } + // swap in-place + [nums[k], nums[l]] = [nums[l], nums[k]]; + // reverse start with i, equal to sort + const reverse = (arr, i) => { + const end = arr.length - 1; + const mid = (i + end) / 2; + for (let j = i; j <= mid; ++j) { + [arr[j], arr[end-(j-i)]] = [arr[end-(j-i)], arr[j]]; + } + return arr; + }; + return reverse(nums, k + 1); +}; + From d31b7e9390dedc1ca687c5b9605d1c0b306c4050 Mon Sep 17 00:00:00 2001 From: Smallfly Date: Wed, 31 Jul 2019 22:01:10 +0800 Subject: [PATCH 03/37] update readme --- Array/10.NextPremutation/README.md | 2 ++ Array/README.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Array/10.NextPremutation/README.md b/Array/10.NextPremutation/README.md index 481be39..5f63dde 100644 --- a/Array/10.NextPremutation/README.md +++ b/Array/10.NextPremutation/README.md @@ -1,5 +1,7 @@ + https://leetcode.com/problems/next-permutation/ + 思路: 1. 从右往左查找,找到第一个破坏递增序列的数,所在的下标 k,如果没找到返回原序列的逆序列; 2. 在 k 下标的右侧查找比 nums[k] 大的,下标最大的数 nums[l]。 3. 交换 nums[l] 和 nums[k]; diff --git a/Array/README.md b/Array/README.md index 5641021..24204fc 100644 --- a/Array/README.md +++ b/Array/README.md @@ -18,3 +18,5 @@ [09. Find All Duplicates in an Array(数组中重复的数字)](./09.FindAllDuplicates) +[10. Next Premutation](./NextPremutation) + From 86b7a2f8846f3685030b6dcc44823f81b5b0f8b5 Mon Sep 17 00:00:00 2001 From: Smallfly Date: Wed, 31 Jul 2019 22:05:23 +0800 Subject: [PATCH 04/37] update path --- Array/10.NextPremutation/README.md | 2 +- Array/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Array/10.NextPremutation/README.md b/Array/10.NextPremutation/README.md index 5f63dde..b5b58a1 100644 --- a/Array/10.NextPremutation/README.md +++ b/Array/10.NextPremutation/README.md @@ -3,6 +3,6 @@ https://leetcode.com/problems/next-permutation/ 思路: 1. 从右往左查找,找到第一个破坏递增序列的数,所在的下标 k,如果没找到返回原序列的逆序列; -2. 在 k 下标的右侧查找比 nums[k] 大的,下标最大的数 nums[l]。 +2. 在 k 下标的右侧查找比 nums[k] 大的,下标最大的数 nums[l]; 3. 交换 nums[l] 和 nums[k]; 4. 将 k 下标之后的元素,从小到大排序。 diff --git a/Array/README.md b/Array/README.md index 24204fc..3a2d371 100644 --- a/Array/README.md +++ b/Array/README.md @@ -18,5 +18,5 @@ [09. Find All Duplicates in an Array(数组中重复的数字)](./09.FindAllDuplicates) -[10. Next Premutation](./NextPremutation) +[10. Next Premutation](./10.NextPremutation) From 0133430c17231a5c337919a6d020f551024dcc0a Mon Sep 17 00:00:00 2001 From: lyandut Date: Sun, 28 Jul 2019 17:31:34 +0800 Subject: [PATCH 05/37] fix Array/README.md --- Array/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Array/README.md b/Array/README.md index 3a2d371..fde150e 100644 --- a/Array/README.md +++ b/Array/README.md @@ -14,7 +14,7 @@ [07. Kth Largest Element in an Array(查找第K大的数)](./07.KthLargestElement) -[08. Single Number(数组中只出现一次的数)](./08.SingleNnumber) +[08. Single Number(数组中只出现一次的数)](./08.SingleNumber) [09. Find All Duplicates in an Array(数组中重复的数字)](./09.FindAllDuplicates) From 4b9c0dae55f08b9d9f5cc25361e32daf8f5143d1 Mon Sep 17 00:00:00 2001 From: lyandut Date: Thu, 1 Aug 2019 11:04:12 +0800 Subject: [PATCH 06/37] add c++ implenmentation for Array/10.NextPremutation/ --- Array/10.NextPremutation/NextPremutation.cpp | 23 +++++++++++++++++++ .../{index.js => NextPremutation.js} | 0 Array/10.NextPremutation/README.md | 5 ++++ 3 files changed, 28 insertions(+) create mode 100644 Array/10.NextPremutation/NextPremutation.cpp rename Array/10.NextPremutation/{index.js => NextPremutation.js} (100%) diff --git a/Array/10.NextPremutation/NextPremutation.cpp b/Array/10.NextPremutation/NextPremutation.cpp new file mode 100644 index 0000000..8784311 --- /dev/null +++ b/Array/10.NextPremutation/NextPremutation.cpp @@ -0,0 +1,23 @@ + +class Solution { +public: + void nextPermutation(vector& nums) { + if(nums.size() < 2) { return; } + int len = nums.size(); + int i = len - 1; + for(; i>0; --i) { + if(nums[i] > nums[i-1]) { break; } + } + if(i==0) { + reverse(nums.begin(), nums.end()); + return; + } + int j = len - 1; + for(; j>=i; --j){ + if(nums[j] > nums[i-1]) { break; } + } + swap(nums[i-1], nums[j]); + reverse(nums.begin()+i, nums.end()); + // sort(nums.begin()+i, nums.end()); + } +}; \ No newline at end of file diff --git a/Array/10.NextPremutation/index.js b/Array/10.NextPremutation/NextPremutation.js similarity index 100% rename from Array/10.NextPremutation/index.js rename to Array/10.NextPremutation/NextPremutation.js diff --git a/Array/10.NextPremutation/README.md b/Array/10.NextPremutation/README.md index b5b58a1..99b32bf 100644 --- a/Array/10.NextPremutation/README.md +++ b/Array/10.NextPremutation/README.md @@ -6,3 +6,8 @@ https://leetcode.com/problems/next-permutation/ 2. 在 k 下标的右侧查找比 nums[k] 大的,下标最大的数 nums[l]; 3. 交换 nums[l] 和 nums[k]; 4. 将 k 下标之后的元素,从小到大排序。 + +## 代码实现 +| C | C++ | Java | Objective-C | Swift | Python | JavaScript | Go | PHP | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 🤔 | [😀](./NextPremutation.cpp) | 🤔 | 🤔 | 🤔 | 🤔 | [😀](./NextPremutation.js) | 🤔 | 🤔 | \ No newline at end of file From 3ae92741da92852733d06fe8d3bc009906eaa792 Mon Sep 17 00:00:00 2001 From: lyandut Date: Mon, 12 Aug 2019 11:43:07 +0800 Subject: [PATCH 07/37] add c++ implenmentation for LinkedList/01~04 --- LinkedList/01.ReverseLinkedList/README.md | 8 +++- .../ReverseLinkedList.cpp | 44 +++++++++++++++++++ .../02.LinkedListCycle/LinkedListCycle.cpp | 12 +++++ LinkedList/02.LinkedListCycle/README.md | 4 +- .../02.LinkedListCycle/linked_list_cycle.go | 2 +- .../03.LinkedListCycle2/LinkedListCycle2.cpp | 19 ++++++++ LinkedList/03.LinkedListCycle2/README.md | 10 +++-- .../04.MergeSortedLists/MergeSortedLists.cpp | 39 ++++++++++++++++ .../04.MergeSortedLists/MergeSortedLists.py | 4 +- LinkedList/04.MergeSortedLists/README.md | 4 +- 10 files changed, 132 insertions(+), 14 deletions(-) create mode 100644 LinkedList/01.ReverseLinkedList/ReverseLinkedList.cpp create mode 100644 LinkedList/02.LinkedListCycle/LinkedListCycle.cpp create mode 100644 LinkedList/03.LinkedListCycle2/LinkedListCycle2.cpp create mode 100644 LinkedList/04.MergeSortedLists/MergeSortedLists.cpp diff --git a/LinkedList/01.ReverseLinkedList/README.md b/LinkedList/01.ReverseLinkedList/README.md index 3a0340d..d6d4b06 100644 --- a/LinkedList/01.ReverseLinkedList/README.md +++ b/LinkedList/01.ReverseLinkedList/README.md @@ -20,11 +20,15 @@ ## 思路
点击展开 -// TODO + +1. 迭代:引入两个指针,prev记录上一个节点,back记录下一个节点,时间复杂度O(n),空间复杂度O(1); + +2. 递归:head.next.next = head;时间复杂度O(n),空间复杂度O(n)。 +
## 代码实现 | C | C++ | Java | Objective-C | Swift | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | [😀](./ReverseLinkedList.py) | 🤔 | 🤔 | 🤔 | +| 🤔 | [😀](./ReverseLinkedList.cpp) | 🤔 | 🤔 | 🤔 | [😀](./ReverseLinkedList.py) | 🤔 | 🤔 | 🤔 | diff --git a/LinkedList/01.ReverseLinkedList/ReverseLinkedList.cpp b/LinkedList/01.ReverseLinkedList/ReverseLinkedList.cpp new file mode 100644 index 0000000..42bd130 --- /dev/null +++ b/LinkedList/01.ReverseLinkedList/ReverseLinkedList.cpp @@ -0,0 +1,44 @@ +/// 迭代 +class Solution { +public: + ListNode* reverseList(ListNode *head) { + ListNode *prev = nullptr; + ListNode *back; + while(head) { + back = head->next; + head->next = prev; + prev = head; + head = back; + } + return prev; + } +}; + + +/// 递归一: +class Solution { +public: + ListNode* _reverseList(ListNode *head, ListNode *prev = nullptr){ + if (head == nullptr) { return prev; } + ListNode *back = head->next; + head->next = prev; + return _reverseList(back, head); + } + + ListNode* reverseList(ListNode* head) { + return _reverseList(head); + } +}; + + +/// 递归二: +class Solution { +public: + ListNode* reverseList(ListNode *head) { + if(head == nullptr || head->next == nullptr) { return head; } + ListNode *new_head = reverseList(head->next); + head->next->next = head; + head->next = nullptr; + return new_head; + } +}; diff --git a/LinkedList/02.LinkedListCycle/LinkedListCycle.cpp b/LinkedList/02.LinkedListCycle/LinkedListCycle.cpp new file mode 100644 index 0000000..a425c74 --- /dev/null +++ b/LinkedList/02.LinkedListCycle/LinkedListCycle.cpp @@ -0,0 +1,12 @@ +class Solution { +public: + bool hasCycle(ListNode *head) { + ListNode *fast = head, *slow = head; + while(fast && fast->next) { + fast = fast->next->next; + slow = slow->next; + if(fast == slow) { return true; } + } + return false; + } +}; \ No newline at end of file diff --git a/LinkedList/02.LinkedListCycle/README.md b/LinkedList/02.LinkedListCycle/README.md index 4a19333..8282470 100644 --- a/LinkedList/02.LinkedListCycle/README.md +++ b/LinkedList/02.LinkedListCycle/README.md @@ -39,11 +39,11 @@ ## 思路
点击展开 -// TODO +快慢指针,快指针每次前进两步,慢指针每次前进一步。如果链表中不存在环,则快指针先到达链表尾;若存在环,则快慢指针总会相遇。
## 代码实现 | C | C++ | Java | Objective-C | Swift | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | [😀](./LinkedListCycle.py) | 🤔 | 🤔 | 🤔 | +| 🤔 | [😀](./LinkedListCycle.cpp) | [😀](./LinkedListCycle.java) | 🤔 | 🤔 | [😀](./LinkedListCycle.py) | 🤔 | [😀](./linked_list_cycle.go) | 🤔 | diff --git a/LinkedList/02.LinkedListCycle/linked_list_cycle.go b/LinkedList/02.LinkedListCycle/linked_list_cycle.go index 5b6d536..25fc2c9 100644 --- a/LinkedList/02.LinkedListCycle/linked_list_cycle.go +++ b/LinkedList/02.LinkedListCycle/linked_list_cycle.go @@ -14,7 +14,7 @@ func hasCycle(head *ListNode) bool { fast := head //fast move 2 step, slow move 1 step - for fast != nil && st.Next != nil { + for fast != nil && fast.Next != nil { fast = fast.Next.Next slow = slow.Next diff --git a/LinkedList/03.LinkedListCycle2/LinkedListCycle2.cpp b/LinkedList/03.LinkedListCycle2/LinkedListCycle2.cpp new file mode 100644 index 0000000..940a3b5 --- /dev/null +++ b/LinkedList/03.LinkedListCycle2/LinkedListCycle2.cpp @@ -0,0 +1,19 @@ +class Solution { +public: + ListNode *detectCycle(ListNode *head) { + ListNode *fast = head, *slow = head; + while (fast && fast->next) { + fast = fast->next->next; + slow = slow->next; + if (fast == slow) { + fast = head; + while (fast != slow) { + fast = fast->next; + slow = slow->next; + } + return fast; + } + } + return nullptr; + } +}; \ No newline at end of file diff --git a/LinkedList/03.LinkedListCycle2/README.md b/LinkedList/03.LinkedListCycle2/README.md index 4d12eae..0006655 100644 --- a/LinkedList/03.LinkedListCycle2/README.md +++ b/LinkedList/03.LinkedListCycle2/README.md @@ -39,12 +39,14 @@ ## 思路
点击展开 -// TODO +快慢指针找到相遇点;快指针指回链表头部,慢指针指向相遇点,每次将它们向前移动一步,直到再次相遇,相遇点就是环的入口。 + +说明: + +设链表头部到环的入口长度为`a`,环的长度为`b`,环的入口到相遇点的长度为`c`:则`f=2s=s+nb`,`s=nb=a+c+(n-1)b`,`b=a+c`,即慢指针从相遇点继续前进`a`步就是环的入口。
## 代码实现 | C | C++ | Java | Objective-C | Swift | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | [😀](./LinkedListCycle2.py) | 🤔 | 🤔 | 🤔 | - -完成 😀,待完成 🤔 +| 🤔 | [😀](./LinkedListCycle2.cpp) | 🤔 | 🤔 | 🤔 | [😀](./LinkedListCycle2.py) | 🤔 | 🤔 | 🤔 | diff --git a/LinkedList/04.MergeSortedLists/MergeSortedLists.cpp b/LinkedList/04.MergeSortedLists/MergeSortedLists.cpp new file mode 100644 index 0000000..8762b87 --- /dev/null +++ b/LinkedList/04.MergeSortedLists/MergeSortedLists.cpp @@ -0,0 +1,39 @@ +/// 迭代 +class Solution { +public: + ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { + ListNode *mergeNode = new ListNode(0); + ListNode *newHead = mergeNode; + while(l1 && l2) { + if(l1->val < l2->val) { + mergeNode->next = l1; + l1 = l1->next; + } + else { + mergeNode->next = l2; + l2 = l2->next; + } + mergeNode = mergeNode->next; + } + mergeNode->next = l1 ? l1 : l2; + return newHead->next; + } +}; + +/// 递归 +class Solution { +public: + ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { + if (l1 && l2) { + if(l1->val < l2->val){ + l1->next = mergeTwoLists(l1->next, l2); + return l1; + } + else { + l2->next = mergeTwoLists(l1, l2->next); + return l2; + } + } + return l1 ? l1 : l2; + } +}; \ No newline at end of file diff --git a/LinkedList/04.MergeSortedLists/MergeSortedLists.py b/LinkedList/04.MergeSortedLists/MergeSortedLists.py index 824b627..8c8877e 100644 --- a/LinkedList/04.MergeSortedLists/MergeSortedLists.py +++ b/LinkedList/04.MergeSortedLists/MergeSortedLists.py @@ -16,6 +16,6 @@ def mergeTwoLists(self, l1, l2): l2 = l2.next dummy = dummy.next - dummy.next = l1 ? l1 : l2 + dummy.next = l1 if l1 else l2 - return head.next + return head.next diff --git a/LinkedList/04.MergeSortedLists/README.md b/LinkedList/04.MergeSortedLists/README.md index 8f62073..20ceafa 100644 --- a/LinkedList/04.MergeSortedLists/README.md +++ b/LinkedList/04.MergeSortedLists/README.md @@ -24,6 +24,4 @@ ## 代码实现 | C | C++ | Java | Objective-C | Swift | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | [😀](./MergeSortedLists.py) | 🤔 | 🤔 | 🤔 | - -完成 😀,待完成 🤔 +| 🤔 | [😀](./MergeSortedLists.cpp) | 🤔 | 🤔 | 🤔 | [😀](./MergeSortedLists.py) | 🤔 | 🤔 | 🤔 | From 68813161c6c6c829eae021802bebab406b5da766 Mon Sep 17 00:00:00 2001 From: lyandut Date: Tue, 13 Aug 2019 16:34:13 +0800 Subject: [PATCH 08/37] add c++ implenmentation for LinkedList/05~06 --- LinkedList/05.ReverseNodesKGroup/README.md | 6 +- .../ReverseNodesKGroup.cpp | 40 ++++++++ .../ReverseNodesKGroup.py | 4 - .../MergeKSortedLists.cpp | 95 +++++++++++++++++++ LinkedList/06.MergeKSortedLists/README.md | 8 +- 5 files changed, 145 insertions(+), 8 deletions(-) create mode 100644 LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.cpp delete mode 100644 LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.py create mode 100644 LinkedList/06.MergeKSortedLists/MergeKSortedLists.cpp diff --git a/LinkedList/05.ReverseNodesKGroup/README.md b/LinkedList/05.ReverseNodesKGroup/README.md index d043fb1..47b30b3 100644 --- a/LinkedList/05.ReverseNodesKGroup/README.md +++ b/LinkedList/05.ReverseNodesKGroup/README.md @@ -28,10 +28,12 @@ k 是一个正整数,它的值小于或等于链表的长度。如果节点总 ## 思路
点击展开 -// TODO + +用两个指针(prev、back)分别记录前驱后继,另外两个指针(begin、end)记录子链表首尾;子链表翻转后将其与`前面已翻转链表`和`后面未翻转链表`进行连接。 +
## 代码实现 | C | C++ | Java | Objective-C | Swift | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | +| 🤔 | [😀](./ReverseNodesKGroup.cpp) | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | diff --git a/LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.cpp b/LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.cpp new file mode 100644 index 0000000..aa93cf4 --- /dev/null +++ b/LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.cpp @@ -0,0 +1,40 @@ +/** + * Definition for singly-linked list. + * struct ListNode { + * int val; + * ListNode *next; + * ListNode(int x) : val(x), next(NULL) {} + * }; + */ +class Solution { +public: + ListNode* _reverseKGroup(ListNode* head) { + ListNode *prev = nullptr, *curr = head, *back; + while (curr) { + back = curr->next; + curr->next = prev; + prev = curr; + curr = back; + } + return prev; + } + + ListNode* reverseKGroup(ListNode* head, int k) { + ListNode *dummy = new ListNode(0); dummy->next = head; + ListNode *end, *begin = head; // 链表首尾 + ListNode *back, *prev = dummy; // 前驱后继 + while(1){ + end = begin; + for(int i=1; inext; } + if(end == nullptr) { break; } + back = end->next; // 记录后继 + // 链表反转 + end->next = nullptr; + prev->next = _reverseKGroup(begin); // 连接前面已翻转链表 + begin->next = back; // 连接后面未翻转链表 + prev = begin; // 更新前驱 + begin = back; // 更新链表首 + } + return dummy->next; + } +}; \ No newline at end of file diff --git a/LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.py b/LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.py deleted file mode 100644 index b6f7935..0000000 --- a/LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.py +++ /dev/null @@ -1,4 +0,0 @@ -class ListNode(object): - def __init__(self, x): - this.val = x; - thit.next = Node; diff --git a/LinkedList/06.MergeKSortedLists/MergeKSortedLists.cpp b/LinkedList/06.MergeKSortedLists/MergeKSortedLists.cpp new file mode 100644 index 0000000..8bf5552 --- /dev/null +++ b/LinkedList/06.MergeKSortedLists/MergeKSortedLists.cpp @@ -0,0 +1,95 @@ +/* +* 递归 +* Runtime: 324 ms +* Memory Usage: 43.1 MB +*/ +class Solution { +public: + ListNode* mergeKLists(vector& lists) { + lists.erase(remove(lists.begin(), lists.end(), nullptr), lists.end()); + if(lists.empty()) { return nullptr; } + auto min_iter = min_element(lists.begin(), lists.end(), [](ListNode *p1, ListNode *p2){ return p1->val < p2->val; }); + ListNode *minNode = *min_iter; + *min_iter = (*min_iter)->next; + if(*min_iter == nullptr) { lists.erase(min_iter); } + minNode->next = mergeKLists(lists); + return minNode; + } +}; + +/* +* 分治1(迭代实现归并) +* Runtime: 24 ms +* Memory Usage: 11.1 MB +*/ +class Solution { +public: + ListNode* _mergeTwolists(ListNode* l1, ListNode* l2) { + ListNode *dummy = new ListNode(0); + ListNode *newHead = dummy; + while (l1 && l2) { + if(l1->val < l2->val) { + dummy->next = l1; + l1 = l1->next; + } + else { + dummy->next = l2; + l2 = l2->next; + } + dummy = dummy->next; + } + dummy->next = l1 ? l1 : l2; + return newHead->next; + } + + ListNode* mergeKLists(vector& lists) { + if(lists.empty()) { return nullptr; } + int interval = 1; + while(interval < lists.size()) { + for(int i=0; ival < l2->val) { + dummy->next = l1; + l1 = l1->next; + } + else { + dummy->next = l2; + l2 = l2->next; + } + dummy = dummy->next; + } + dummy->next = l1 ? l1 : l2; + return newHead->next; + } + + ListNode* _mergeKLists(vector& lists, int l, int r) { + if (l == r) { return lists[l]; } + int mid = (l+r) / 2; + ListNode *l1 = _mergeKLists(lists, l, mid); + ListNode *l2 = _mergeKLists(lists, mid+1, r); + return _mergeTwolists(l1, l2); + } + + ListNode* mergeKLists(vector& lists) { + if(lists.empty()) { return nullptr; } + return _mergeKLists(lists, 0, lists.size()-1); + } +}; \ No newline at end of file diff --git a/LinkedList/06.MergeKSortedLists/README.md b/LinkedList/06.MergeKSortedLists/README.md index 4f46d58..ad9d5dc 100644 --- a/LinkedList/06.MergeKSortedLists/README.md +++ b/LinkedList/06.MergeKSortedLists/README.md @@ -22,11 +22,15 @@ ## 思路
点击展开 -// TODO + +思路一:纯递归实现,每次从`lists`中找出`val`最小的节点,将其指针前进一步; + +思路二:分治思想,将问题划分为更小规模的子问题([合并2个有序链表](../04.MergeSortedLists))。 +
## 代码实现 | C | C++ | Java | Objective-C | Swift | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | +| 🤔 | [😀](./MergeKSortedLists.cpp) | [😀](./MergeKSortedLists.java) | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | From 8d6da4452b300d0a52e6db461e0c804a039c9a18 Mon Sep 17 00:00:00 2001 From: Smallfly Date: Mon, 26 Aug 2019 09:45:08 +0800 Subject: [PATCH 09/37] add reverseKGroup by js --- LinkedList/05.ReverseNodesKGroup/README.md | 2 +- .../ReverseNodesKGroup.js | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.js diff --git a/LinkedList/05.ReverseNodesKGroup/README.md b/LinkedList/05.ReverseNodesKGroup/README.md index d043fb1..6121460 100644 --- a/LinkedList/05.ReverseNodesKGroup/README.md +++ b/LinkedList/05.ReverseNodesKGroup/README.md @@ -34,4 +34,4 @@ k 是一个正整数,它的值小于或等于链表的长度。如果节点总 ## 代码实现 | C | C++ | Java | Objective-C | Swift | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | +| 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | [🤔](./ReverseNodesKGroup.js) | 🤔 | 🤔 | diff --git a/LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.js b/LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.js new file mode 100644 index 0000000..69dce5c --- /dev/null +++ b/LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.js @@ -0,0 +1,31 @@ +// 以 k 为一组翻转链表 +// https://leetcode.com/problems/reverse-nodes-in-k-group/ +// +/** + * 题解,递归解法 + * 1. 尝试将头结点后移动 k 位,如果不足 k 位,直接返回头结点 + * 2. 如果存在 k 个结点,用新的头结点,递归 + * 3. 得到的结果连接到头 k 的节点的逆序链表后面 + * 4. 重新设置头结点,返回 + */ +var reverseKGroup = function(head, k) { + let curr = head; + let count = 0; + while (curr && count != k) { + curr = curr.next; + ++count; + } + if (count === k) { + curr = reverseKGroup(curr, k); + + while (count-- > 0) { + let tmp = head.next; + head.next = curr; + curr = head; + head = tmp; + } + head = curr; + } + return head; +}; + From ede05b37b52b8ca757e4a14a9d150edb84334744 Mon Sep 17 00:00:00 2001 From: Smallfly Date: Sat, 7 Sep 2019 19:49:16 +0800 Subject: [PATCH 10/37] Update dir name --- .../FindAllDuplicates.cpp | 0 .../FindAllDuplicates.js | 0 Array/{09.FindAllDuplicates => FindAllDuplicates}/README.md | 0 .../FirstMissingPositive.cpp | 0 .../FirstMissingPositive.py | 0 Array/{06.FirstMissingPositive => FirstMissingPositive}/README.md | 0 Array/{04.FizzBuzz => FizzBuzz}/FizzBuzz.cpp | 0 Array/{04.FizzBuzz => FizzBuzz}/FizzBuzz.py | 0 Array/{04.FizzBuzz => FizzBuzz}/README.md | 0 .../KthLargestElement.cpp | 0 .../KthLargestElement.py | 0 Array/{07.KthLargestElement => KthLargestElement}/README.md | 0 Array/{03.MajorityElement => MajorityElement}/MajorityElement.cpp | 0 .../{03.MajorityElement => MajorityElement}/MajorityElement.java | 0 Array/{03.MajorityElement => MajorityElement}/MajorityElement.js | 0 Array/{03.MajorityElement => MajorityElement}/README.md | 0 .../{03.MajorityElement => MajorityElement}/majority_elements.go | 0 .../MergeSortedArray.cpp | 0 .../{05.MergeSortedArray => MergeSortedArray}/MergeSortedArray.py | 0 Array/{05.MergeSortedArray => MergeSortedArray}/README.md | 0 Array/{10.NextPremutation => NextPremutation}/NextPremutation.cpp | 0 Array/{10.NextPremutation => NextPremutation}/NextPremutation.js | 0 Array/{10.NextPremutation => NextPremutation}/README.md | 0 Array/{08.SingleNumber => SingleNumber}/README.md | 0 Array/{08.SingleNumber => SingleNumber}/SingleNumber.cpp | 0 Array/{08.SingleNumber => SingleNumber}/SingleNumber.js | 0 Array/{02.ThreeSum => ThreeSum}/README.md | 0 Array/{02.ThreeSum => ThreeSum}/ThreeSum.cpp | 0 Array/{02.ThreeSum => ThreeSum}/ThreeSum.java | 0 Array/{02.ThreeSum => ThreeSum}/ThreeSum.py | 0 Array/{02.ThreeSum => ThreeSum}/three_sum.go | 0 Array/{01.TwoSum => TwoSum}/README.md | 0 Array/{01.TwoSum => TwoSum}/TwoSum.cpp | 0 Array/{01.TwoSum => TwoSum}/TwoSum.java | 0 Array/{01.TwoSum => TwoSum}/TwoSum.js | 0 Array/{01.TwoSum => TwoSum}/TwoSum.py | 0 36 files changed, 0 insertions(+), 0 deletions(-) rename Array/{09.FindAllDuplicates => FindAllDuplicates}/FindAllDuplicates.cpp (100%) rename Array/{09.FindAllDuplicates => FindAllDuplicates}/FindAllDuplicates.js (100%) rename Array/{09.FindAllDuplicates => FindAllDuplicates}/README.md (100%) rename Array/{06.FirstMissingPositive => FirstMissingPositive}/FirstMissingPositive.cpp (100%) rename Array/{06.FirstMissingPositive => FirstMissingPositive}/FirstMissingPositive.py (100%) rename Array/{06.FirstMissingPositive => FirstMissingPositive}/README.md (100%) rename Array/{04.FizzBuzz => FizzBuzz}/FizzBuzz.cpp (100%) rename Array/{04.FizzBuzz => FizzBuzz}/FizzBuzz.py (100%) rename Array/{04.FizzBuzz => FizzBuzz}/README.md (100%) rename Array/{07.KthLargestElement => KthLargestElement}/KthLargestElement.cpp (100%) rename Array/{07.KthLargestElement => KthLargestElement}/KthLargestElement.py (100%) rename Array/{07.KthLargestElement => KthLargestElement}/README.md (100%) rename Array/{03.MajorityElement => MajorityElement}/MajorityElement.cpp (100%) rename Array/{03.MajorityElement => MajorityElement}/MajorityElement.java (100%) rename Array/{03.MajorityElement => MajorityElement}/MajorityElement.js (100%) rename Array/{03.MajorityElement => MajorityElement}/README.md (100%) rename Array/{03.MajorityElement => MajorityElement}/majority_elements.go (100%) rename Array/{05.MergeSortedArray => MergeSortedArray}/MergeSortedArray.cpp (100%) rename Array/{05.MergeSortedArray => MergeSortedArray}/MergeSortedArray.py (100%) rename Array/{05.MergeSortedArray => MergeSortedArray}/README.md (100%) rename Array/{10.NextPremutation => NextPremutation}/NextPremutation.cpp (100%) rename Array/{10.NextPremutation => NextPremutation}/NextPremutation.js (100%) rename Array/{10.NextPremutation => NextPremutation}/README.md (100%) rename Array/{08.SingleNumber => SingleNumber}/README.md (100%) rename Array/{08.SingleNumber => SingleNumber}/SingleNumber.cpp (100%) rename Array/{08.SingleNumber => SingleNumber}/SingleNumber.js (100%) rename Array/{02.ThreeSum => ThreeSum}/README.md (100%) rename Array/{02.ThreeSum => ThreeSum}/ThreeSum.cpp (100%) rename Array/{02.ThreeSum => ThreeSum}/ThreeSum.java (100%) rename Array/{02.ThreeSum => ThreeSum}/ThreeSum.py (100%) rename Array/{02.ThreeSum => ThreeSum}/three_sum.go (100%) rename Array/{01.TwoSum => TwoSum}/README.md (100%) rename Array/{01.TwoSum => TwoSum}/TwoSum.cpp (100%) rename Array/{01.TwoSum => TwoSum}/TwoSum.java (100%) rename Array/{01.TwoSum => TwoSum}/TwoSum.js (100%) rename Array/{01.TwoSum => TwoSum}/TwoSum.py (100%) diff --git a/Array/09.FindAllDuplicates/FindAllDuplicates.cpp b/Array/FindAllDuplicates/FindAllDuplicates.cpp similarity index 100% rename from Array/09.FindAllDuplicates/FindAllDuplicates.cpp rename to Array/FindAllDuplicates/FindAllDuplicates.cpp diff --git a/Array/09.FindAllDuplicates/FindAllDuplicates.js b/Array/FindAllDuplicates/FindAllDuplicates.js similarity index 100% rename from Array/09.FindAllDuplicates/FindAllDuplicates.js rename to Array/FindAllDuplicates/FindAllDuplicates.js diff --git a/Array/09.FindAllDuplicates/README.md b/Array/FindAllDuplicates/README.md similarity index 100% rename from Array/09.FindAllDuplicates/README.md rename to Array/FindAllDuplicates/README.md diff --git a/Array/06.FirstMissingPositive/FirstMissingPositive.cpp b/Array/FirstMissingPositive/FirstMissingPositive.cpp similarity index 100% rename from Array/06.FirstMissingPositive/FirstMissingPositive.cpp rename to Array/FirstMissingPositive/FirstMissingPositive.cpp diff --git a/Array/06.FirstMissingPositive/FirstMissingPositive.py b/Array/FirstMissingPositive/FirstMissingPositive.py similarity index 100% rename from Array/06.FirstMissingPositive/FirstMissingPositive.py rename to Array/FirstMissingPositive/FirstMissingPositive.py diff --git a/Array/06.FirstMissingPositive/README.md b/Array/FirstMissingPositive/README.md similarity index 100% rename from Array/06.FirstMissingPositive/README.md rename to Array/FirstMissingPositive/README.md diff --git a/Array/04.FizzBuzz/FizzBuzz.cpp b/Array/FizzBuzz/FizzBuzz.cpp similarity index 100% rename from Array/04.FizzBuzz/FizzBuzz.cpp rename to Array/FizzBuzz/FizzBuzz.cpp diff --git a/Array/04.FizzBuzz/FizzBuzz.py b/Array/FizzBuzz/FizzBuzz.py similarity index 100% rename from Array/04.FizzBuzz/FizzBuzz.py rename to Array/FizzBuzz/FizzBuzz.py diff --git a/Array/04.FizzBuzz/README.md b/Array/FizzBuzz/README.md similarity index 100% rename from Array/04.FizzBuzz/README.md rename to Array/FizzBuzz/README.md diff --git a/Array/07.KthLargestElement/KthLargestElement.cpp b/Array/KthLargestElement/KthLargestElement.cpp similarity index 100% rename from Array/07.KthLargestElement/KthLargestElement.cpp rename to Array/KthLargestElement/KthLargestElement.cpp diff --git a/Array/07.KthLargestElement/KthLargestElement.py b/Array/KthLargestElement/KthLargestElement.py similarity index 100% rename from Array/07.KthLargestElement/KthLargestElement.py rename to Array/KthLargestElement/KthLargestElement.py diff --git a/Array/07.KthLargestElement/README.md b/Array/KthLargestElement/README.md similarity index 100% rename from Array/07.KthLargestElement/README.md rename to Array/KthLargestElement/README.md diff --git a/Array/03.MajorityElement/MajorityElement.cpp b/Array/MajorityElement/MajorityElement.cpp similarity index 100% rename from Array/03.MajorityElement/MajorityElement.cpp rename to Array/MajorityElement/MajorityElement.cpp diff --git a/Array/03.MajorityElement/MajorityElement.java b/Array/MajorityElement/MajorityElement.java similarity index 100% rename from Array/03.MajorityElement/MajorityElement.java rename to Array/MajorityElement/MajorityElement.java diff --git a/Array/03.MajorityElement/MajorityElement.js b/Array/MajorityElement/MajorityElement.js similarity index 100% rename from Array/03.MajorityElement/MajorityElement.js rename to Array/MajorityElement/MajorityElement.js diff --git a/Array/03.MajorityElement/README.md b/Array/MajorityElement/README.md similarity index 100% rename from Array/03.MajorityElement/README.md rename to Array/MajorityElement/README.md diff --git a/Array/03.MajorityElement/majority_elements.go b/Array/MajorityElement/majority_elements.go similarity index 100% rename from Array/03.MajorityElement/majority_elements.go rename to Array/MajorityElement/majority_elements.go diff --git a/Array/05.MergeSortedArray/MergeSortedArray.cpp b/Array/MergeSortedArray/MergeSortedArray.cpp similarity index 100% rename from Array/05.MergeSortedArray/MergeSortedArray.cpp rename to Array/MergeSortedArray/MergeSortedArray.cpp diff --git a/Array/05.MergeSortedArray/MergeSortedArray.py b/Array/MergeSortedArray/MergeSortedArray.py similarity index 100% rename from Array/05.MergeSortedArray/MergeSortedArray.py rename to Array/MergeSortedArray/MergeSortedArray.py diff --git a/Array/05.MergeSortedArray/README.md b/Array/MergeSortedArray/README.md similarity index 100% rename from Array/05.MergeSortedArray/README.md rename to Array/MergeSortedArray/README.md diff --git a/Array/10.NextPremutation/NextPremutation.cpp b/Array/NextPremutation/NextPremutation.cpp similarity index 100% rename from Array/10.NextPremutation/NextPremutation.cpp rename to Array/NextPremutation/NextPremutation.cpp diff --git a/Array/10.NextPremutation/NextPremutation.js b/Array/NextPremutation/NextPremutation.js similarity index 100% rename from Array/10.NextPremutation/NextPremutation.js rename to Array/NextPremutation/NextPremutation.js diff --git a/Array/10.NextPremutation/README.md b/Array/NextPremutation/README.md similarity index 100% rename from Array/10.NextPremutation/README.md rename to Array/NextPremutation/README.md diff --git a/Array/08.SingleNumber/README.md b/Array/SingleNumber/README.md similarity index 100% rename from Array/08.SingleNumber/README.md rename to Array/SingleNumber/README.md diff --git a/Array/08.SingleNumber/SingleNumber.cpp b/Array/SingleNumber/SingleNumber.cpp similarity index 100% rename from Array/08.SingleNumber/SingleNumber.cpp rename to Array/SingleNumber/SingleNumber.cpp diff --git a/Array/08.SingleNumber/SingleNumber.js b/Array/SingleNumber/SingleNumber.js similarity index 100% rename from Array/08.SingleNumber/SingleNumber.js rename to Array/SingleNumber/SingleNumber.js diff --git a/Array/02.ThreeSum/README.md b/Array/ThreeSum/README.md similarity index 100% rename from Array/02.ThreeSum/README.md rename to Array/ThreeSum/README.md diff --git a/Array/02.ThreeSum/ThreeSum.cpp b/Array/ThreeSum/ThreeSum.cpp similarity index 100% rename from Array/02.ThreeSum/ThreeSum.cpp rename to Array/ThreeSum/ThreeSum.cpp diff --git a/Array/02.ThreeSum/ThreeSum.java b/Array/ThreeSum/ThreeSum.java similarity index 100% rename from Array/02.ThreeSum/ThreeSum.java rename to Array/ThreeSum/ThreeSum.java diff --git a/Array/02.ThreeSum/ThreeSum.py b/Array/ThreeSum/ThreeSum.py similarity index 100% rename from Array/02.ThreeSum/ThreeSum.py rename to Array/ThreeSum/ThreeSum.py diff --git a/Array/02.ThreeSum/three_sum.go b/Array/ThreeSum/three_sum.go similarity index 100% rename from Array/02.ThreeSum/three_sum.go rename to Array/ThreeSum/three_sum.go diff --git a/Array/01.TwoSum/README.md b/Array/TwoSum/README.md similarity index 100% rename from Array/01.TwoSum/README.md rename to Array/TwoSum/README.md diff --git a/Array/01.TwoSum/TwoSum.cpp b/Array/TwoSum/TwoSum.cpp similarity index 100% rename from Array/01.TwoSum/TwoSum.cpp rename to Array/TwoSum/TwoSum.cpp diff --git a/Array/01.TwoSum/TwoSum.java b/Array/TwoSum/TwoSum.java similarity index 100% rename from Array/01.TwoSum/TwoSum.java rename to Array/TwoSum/TwoSum.java diff --git a/Array/01.TwoSum/TwoSum.js b/Array/TwoSum/TwoSum.js similarity index 100% rename from Array/01.TwoSum/TwoSum.js rename to Array/TwoSum/TwoSum.js diff --git a/Array/01.TwoSum/TwoSum.py b/Array/TwoSum/TwoSum.py similarity index 100% rename from Array/01.TwoSum/TwoSum.py rename to Array/TwoSum/TwoSum.py From 3b05f25f0b460c444f6652e7927cdef03ec329f2 Mon Sep 17 00:00:00 2001 From: Smallfly Date: Sat, 7 Sep 2019 19:49:31 +0800 Subject: [PATCH 11/37] Update readme --- Array/README.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/Array/README.md b/Array/README.md index fde150e..57e1cb6 100644 --- a/Array/README.md +++ b/Array/README.md @@ -1,22 +1,21 @@ -## Array(数组) +# Array -[01. Two Sum(两数之和)](./01.TwoSum) +- [Two Sum](./TwoSum) -[02. Three Sum(三数之和)](./02.ThreeSum) +- [Three Sum](./ThreeSum) -[03. Majority Element(在数组中出现次数超过一半的数)](./03.MajorityElement) +- [Majority Element](./MajorityElement) -[04. FizzBuzz(3 和 5 的倍数)](./04.FizzBuzz) +- [FizzBuzz](./FizzBuzz) -[05. Merge Sorted Array(合并两个有序数组)](./05.MergeSortedArray) +- [Merge Sorted Array](./MergeSortedArray) -[06. First Missing Positive(寻找缺失的最小正数)](./06.FirstMissingPositive) +- [First Missing Positive](./FirstMissingPositive) -[07. Kth Largest Element in an Array(查找第K大的数)](./07.KthLargestElement) +- [Kth Largest Element in an Array](./KthLargestElement) -[08. Single Number(数组中只出现一次的数)](./08.SingleNumber) +- [Single Number](./SingleNumber) -[09. Find All Duplicates in an Array(数组中重复的数字)](./09.FindAllDuplicates) - -[10. Next Premutation](./10.NextPremutation) +- [Find All Duplicates in an Array](./FindAllDuplicates) +- [Next Premutation](./NextPremutation) From 4afb0123dfc918a0a75a9a512a4271101e0347b7 Mon Sep 17 00:00:00 2001 From: Smallfly Date: Sun, 8 Sep 2019 23:30:36 +0800 Subject: [PATCH 12/37] reverse k group with iteration --- .../ReverseNodesKGroup.js | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.js b/LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.js index 69dce5c..983acb7 100644 --- a/LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.js +++ b/LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.js @@ -29,3 +29,49 @@ var reverseKGroup = function(head, k) { return head; }; +/** + * 迭代解法 + * 遍历链表,如果有 k 个,就翻转,然后将翻转后的 group 与已翻转和未翻转的链表合并 + */ + + // Runtime: 68 ms, faster than 92.95% of JavaScript online submissions for Reverse Nodes in k-Group. +var reverseKGroup2 = function(head, k) { + // 初始化一个节点用于指向头结点 + var dump = jump = new ListNode(0); + dump.next = head; + + // l 前一个 group 的 head + // r 后一个 group 的 head + var l = r = head; + + while (true) { + var count = 0; + // r 移到下一组 group 的头部 + while (r && count < k) { + r = r.next; + count++; + } + // 翻转 [l, r) 之间的链表 + if (count === k) { + let cur = l, pre = r; + while(count--) { + let tmp = cur.next; + cur.next = pre; + pre = cur; + cur = tmp; + } + // 翻转后 pre 为当前 group 头节点 + // jump 为前一个 group 的尾结点或辅助节点 + // 将前一个 group 的尾结点指向当前 group 的节点 + jump.next = pre; + // jump 指向当前 group 的最后一个节点 + jump = l; + // l 指向下一组 group 的头节点 + l = r; + } else { + // 因为 dump 等于 jump 的初始 + // 而 jump 的初值的 next 指向链表的头部 + return dump.next; + } + } +}; From 9465bda315e2397c83221a955e7fa5295bb471ac Mon Sep 17 00:00:00 2001 From: Smallfly Date: Sun, 8 Sep 2019 23:38:11 +0800 Subject: [PATCH 13/37] Update readme --- Array/TwoSum/README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Array/TwoSum/README.md b/Array/TwoSum/README.md index 64745ef..149fe34 100644 --- a/Array/TwoSum/README.md +++ b/Array/TwoSum/README.md @@ -21,10 +21,11 @@ ## 思路
点击展开 -借助散列表存储访问过元素的值和下标,时间复杂度 O(n)。 +使用散列表,缓存访问过的元素和下标,遍历数组,查找缓存中是否存在元素和当前元素的和等于目标值。 +时间复杂度 O(n)。
## 代码实现 -| C | C++ | Java | Python | JavaScript | PHP | -| :--: | :--: | :--: | :--: | :---: | :---: | -| 🤔 | [😀](TwoSum.cpp) | [😀](TwoSum.java) | [😀](TwoSum.py) | [😀](TwoSum.js) | 🤔 | +| C++ | Java | Python | JS | +| :--: | :--: | :--: | :---: | +|[😀](TwoSum.cpp) | [😀](TwoSum.java) | [😀](TwoSum.py) | [😀](TwoSum.js) | From 6de8370ee355ce48b6e4871c7ec7a7da6901d02c Mon Sep 17 00:00:00 2001 From: Smallfly Date: Mon, 9 Sep 2019 21:26:39 +0800 Subject: [PATCH 14/37] Update readme --- LinkedList/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/LinkedList/README.md b/LinkedList/README.md index bde7728..478bee9 100644 --- a/LinkedList/README.md +++ b/LinkedList/README.md @@ -1,13 +1,13 @@ -# LinkedList(链表) +# LinkedList -[01. Reverse Linked List(反转链表)](./01.ReverseLinkedList) +- [Reverse Linked List](./ReverseLinkedList) -[02. Linked List Cycle(检测链表是否有环)](./02.LinkedListCycle) +- [Linked List Cycle](./LinkedListCycle) -[03. Linked List Cycle II(检测链表是否有环II)](./03.LinkedListCycle2) +- [Lnked List Cycle II](./LinkedListCycle2) -[04. Merge Two Sorted Lists(合并两个有序链表)](./04.MergeSortedLists) +- [Merge Two Sorted Lists](./MergeSortedLists) -[05. Reverse Nodes in k-Group(以 k 为一组反转链表)](./05.ReverseNodesKGroup) +- [Merge k Sorted Lists](./MergeKSortedLists) -[06. Merge k Sorted Lists(合并 k 个排序链表)](./06.MergeKSortedLists) +- [Reverse Nodes in k-Group](./ReverseNodesKGroup) From a132908c0f38cf46f6af2ba660dd51d972dcc202 Mon Sep 17 00:00:00 2001 From: Smallfly Date: Mon, 9 Sep 2019 21:26:48 +0800 Subject: [PATCH 15/37] Update dir name --- .../{02.LinkedListCycle => LinkedListCycle}/LinkedListCycle.cpp | 0 .../{02.LinkedListCycle => LinkedListCycle}/LinkedListCycle.java | 0 .../{02.LinkedListCycle => LinkedListCycle}/LinkedListCycle.py | 0 LinkedList/{02.LinkedListCycle => LinkedListCycle}/README.md | 0 .../{02.LinkedListCycle => LinkedListCycle}/linked_list_cycle.go | 0 .../LinkedListCycle2.cpp | 0 .../{03.LinkedListCycle2 => LinkedListCycle2}/LinkedListCycle2.py | 0 LinkedList/{03.LinkedListCycle2 => LinkedListCycle2}/README.md | 0 .../{06.MergeKSortedLists => MergeKSortedLists}/ListNode.java | 0 .../MergeKSortedLists.cpp | 0 .../MergeKSortedLists.java | 0 LinkedList/{06.MergeKSortedLists => MergeKSortedLists}/README.md | 0 .../MergeSortedLists.cpp | 0 .../{04.MergeSortedLists => MergeSortedLists}/MergeSortedLists.py | 0 LinkedList/{04.MergeSortedLists => MergeSortedLists}/README.md | 0 LinkedList/{01.ReverseLinkedList => ReverseLinkedList}/README.md | 0 .../ReverseLinkedList.cpp | 0 .../ReverseLinkedList.py | 0 .../{05.ReverseNodesKGroup => ReverseNodesKGroup}/README.md | 0 .../ReverseNodesKGroup.cpp | 0 .../ReverseNodesKGroup.js | 0 21 files changed, 0 insertions(+), 0 deletions(-) rename LinkedList/{02.LinkedListCycle => LinkedListCycle}/LinkedListCycle.cpp (100%) rename LinkedList/{02.LinkedListCycle => LinkedListCycle}/LinkedListCycle.java (100%) rename LinkedList/{02.LinkedListCycle => LinkedListCycle}/LinkedListCycle.py (100%) rename LinkedList/{02.LinkedListCycle => LinkedListCycle}/README.md (100%) rename LinkedList/{02.LinkedListCycle => LinkedListCycle}/linked_list_cycle.go (100%) rename LinkedList/{03.LinkedListCycle2 => LinkedListCycle2}/LinkedListCycle2.cpp (100%) rename LinkedList/{03.LinkedListCycle2 => LinkedListCycle2}/LinkedListCycle2.py (100%) rename LinkedList/{03.LinkedListCycle2 => LinkedListCycle2}/README.md (100%) rename LinkedList/{06.MergeKSortedLists => MergeKSortedLists}/ListNode.java (100%) rename LinkedList/{06.MergeKSortedLists => MergeKSortedLists}/MergeKSortedLists.cpp (100%) rename LinkedList/{06.MergeKSortedLists => MergeKSortedLists}/MergeKSortedLists.java (100%) rename LinkedList/{06.MergeKSortedLists => MergeKSortedLists}/README.md (100%) rename LinkedList/{04.MergeSortedLists => MergeSortedLists}/MergeSortedLists.cpp (100%) rename LinkedList/{04.MergeSortedLists => MergeSortedLists}/MergeSortedLists.py (100%) rename LinkedList/{04.MergeSortedLists => MergeSortedLists}/README.md (100%) rename LinkedList/{01.ReverseLinkedList => ReverseLinkedList}/README.md (100%) rename LinkedList/{01.ReverseLinkedList => ReverseLinkedList}/ReverseLinkedList.cpp (100%) rename LinkedList/{01.ReverseLinkedList => ReverseLinkedList}/ReverseLinkedList.py (100%) rename LinkedList/{05.ReverseNodesKGroup => ReverseNodesKGroup}/README.md (100%) rename LinkedList/{05.ReverseNodesKGroup => ReverseNodesKGroup}/ReverseNodesKGroup.cpp (100%) rename LinkedList/{05.ReverseNodesKGroup => ReverseNodesKGroup}/ReverseNodesKGroup.js (100%) diff --git a/LinkedList/02.LinkedListCycle/LinkedListCycle.cpp b/LinkedList/LinkedListCycle/LinkedListCycle.cpp similarity index 100% rename from LinkedList/02.LinkedListCycle/LinkedListCycle.cpp rename to LinkedList/LinkedListCycle/LinkedListCycle.cpp diff --git a/LinkedList/02.LinkedListCycle/LinkedListCycle.java b/LinkedList/LinkedListCycle/LinkedListCycle.java similarity index 100% rename from LinkedList/02.LinkedListCycle/LinkedListCycle.java rename to LinkedList/LinkedListCycle/LinkedListCycle.java diff --git a/LinkedList/02.LinkedListCycle/LinkedListCycle.py b/LinkedList/LinkedListCycle/LinkedListCycle.py similarity index 100% rename from LinkedList/02.LinkedListCycle/LinkedListCycle.py rename to LinkedList/LinkedListCycle/LinkedListCycle.py diff --git a/LinkedList/02.LinkedListCycle/README.md b/LinkedList/LinkedListCycle/README.md similarity index 100% rename from LinkedList/02.LinkedListCycle/README.md rename to LinkedList/LinkedListCycle/README.md diff --git a/LinkedList/02.LinkedListCycle/linked_list_cycle.go b/LinkedList/LinkedListCycle/linked_list_cycle.go similarity index 100% rename from LinkedList/02.LinkedListCycle/linked_list_cycle.go rename to LinkedList/LinkedListCycle/linked_list_cycle.go diff --git a/LinkedList/03.LinkedListCycle2/LinkedListCycle2.cpp b/LinkedList/LinkedListCycle2/LinkedListCycle2.cpp similarity index 100% rename from LinkedList/03.LinkedListCycle2/LinkedListCycle2.cpp rename to LinkedList/LinkedListCycle2/LinkedListCycle2.cpp diff --git a/LinkedList/03.LinkedListCycle2/LinkedListCycle2.py b/LinkedList/LinkedListCycle2/LinkedListCycle2.py similarity index 100% rename from LinkedList/03.LinkedListCycle2/LinkedListCycle2.py rename to LinkedList/LinkedListCycle2/LinkedListCycle2.py diff --git a/LinkedList/03.LinkedListCycle2/README.md b/LinkedList/LinkedListCycle2/README.md similarity index 100% rename from LinkedList/03.LinkedListCycle2/README.md rename to LinkedList/LinkedListCycle2/README.md diff --git a/LinkedList/06.MergeKSortedLists/ListNode.java b/LinkedList/MergeKSortedLists/ListNode.java similarity index 100% rename from LinkedList/06.MergeKSortedLists/ListNode.java rename to LinkedList/MergeKSortedLists/ListNode.java diff --git a/LinkedList/06.MergeKSortedLists/MergeKSortedLists.cpp b/LinkedList/MergeKSortedLists/MergeKSortedLists.cpp similarity index 100% rename from LinkedList/06.MergeKSortedLists/MergeKSortedLists.cpp rename to LinkedList/MergeKSortedLists/MergeKSortedLists.cpp diff --git a/LinkedList/06.MergeKSortedLists/MergeKSortedLists.java b/LinkedList/MergeKSortedLists/MergeKSortedLists.java similarity index 100% rename from LinkedList/06.MergeKSortedLists/MergeKSortedLists.java rename to LinkedList/MergeKSortedLists/MergeKSortedLists.java diff --git a/LinkedList/06.MergeKSortedLists/README.md b/LinkedList/MergeKSortedLists/README.md similarity index 100% rename from LinkedList/06.MergeKSortedLists/README.md rename to LinkedList/MergeKSortedLists/README.md diff --git a/LinkedList/04.MergeSortedLists/MergeSortedLists.cpp b/LinkedList/MergeSortedLists/MergeSortedLists.cpp similarity index 100% rename from LinkedList/04.MergeSortedLists/MergeSortedLists.cpp rename to LinkedList/MergeSortedLists/MergeSortedLists.cpp diff --git a/LinkedList/04.MergeSortedLists/MergeSortedLists.py b/LinkedList/MergeSortedLists/MergeSortedLists.py similarity index 100% rename from LinkedList/04.MergeSortedLists/MergeSortedLists.py rename to LinkedList/MergeSortedLists/MergeSortedLists.py diff --git a/LinkedList/04.MergeSortedLists/README.md b/LinkedList/MergeSortedLists/README.md similarity index 100% rename from LinkedList/04.MergeSortedLists/README.md rename to LinkedList/MergeSortedLists/README.md diff --git a/LinkedList/01.ReverseLinkedList/README.md b/LinkedList/ReverseLinkedList/README.md similarity index 100% rename from LinkedList/01.ReverseLinkedList/README.md rename to LinkedList/ReverseLinkedList/README.md diff --git a/LinkedList/01.ReverseLinkedList/ReverseLinkedList.cpp b/LinkedList/ReverseLinkedList/ReverseLinkedList.cpp similarity index 100% rename from LinkedList/01.ReverseLinkedList/ReverseLinkedList.cpp rename to LinkedList/ReverseLinkedList/ReverseLinkedList.cpp diff --git a/LinkedList/01.ReverseLinkedList/ReverseLinkedList.py b/LinkedList/ReverseLinkedList/ReverseLinkedList.py similarity index 100% rename from LinkedList/01.ReverseLinkedList/ReverseLinkedList.py rename to LinkedList/ReverseLinkedList/ReverseLinkedList.py diff --git a/LinkedList/05.ReverseNodesKGroup/README.md b/LinkedList/ReverseNodesKGroup/README.md similarity index 100% rename from LinkedList/05.ReverseNodesKGroup/README.md rename to LinkedList/ReverseNodesKGroup/README.md diff --git a/LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.cpp b/LinkedList/ReverseNodesKGroup/ReverseNodesKGroup.cpp similarity index 100% rename from LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.cpp rename to LinkedList/ReverseNodesKGroup/ReverseNodesKGroup.cpp diff --git a/LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.js b/LinkedList/ReverseNodesKGroup/ReverseNodesKGroup.js similarity index 100% rename from LinkedList/05.ReverseNodesKGroup/ReverseNodesKGroup.js rename to LinkedList/ReverseNodesKGroup/ReverseNodesKGroup.js From aa140a01067b4f9390b951fde58a4cacdfb069df Mon Sep 17 00:00:00 2001 From: souche Date: Wed, 11 Sep 2019 00:45:29 +0800 Subject: [PATCH 16/37] update readme --- LinkedList/ReverseNodesKGroup/README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/LinkedList/ReverseNodesKGroup/README.md b/LinkedList/ReverseNodesKGroup/README.md index 2b92e35..f820c65 100644 --- a/LinkedList/ReverseNodesKGroup/README.md +++ b/LinkedList/ReverseNodesKGroup/README.md @@ -29,12 +29,17 @@ k 是一个正整数,它的值小于或等于链表的长度。如果节点总
点击展开 -用两个指针(prev、back)分别记录前驱后继,另外两个指针(begin、end)记录子链表首尾;子链表翻转后将其与`前面已翻转链表`和`后面未翻转链表`进行连接。 +该题有两种解法,递归和迭代。 + +递归:取前 k 个节点,进行翻转,如果不足 k 个,则不翻转。剩下的链表其实是题目的子问题,递归调用即可。将递归调用后的链表与前 k 个翻转的链表进行连接。连接后的结果返回,就是目标解。 + +迭代:迭代的解法比递归的难。需要借助辅助节点。开始时辅助节点指向头节点。 +用两个指针(prev、back)分别记录前驱后继,另外两个指针(begin、end)记录子链表首尾;子链表翻转后将其与前面已翻转链表和后面未翻转链表进行连接。
## 代码实现 -| C | C++ | Java | Swift | Python | JavaScript | Go | +| C++ | Java | Swift | Python | JavaScript | Go | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | [😀](./ReverseNodesKGroup.cpp) | 🤔 | 🤔 | 🤔 | [😀](./ReverseNodesKGroup.js)| 🤔 | +| [😀](./ReverseNodesKGroup.cpp) | 🤔 | 🤔 | 🤔 | [😀](./ReverseNodesKGroup.js)| 🤔 | From 1a55ed97b161a9442247f1bbac4a89d85f72e0d5 Mon Sep 17 00:00:00 2001 From: souche Date: Thu, 12 Sep 2019 00:47:46 +0800 Subject: [PATCH 17/37] length of longest substring --- String/LengthOfLongestSubstring/README.md | 28 +++++++++++++++++ String/LengthOfLongestSubstring/index.js | 31 +++++++++++++++++++ String/README.md | 4 ++- .../README.md | 0 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 String/LengthOfLongestSubstring/README.md create mode 100644 String/LengthOfLongestSubstring/index.js rename String/{01.ReverseString => ReverseString}/README.md (100%) diff --git a/String/LengthOfLongestSubstring/README.md b/String/LengthOfLongestSubstring/README.md new file mode 100644 index 0000000..e983c32 --- /dev/null +++ b/String/LengthOfLongestSubstring/README.md @@ -0,0 +1,28 @@ +# Longest Substring Without Repeating Characters + +[LeetCode 3](https://leetcode.com/problems/longest-substring-without-repeating-characters/) + +## 题目 +给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 + +示例 1: + +输入: "abcabcbb" +输出: 3 +解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 +示例 2: + +输入: "bbbbb" +输出: 1 +解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 +示例 3: + +输入: "pwwkew" +输出: 3 +解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 +  请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 + +## 代码实现 +| C++ | Java | Python | JS | +| :--: | :--: | :--: | :---: | +|[🤔]() | [🤔]() | [🤔]() | [😀](index.js) | diff --git a/String/LengthOfLongestSubstring/index.js b/String/LengthOfLongestSubstring/index.js new file mode 100644 index 0000000..4845bac --- /dev/null +++ b/String/LengthOfLongestSubstring/index.js @@ -0,0 +1,31 @@ +// 解法一:O(n) +const lengthOfLongestSubstring = (str) => { + let maxLength = 0; + const queue = []; // 使用队列存储无重复子串 + for (const element of str) { + // 从头部开始检测是否有重复 O(n) + const eleIdx = queue.indexOf(element); + if (eleIdx != -1) { + // 移除重复元素前的元素 + queue.splice(0, eleIdx + 1); + } + queue.push(element); + + maxLength = Math.max(queue.length, maxLength); + } + return maxLength; +} + +// 解法二:O(n^2) +const lengthOfLongestSubstring2 = (str) => { + const cache = {}; + let start = max = 0; + for (let i = 0, n = str.length; i < n; ++i) { + const char = str[i]; + const newStart = typeof cache[char] === 'undefined' ? 0 : cache[char] + 1; + start = Math.max(start, newStart); + cache[char] = i; + max = Math.max(i - start + 1, max); + } + return max; +} \ No newline at end of file diff --git a/String/README.md b/String/README.md index 798ce73..b7f570d 100644 --- a/String/README.md +++ b/String/README.md @@ -1,3 +1,5 @@ # String(字符串) -[01. 反转字符串](./01.ReverseString) +- [ReverseString](./ReverseString) + +- [LengthOfLongestSubstring](./LengthOfLongestSubstring) diff --git a/String/01.ReverseString/README.md b/String/ReverseString/README.md similarity index 100% rename from String/01.ReverseString/README.md rename to String/ReverseString/README.md From 6f8c5c68a9a265f20f15ab45881c936788cd9de7 Mon Sep 17 00:00:00 2001 From: souche Date: Thu, 12 Sep 2019 00:51:51 +0800 Subject: [PATCH 18/37] update intent --- String/LengthOfLongestSubstring/index.js | 46 ++++++++++++------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/String/LengthOfLongestSubstring/index.js b/String/LengthOfLongestSubstring/index.js index 4845bac..4962c45 100644 --- a/String/LengthOfLongestSubstring/index.js +++ b/String/LengthOfLongestSubstring/index.js @@ -1,31 +1,31 @@ // 解法一:O(n) const lengthOfLongestSubstring = (str) => { - let maxLength = 0; - const queue = []; // 使用队列存储无重复子串 - for (const element of str) { - // 从头部开始检测是否有重复 O(n) - const eleIdx = queue.indexOf(element); - if (eleIdx != -1) { - // 移除重复元素前的元素 - queue.splice(0, eleIdx + 1); - } - queue.push(element); + let maxLength = 0; + const queue = []; // 使用队列存储无重复子串 + for (const element of str) { + // 从头部开始检测是否有重复 O(n) + const eleIdx = queue.indexOf(element); + if (eleIdx != -1) { + // 移除重复元素前的元素 + queue.splice(0, eleIdx + 1); + } + queue.push(element); - maxLength = Math.max(queue.length, maxLength); - } - return maxLength; + maxLength = Math.max(queue.length, maxLength); + } + return maxLength; } // 解法二:O(n^2) const lengthOfLongestSubstring2 = (str) => { - const cache = {}; - let start = max = 0; - for (let i = 0, n = str.length; i < n; ++i) { - const char = str[i]; - const newStart = typeof cache[char] === 'undefined' ? 0 : cache[char] + 1; - start = Math.max(start, newStart); - cache[char] = i; - max = Math.max(i - start + 1, max); - } - return max; + const cache = {}; + let start = max = 0; + for (let i = 0, n = str.length; i < n; ++i) { + const char = str[i]; + const newStart = typeof cache[char] === 'undefined' ? 0 : cache[char] + 1; + start = Math.max(start, newStart); + cache[char] = i; + max = Math.max(i - start + 1, max); + } + return max; } \ No newline at end of file From de8ab48671aa79c688fd3865c7dad0f991a49b58 Mon Sep 17 00:00:00 2001 From: souche Date: Fri, 13 Sep 2019 23:28:37 +0800 Subject: [PATCH 19/37] singleNumber with js --- Array/SingleNumber/SingleNumber.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Array/SingleNumber/SingleNumber.js b/Array/SingleNumber/SingleNumber.js index e5c3b51..e54206f 100644 --- a/Array/SingleNumber/SingleNumber.js +++ b/Array/SingleNumber/SingleNumber.js @@ -7,3 +7,8 @@ var singleNumber = function(nums) { nums.forEach((num) => { result ^= num; }); return result; }; + +// 方法二,使用 reduce +var singleNumber = function(nums) { + return nums.reduce((res, ele) => res^ele , 0); +} \ No newline at end of file From d69e4763b7ad5d529b93df4129422b12bb07c5df Mon Sep 17 00:00:00 2001 From: Smallfly Date: Wed, 18 Sep 2019 00:52:38 +0800 Subject: [PATCH 20/37] Add js for three sum --- Array/ThreeSum/README.md | 14 ++++++++++++-- Array/ThreeSum/ThreeSum.js | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 Array/ThreeSum/ThreeSum.js diff --git a/Array/ThreeSum/README.md b/Array/ThreeSum/README.md index 941bad6..82f1546 100644 --- a/Array/ThreeSum/README.md +++ b/Array/ThreeSum/README.md @@ -1,11 +1,13 @@ # Three Sum (三数之和) + **LeetCode 15** -- [英文版](https://leetcode.com/problems/3sum/) +* [英文版](https://leetcode.com/problems/3sum/) -- [中文版](https://leetcode-cn.com/problems/3sum/) +* [中文版](https://leetcode-cn.com/problems/3sum/) ## 题目 + 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 @@ -20,7 +22,15 @@ ## 思路 +1. 先对原数组排序 +2. 从小到大遍历排序的数组 +3. 在当前遍历下标的后面剩余数组中使用两边夹逼的方式查找两个数 +4. 如果这两个数与当前下标的数之和等于 0,则存入结果数组 +5. 否则继续查找 + ## 代码实现 + | C | C++ | Java | Python | JavaScript | PHP | Go | | :--: | :--: | :--: | :--: | :---: | :---: | :---: | | 🤔 | [😀](ThreeSum.cpp) | [😀](ThreeSum.java) | [😀](ThreeSum.py) | 🤔 | 🤔 | [😀](three_sum.go) | + diff --git a/Array/ThreeSum/ThreeSum.js b/Array/ThreeSum/ThreeSum.js new file mode 100644 index 0000000..ffaf72f --- /dev/null +++ b/Array/ThreeSum/ThreeSum.js @@ -0,0 +1,34 @@ +/** + * @param {number[]} nums + * @return {number[][]} + */ +var threeSum = function(nums) { + const res = []; + nums.sort((a, b) => a - b); + for (let i = 0, n = nums.length - 2; i < n; ++i) { + if (i > 0 && nums[i] === nums[i - 1]) continue; + + let l = i + 1; + let r = nums.length - 1; + + while (l < r) { + s = nums[i] + nums[l] + nums[r]; + if (s < 0) { + l++; + } else if ( s > 0) { + r--; + } else { + res.push([nums[i], nums[l], nums[r]]); + while (l < r && nums[l] === nums[l + 1]) { + l++; + } + while (l < r && nums[r] === nums[r - 1]) { + r--; + } + l++; + r--; + } + } + } + return res; +}; \ No newline at end of file From 4dfe7e90adc345ee9b50dccf006700a52bf0a848 Mon Sep 17 00:00:00 2001 From: Smallfly Date: Wed, 18 Sep 2019 00:54:07 +0800 Subject: [PATCH 21/37] Update readme --- Array/ThreeSum/README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Array/ThreeSum/README.md b/Array/ThreeSum/README.md index 82f1546..7385731 100644 --- a/Array/ThreeSum/README.md +++ b/Array/ThreeSum/README.md @@ -26,11 +26,10 @@ 2. 从小到大遍历排序的数组 3. 在当前遍历下标的后面剩余数组中使用两边夹逼的方式查找两个数 4. 如果这两个数与当前下标的数之和等于 0,则存入结果数组 -5. 否则继续查找 +5. 否则继续夹逼查找 ## 代码实现 -| C | C++ | Java | Python | JavaScript | PHP | Go | +| C++ | Java | Python | JavaScript | Go | | :--: | :--: | :--: | :--: | :---: | :---: | :---: | -| 🤔 | [😀](ThreeSum.cpp) | [😀](ThreeSum.java) | [😀](ThreeSum.py) | 🤔 | 🤔 | [😀](three_sum.go) | - +| [😀](ThreeSum.cpp) | [😀](ThreeSum.java) | [😀](ThreeSum.py) | [😀](./ThreeSum.js) | [😀](three_sum.go) | From 344cc229df58a0c7fc80cd7bf48679e5d3ee3176 Mon Sep 17 00:00:00 2001 From: Smallfly Date: Wed, 18 Sep 2019 00:54:25 +0800 Subject: [PATCH 22/37] Update readme --- Array/TwoSum/README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Array/TwoSum/README.md b/Array/TwoSum/README.md index 149fe34..b290845 100644 --- a/Array/TwoSum/README.md +++ b/Array/TwoSum/README.md @@ -1,4 +1,5 @@ # Two Sum(两数之和) + **LeetCode 1** - [英文版](https://leetcode.com/problems/two-sum/) @@ -6,12 +7,14 @@ - [中文版](https://leetcode-cn.com/problems/two-sum/) ## 题目 + 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那*两个*整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: -``` + +```js 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 @@ -19,6 +22,7 @@ ``` ## 思路 +
点击展开 使用散列表,缓存访问过的元素和下标,遍历数组,查找缓存中是否存在元素和当前元素的和等于目标值。 @@ -26,6 +30,7 @@
## 代码实现 + | C++ | Java | Python | JS | | :--: | :--: | :--: | :---: | |[😀](TwoSum.cpp) | [😀](TwoSum.java) | [😀](TwoSum.py) | [😀](TwoSum.js) | From 1f9808861f46b2eb924ad371512df1683be3aa86 Mon Sep 17 00:00:00 2001 From: Smallfly Date: Fri, 20 Sep 2019 07:35:44 +0800 Subject: [PATCH 23/37] Add js for first missing positive --- Array/FirstMissingPositive/index.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 Array/FirstMissingPositive/index.js diff --git a/Array/FirstMissingPositive/index.js b/Array/FirstMissingPositive/index.js new file mode 100644 index 0000000..fc78bde --- /dev/null +++ b/Array/FirstMissingPositive/index.js @@ -0,0 +1,24 @@ +/** + * @param {number[]} nums + * @return {number} + */ +var firstMissingPositive = function(nums) { + const n = nums.length; + let i = 0; + while (i < n) { + if (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) { + // swap nums[nums[i] - 1] and nums[i] + [nums[nums[i] - 1], nums[i]] = [nums[i], nums[nums[i] - 1]] + } else { + ++i; + } + } + + for (let i = 0; i < n; ++i) { + if (nums[i] != i + 1) { + return i + 1 + } + } + + return nums.length + 1; +}; \ No newline at end of file From 658567bd479993803c7cc0edff5e318ff5d571d7 Mon Sep 17 00:00:00 2001 From: Smallfly Date: Fri, 20 Sep 2019 08:30:03 +0800 Subject: [PATCH 24/37] Update readme --- Array/FirstMissingPositive/README.md | 31 +++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/Array/FirstMissingPositive/README.md b/Array/FirstMissingPositive/README.md index 4074262..67b12c5 100644 --- a/Array/FirstMissingPositive/README.md +++ b/Array/FirstMissingPositive/README.md @@ -1,22 +1,24 @@ # First Missing Positive(缺失的第一个正数) -**LeetCode 41** +## LeetCode 41 - [英文版](https://leetcode.com/problems/first-missing-positive/) - [中文版](https://leetcode-cn.com/problems/first-missing-positive/) ## 题目 -给定一个未排序的整数数组,找出其中没有出现的最小的正整数。 + 示例 1: -``` + +```js 输入: [3,4,-1,1] 输出: 2 ``` 示例 3: -``` + +```js 输入: [7,8,9,11,12] 输出: 1 ``` @@ -27,8 +29,23 @@ ## 思路 +
+点击展开 +这道题如果对空间复杂度没有限制,遍历一次数组,将元素作为 key 存入字典;再遍历一次字典,查找从 [1, n) 中缺失的最小 key 即可。 + +然而,题目说只能使用常数空间,说明只能在原地倒腾数组,数组的特性是下标有序,而题目中查找缺失的最小正整数,肯定要按照 [1, n) 的顺序排除查找,它们之间恰好存在差为 1 的关系。 + +因此,我们可以遍历一次数组,如果当前元素的值没有超过数组大小,就交换到 [元素值 - 1] 的下标,交换完成后,再次遍历新数组,[下标 + 1] 应该等于当前的元素值,否者就是缺失的最小正整数。 + +交换后的数组:a[0] = 1, a[1] = 2, a[2] = 3… + +大致思路已经有了,看上去也并不难,但这是一道 Hard 的题目,还是有坑的。以 [3, 4, -1, 1] 为例,交换到下标 1 后,变为 [-1, 1, 3, 4],此次交换虽然元素 3 交换到了目标位置,然而 1 并没有,元素 1 应该在下标 0 处的,否者第二次遍历检测不到元素 1。 + +因此在交换成功后,不能立即交换下一个元素,而是要再次交换当前元素,直到当前元素不满足交换条件为止。 +
## 代码实现 -| C | C++ | Java | Python | JavaScript | Go | PHP | -| :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | [😀](FirstMissingPositive.cpp) | 🤔 | [😀](FirstMissingPositive.py) | 🤔 | 🤔 | 🤔 | + +| C++ | Java | Python | JavaScript | Go | PHP | +| :--: | :--: | :--: | :--: | :--: | :--: | +| [😀](FirstMissingPositive.cpp) | 🤔 | [😀](FirstMissingPositive.py) | [😀](./index) | 🤔 | 🤔 | From 27bef8824bff5995964b8798aadfb4ec521efb50 Mon Sep 17 00:00:00 2001 From: Smallfly Date: Sun, 22 Sep 2019 10:58:37 +0800 Subject: [PATCH 25/37] Add js for kth largest element --- Array/KthLargestElement/README.md | 17 ++++++++++++--- Array/KthLargestElement/index.js | 35 +++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 Array/KthLargestElement/index.js diff --git a/Array/KthLargestElement/README.md b/Array/KthLargestElement/README.md index f3314a1..c78bc1b 100644 --- a/Array/KthLargestElement/README.md +++ b/Array/KthLargestElement/README.md @@ -27,11 +27,22 @@ ## 思路
点击展开 -使用快速排序的思想 + +题中有个要点容易误解,目标值位于数组从大到小排序的第 k 下标,而不是去重后按元素值从大到小的序位; + +对于无序数组查找的场景,首先要想到的是二分查找,它的时间复杂度仅次于有序数组查找 O(n)。 + +对于二分比较关键的优化点是,pvoit 的确定,会影响实际的效率,工业算法一般会随机一个下标。 + +不过随机算法也有一定的开销,这题就直接用最右边的下标作为 pvoit 了。 + +这像是快排的简化版本。 + +二分查找是一种解法,另一个解法可以采用大顶堆,请自行尝试~
## 代码实现 -| C | C++ | Java | Python | JavaScript | Go | PHP | +| C++ | Java | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | [😀](KthLargestElement.cpp) | 🤔 | [😀](KthLargestElement.py) | 🤔 | 🤔 | 🤔 | +| [😀](KthLargestElement.cpp) | 🤔 | [😀](KthLargestElement.py) | [😀](./index.js) | 🤔 | 🤔 | diff --git a/Array/KthLargestElement/index.js b/Array/KthLargestElement/index.js new file mode 100644 index 0000000..f33c897 --- /dev/null +++ b/Array/KthLargestElement/index.js @@ -0,0 +1,35 @@ +/** + * @param {number[]} nums + * @param {number} k + * @return {number} + */ +// 时间复杂度 O(NlogN) +var findKthLargest = function(nums, k) { + // 二分查找 + const quickSelect = (nums, left, right, tIndex) => { + const pvoit = nums[right]; + let l = left, r = right; + while (l < r) { + // 左边跳过比 pvoit 大的数 + while (nums[l] > pvoit && l < r) l++; + // 右边跳过不大于 pvoit 的数 + while (nums[r] <= pvoit && l < r) r--; + // 此时 num[l] 一定大于或等于 nums[r],交换它们 + [nums[l], nums[r]] = [nums[r], nums[l]]; + } + // 一次二分结束,将 pvoit 交换的中间位置 + [nums[right], nums[l]] = [nums[l], nums[right]]; + + if (tIndex > l) { + // 目标值在右边 + return quickSelect(nums, l + 1, right, tIndex); + } else if (tIndex < l) { + // 目标值在左边 + return quickSelect(nums, left, l - 1, tIndex); + } else { + return nums[l]; + } + } + + return quickSelect(nums, 0, nums.length - 1, k - 1); +}; \ No newline at end of file From e5d105bb24914bb57b4e68617a00c2c8ee8a0cdd Mon Sep 17 00:00:00 2001 From: liyan Date: Mon, 23 Sep 2019 00:17:34 +0800 Subject: [PATCH 26/37] add c++ implenmentation for /Stack --- Stack/03.ValidParentheses/README.md | 2 +- .../03.ValidParentheses/validParentheses.cpp | 20 ++++++++++ Stack/04.LongestValidParentheses/README.md | 2 +- .../longestvalidparentheses.cpp | 26 ++++++++++++ .../README.md | 2 +- .../evaluateReversePolishNotation.cpp | 40 +++++++++++++++++++ 6 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 Stack/03.ValidParentheses/validParentheses.cpp create mode 100644 Stack/04.LongestValidParentheses/longestvalidparentheses.cpp create mode 100644 Stack/05.EvaluateReversePolishNotation/evaluateReversePolishNotation.cpp diff --git a/Stack/03.ValidParentheses/README.md b/Stack/03.ValidParentheses/README.md index c613b1f..8b6ad1b 100644 --- a/Stack/03.ValidParentheses/README.md +++ b/Stack/03.ValidParentheses/README.md @@ -51,6 +51,6 @@ ## 代码实现 | C | C++ | Java | Objective-C | Swift | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | [🤔](./validParentheses.js) | [🤔](./valid_parentheses.go) | 🤔 | +| 🤔 | [😀](./validParentheses.cpp) | 🤔 | 🤔 | 🤔 | 🤔 | [😀](./validParentheses.js) | [😀](./valid_parentheses.go) | 🤔 | 完成 😀,待完成 🤔 diff --git a/Stack/03.ValidParentheses/validParentheses.cpp b/Stack/03.ValidParentheses/validParentheses.cpp new file mode 100644 index 0000000..f5240fd --- /dev/null +++ b/Stack/03.ValidParentheses/validParentheses.cpp @@ -0,0 +1,20 @@ +class Solution { +public: + bool isValid(string s) { + stack myStack; + for(auto ch : s) { + if(ch == '(' || ch == '[' || ch == '{') { + myStack.push(ch); + } + else { + if(myStack.empty()) { return false; } + auto top_ch = myStack.top(); + if((top_ch == '(' && ch == ')') || (top_ch == '[' && ch == ']') || (top_ch == '{' && ch == '}')) { + myStack.pop(); + } + else { return false; } + } + } + return myStack.empty(); + } +}; \ No newline at end of file diff --git a/Stack/04.LongestValidParentheses/README.md b/Stack/04.LongestValidParentheses/README.md index 4a9c37c..bfcfacf 100644 --- a/Stack/04.LongestValidParentheses/README.md +++ b/Stack/04.LongestValidParentheses/README.md @@ -31,4 +31,4 @@ ## 代码实现 | C | C++ | Java | Objective-C | Swift | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | +| 🤔 | [😀](./longestvalidparentheses.cpp) | 🤔 | 🤔 | 🤔 | 🤔 | [😀](./longestvalidparentheses.js) | 🤔 | 🤔 | diff --git a/Stack/04.LongestValidParentheses/longestvalidparentheses.cpp b/Stack/04.LongestValidParentheses/longestvalidparentheses.cpp new file mode 100644 index 0000000..cda9adc --- /dev/null +++ b/Stack/04.LongestValidParentheses/longestvalidparentheses.cpp @@ -0,0 +1,26 @@ +class Solution { +public: + int longestValidParentheses(string s) { + int longest = 0; + // 使用 vector 模拟栈,存储接下来遇到的匹配括号的长度 + vector stk; + stk.push_back(0); + for (auto ch : s) { + if (ch == '(') { + stk.push_back(0); + } + else { + if (stk.size() > 1) { + int v = stk.back(); stk.pop_back(); + int lastCount = stk[stk.size() - 1]; + stk[stk.size() - 1] = lastCount + v + 2; + longest = max(longest, stk[stk.size() - 1]); + } + else { + stk.clear(); stk.push_back(0); + } + } + } + return longest; + } +}; \ No newline at end of file diff --git a/Stack/05.EvaluateReversePolishNotation/README.md b/Stack/05.EvaluateReversePolishNotation/README.md index 03a2c00..2042541 100644 --- a/Stack/05.EvaluateReversePolishNotation/README.md +++ b/Stack/05.EvaluateReversePolishNotation/README.md @@ -48,5 +48,5 @@ ## 代码实现 | C | C++ | Java | Objective-C | Swift | Python | JavaScript | Go | PHP | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | -| 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | +| 🤔 | [😀](./evaluateReversePolishNotation.cpp) | 🤔 | 🤔 | 🤔 | 🤔 | 🤔 | [😀](./evaluate_reverse_polish_notation.go) | 🤔 | diff --git a/Stack/05.EvaluateReversePolishNotation/evaluateReversePolishNotation.cpp b/Stack/05.EvaluateReversePolishNotation/evaluateReversePolishNotation.cpp new file mode 100644 index 0000000..648696b --- /dev/null +++ b/Stack/05.EvaluateReversePolishNotation/evaluateReversePolishNotation.cpp @@ -0,0 +1,40 @@ +class Solution { +public: + int evalRPN(vector& tokens) { + stack myStack; + for(auto str : tokens) { + if(str != "+" && str != "-" && str != "*" && str != "/") { + myStack.push(stoi(str)); + } + else { + int second = myStack.top(); myStack.pop(); + int first = myStack.top(); myStack.pop(); + int result; + switch (str[0]) { + case '+':{ + result = first + second; + break; + } + case '-':{ + result = first - second; + break; + } + case '*':{ + result = first * second; + break; + } + case '/':{ + result = first / second; + break; + } + default:{ + result = 0; + break; + } + } + myStack.push(result); + } + } + return myStack.size() == 1 ? myStack.top() : 0; + } +}; \ No newline at end of file From 3f18a71e725cf65794663c17be31347505c4909d Mon Sep 17 00:00:00 2001 From: wuqinqiang <1185079673@qq.com> Date: Wed, 2 Oct 2019 15:15:30 +0800 Subject: [PATCH 27/37] abount linkedList for PHP --- .idea/Algorithms.iml | 8 + .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/dictionaries/wuqinqiang.xml | 3 + .idea/encodings.xml | 4 + .idea/inspectionProfiles/Project_Default.xml | 82 ++++++ .idea/misc.xml | 39 +++ .idea/modules.xml | 8 + .idea/vcs.xml | 6 + .idea/workspace.xml | 269 ++++++++++++++++++ .../MergeKSortedLists/MergeKSortedLists.php | 89 ++++++ .../MergeSortedLists/MergeSortedLists.php | 52 ++++ .../ReverseLinkedList/ReverseLinkedList.php | 46 +++ .../ReverseNodesKGroup/ReverseNodesKGroup.php | 39 +++ 13 files changed, 650 insertions(+) create mode 100644 .idea/Algorithms.iml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/dictionaries/wuqinqiang.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 LinkedList/MergeKSortedLists/MergeKSortedLists.php create mode 100644 LinkedList/MergeSortedLists/MergeSortedLists.php create mode 100644 LinkedList/ReverseLinkedList/ReverseLinkedList.php create mode 100644 LinkedList/ReverseNodesKGroup/ReverseNodesKGroup.php diff --git a/.idea/Algorithms.iml b/.idea/Algorithms.iml new file mode 100644 index 0000000..c956989 --- /dev/null +++ b/.idea/Algorithms.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/dictionaries/wuqinqiang.xml b/.idea/dictionaries/wuqinqiang.xml new file mode 100644 index 0000000..6afde02 --- /dev/null +++ b/.idea/dictionaries/wuqinqiang.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..15a15b2 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..cb7e4cc --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,82 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..2ef8885 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + CSS + + + Probable bugsCSS + + + RELAX NG + + + XPath + + + XSLT + + + + + Angular + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..49ba2a5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..c26d4c9 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -150,25 +123,21 @@ - - - + - - - - - + @@ -176,10 +145,15 @@ - + + + + + + @@ -194,19 +168,28 @@ - - - - - + + + + + + + - + - - + + + + + + + + + @@ -217,25 +200,33 @@ - - - - - + + + + + + + - - - - + + + + + + + + + + - + - - + + diff --git a/LinkedList/MergeKSortedLists/MergeKSortedLists.php b/LinkedList/MergeKSortedLists/MergeKSortedLists.php index 88573d7..84f3a02 100644 --- a/LinkedList/MergeKSortedLists/MergeKSortedLists.php +++ b/LinkedList/MergeKSortedLists/MergeKSortedLists.php @@ -15,7 +15,7 @@ class Solution * @param ListNode[] $lists * @return ListNode *暴力破解法 - * 取出所有的数 排序 重新生成一个新的链表 + * 取出所有的数 排序 重新生成一个新的链表e */ function mergeKLists($lists) { diff --git a/Queue/03.QueueUsingStacks/QueueUsingStacks.php b/Queue/03.QueueUsingStacks/QueueUsingStacks.php new file mode 100644 index 0000000..771bcdd --- /dev/null +++ b/Queue/03.QueueUsingStacks/QueueUsingStacks.php @@ -0,0 +1,70 @@ +stock)) { + array_unshift($this->temp, array_shift($this->stock)); + } + array_unshift($this->stock, $x); + + while (!empty($this->temp)) { + array_unshift($this->stock, array_shift($this->temp)); + } + + } + + /** + * Removes the element from in front of queue and returns that element. + * @return Integer + */ + function pop() + { + return array_shift($this->stock); + } + + /** + * Get the front element. + * @return Integer + */ + function peek() + { + return current($this->stock); + } + + /** + * Returns whether the queue is empty. + * @return Boolean + */ + function empty() + { + return empty($this->stock); + } +} + +/** + * Your MyQueue object will be instantiated and called as such: + * $obj = MyQueue(); + * $obj->push($x); + * $ret_2 = $obj->pop(); + * $ret_3 = $obj->peek(); + * $ret_4 = $obj->empty(); + */ \ No newline at end of file From f39fad9c9c546820350a62bd7fe801fe3e3f0e70 Mon Sep 17 00:00:00 2001 From: wuqinqiang <1185079673@qq.com> Date: Wed, 30 Oct 2019 19:25:22 +0800 Subject: [PATCH 30/37] hiddlen iead --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index daaf937..8a52901 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ tags tags.* +idea.* +idea From c632acd853c1e3aeb74d11993f5de71a14663935 Mon Sep 17 00:00:00 2001 From: wuqinqiang <1185079673@qq.com> Date: Wed, 30 Oct 2019 19:27:35 +0800 Subject: [PATCH 31/37] hiddlen iead --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8a52901..6e46418 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,4 @@ tags tags.* idea.* -idea +.idea From 5bb8d85d8ab64684d2b66a484a2b28f757117148 Mon Sep 17 00:00:00 2001 From: wuqinqiang <1185079673@qq.com> Date: Wed, 30 Oct 2019 19:32:44 +0800 Subject: [PATCH 32/37] rm -rf .idea --- .idea/Algorithms.iml | 8 - .idea/codeStyles/codeStyleConfig.xml | 5 - .idea/dictionaries/wuqinqiang.xml | 3 - .idea/encodings.xml | 4 - .idea/inspectionProfiles/Project_Default.xml | 82 ------ .idea/misc.xml | 39 --- .idea/modules.xml | 8 - .idea/vcs.xml | 6 - .idea/workspace.xml | 260 ------------------- 9 files changed, 415 deletions(-) delete mode 100644 .idea/Algorithms.iml delete mode 100644 .idea/codeStyles/codeStyleConfig.xml delete mode 100644 .idea/dictionaries/wuqinqiang.xml delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml delete mode 100644 .idea/workspace.xml diff --git a/.idea/Algorithms.iml b/.idea/Algorithms.iml deleted file mode 100644 index c956989..0000000 --- a/.idea/Algorithms.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index 79ee123..0000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/dictionaries/wuqinqiang.xml b/.idea/dictionaries/wuqinqiang.xml deleted file mode 100644 index 6afde02..0000000 --- a/.idea/dictionaries/wuqinqiang.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 15a15b2..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index cb7e4cc..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 2ef8885..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - CSS - - - Probable bugsCSS - - - RELAX NG - - - XPath - - - XSLT - - - - - Angular - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 49ba2a5..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index aa40ef4..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - true - true - - - - - - - - - - - - - - - - - - - - - -