From 73989e0d5296f59e417d10b379bca9461e9546a4 Mon Sep 17 00:00:00 2001 From: Herman <416710685@qq.com> Date: Sun, 12 May 2019 10:38:43 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E5=9B=9B=E5=91=A8=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_04/id_88/Leetcode_169_088.cpp | 64 ++++++++++++++++++++++++ Week_04/id_88/Leetcode_720_088.cpp | 78 ++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 Week_04/id_88/Leetcode_169_088.cpp create mode 100644 Week_04/id_88/Leetcode_720_088.cpp diff --git a/Week_04/id_88/Leetcode_169_088.cpp b/Week_04/id_88/Leetcode_169_088.cpp new file mode 100644 index 00000000..d729a9e1 --- /dev/null +++ b/Week_04/id_88/Leetcode_169_088.cpp @@ -0,0 +1,64 @@ +//对nums进行排序,排序后的中位数就是答案 +//使用了归并排序算法 + +class Solution { +public: + int majorityElement(vector& nums) { + mergeSort(nums, 0, nums.size() - 1); + return nums[nums.size() / 2]; + } + +private: + void mergeSort(vector& nums, int start, int end) { + if (start >= end) return; + + int middle = (end + start) / 2; + + mergeSort(nums, start, middle); + mergeSort(nums, middle+1, end); + merge(nums, start, middle, end); + + } + + void merge(vector& nums, int start, int middle, int end) { + vector temp; + int p = start, q = middle + 1; + + while (p <= middle && q <= end) { + if (nums[p] <= nums[q]) + { + temp.push_back(nums[p]); + p++; + } + else { + temp.push_back(nums[q]); + q++; + } + } + + if (p > middle) + { + while (q <= end) + { + temp.push_back(nums[q]); + q++; + } + } + + if (q > end) + { + while (p <= middle) + { + temp.push_back(nums[p]); + p++; + } + } + + for (int each : temp) + { + nums[start] = each; + start++; + } + + } +}; \ No newline at end of file diff --git a/Week_04/id_88/Leetcode_720_088.cpp b/Week_04/id_88/Leetcode_720_088.cpp new file mode 100644 index 00000000..7af09be8 --- /dev/null +++ b/Week_04/id_88/Leetcode_720_088.cpp @@ -0,0 +1,78 @@ +class TrieNode { +public: + bool isWord; + TrieNode* children[26]; + TrieNode():isWord(false) { + for (int i = 0; i < 26; i++) + { + children[i] = NULL; + } + } + + ~TrieNode() { + for (int i = 0; i < 26; i++) + { + if (children[i] != NULL) delete children[i]; + } + } +}; + +class Solution { +public: + string longestWord(vector& words) { + + if (words.size() == 0) return ""; + + //构建Trie树 + for (int i = 0; i < words.size(); i++) + { + addWord(words[i]); + } + + string ret = ""; + result = ""; + + //使用Trie树深度优先遍历查找出最长的单词 + findLongestWord(root, ret); + + return result; + } + + void addWord(string& word) + { + if (root == NULL) root = new TrieNode(); + TrieNode* ptr = root; + + for (char ch : word) + { + if(ptr->children[ch - 'a'] == NULL) ptr->children[ch - 'a'] = new TrieNode(); + + ptr = ptr->children[ch - 'a']; + + } + + ptr->isWord = true; + } + + void findLongestWord(TrieNode* root, string str) { + if (root != NULL) + { + for (int i = 0; i < 26; i++) + { + if (root->children[i] != NULL && root->children[i]->isWord == true) + { + string newStr = str + (char)('a' + i); + if (newStr.size() > result.size()) { + result = newStr; + } + findLongestWord(root->children[i], newStr); + } + } + } + } + +private: + TrieNode * root; + string result; + int longestLength; +};