楼主: wglacier
跳转到指定楼层
上一主题 下一主题
收起左侧

Leetcode 刷题打卡记录 包括Solution

🔗
 楼主| wglacier 2019-2-19 19:22:50 | 只看该作者
全局:
mwen2 发表于 2019-2-19 15:01
感觉我刷题有时候不会了或者没思路就想看答案。。。而且会强迫自己背别人的算法。然后mock interview导致自 ...

太正常了,不过还是要尽量先自己努力的想,实在想不出来再观摩别人的答案。千万别背答案,理解
回复

使用道具 举报

🔗
 楼主| wglacier 2019-2-19 19:44:33 | 只看该作者
全局:
312. Burst Balloons
Non-recursive
  1. class Solution {
  2.     int get(const vector<int>& nums, int i) {
  3.         if (i < 0 || i >= nums.size())
  4.             return 1;
  5.         return nums[i];
  6.     }
  7. public:
  8.     int maxCoins(vector<int>& nums) {
  9.         if (nums.empty()) return 0;
  10.         
  11.         vector<vector<int>> dp(nums.size(), vector<int>(nums.size(), 0));
  12.         
  13.         for (int i = 1; i <= nums.size(); i++) {
  14.             for (int j = 0; j <= nums.size()-i; j++) {
  15.                 int start = j;
  16.                 int end = j + i - 1; // inclusive
  17.                
  18.                 // assume nums[k] will be bursted last
  19.                 int res = 0;
  20.                 for (int k = start; k <= end; k++) {
  21.                     int r = (k > 0? dp[start][k-1] : 0) +
  22.                         get(nums, start-1)*nums[k]*get(nums, end+1) +
  23.                         (k < nums.size()-1? dp[k+1][end] : 0);
  24.                     res = max(res, r);
  25.                 }
  26.                 dp[start][end] = res; //max(res, dp[start][end]);
  27.             }
  28.         }
  29.         return dp[0][nums.size()-1];
  30.     }
  31. };
复制代码
回复

使用道具 举报

🔗
huihuiyang 2019-2-20 02:16:52 | 只看该作者
全局:
背答案就是我,背了其实过没多久就全忘记了。。。惭愧
回复

使用道具 举报

🔗
 楼主| wglacier 2019-2-20 04:46:19 | 只看该作者
全局:
huihuiyang 发表于 2019-2-20 02:16
背答案就是我,背了其实过没多久就全忘记了。。。惭愧

看懂了之后自己写几遍印象就深了。leetcode,lintcode换着地方写
回复

使用道具 举报

🔗
 楼主| wglacier 2019-2-20 18:12:13 | 只看该作者
全局:
315. Count of Smaller Numbers After Self, hard
  1. class Solution {
  2. public:
  3.     vector<int> countSmaller(vector<int>& nums) {
  4.         vector<int> res(nums.size(), 0);
  5.         vector<int> n_sorted;
  6.         for (int i = nums.size()-1; i >= 0; i--) {
  7.             auto& v = nums[i];
  8.             auto it = lower_bound(n_sorted.begin(), n_sorted.end(), v);
  9.             int r = it - n_sorted.begin();
  10.             n_sorted.insert(it, v);
  11.             res[i] = r;
  12.         }
  13.         return res;
  14.     }
  15. };
复制代码
回复

使用道具 举报

🔗
mwen2 2019-2-21 05:33:50 | 只看该作者
全局:
wglacier 发表于 2019-2-19 19:22
太正常了,不过还是要尽量先自己努力的想,实在想不出来再观摩别人的答案。千万别背答案,理解

多谢楼主鼓励,我争取自己努力想一下,下周有电面,希望可以边刷题边有改变,已加米~
回复

使用道具 举报

🔗
 楼主| wglacier 2019-2-21 18:10:42 | 只看该作者
全局:
315. Count of Smaller Numbers After Self
Merge sort
  1. class Solution {
  2. public:
  3.     struct Node {
  4.         int val;
  5.         int idx;
  6.         int smallerCount;
  7.         Node(int a, int b)
  8.         : val(a), idx(b), smallerCount(0)
  9.         {}
  10.     };
  11.     void merge(vector<Node>& merged, int start, int end) {
  12.         if (start >= end) return;

  13.         int m = start + (end - start)/2;
  14.         merge(merged, start, m);
  15.         merge(merged, m+1, end);

  16.         vector<Node> sorted;
  17.         int i = start, j = m+1;
  18.         int smallerCount = 0;
  19.         while (i <= m && j <= end) {
  20.             int k;
  21.             if (merged[i].val > merged[j].val) {
  22.                 smallerCount++;
  23.                 k = j++;
  24.             } else {
  25.                 merged[i].smallerCount += smallerCount;
  26.                 k = i++;
  27.             }
  28.             sorted.push_back(merged[k]);
  29.         }
  30.         while (i <= m) {
  31.             merged[i].smallerCount += smallerCount;
  32.             sorted.push_back(merged[i++]);
  33.         }
  34.         while (j <= end) {
  35.             sorted.push_back(merged[j++]);
  36.         }
  37.         copy(sorted.begin(), sorted.end(), merged.begin() + start);
  38.     }

  39.     vector<int> countSmaller(vector<int>& nums) {
  40.         vector<Node> merged;
  41.         for (int i = 0; i < nums.size(); i++) {
  42.             merged.push_back(Node(nums[i], i));
  43.         }
  44.         merge(merged, 0, merged.size()-1);

  45.         vector<int> res(nums.size(), 0);
  46.         for (auto& n : merged) {
  47.             res[n.idx] = n.smallerCount;
  48.         }
  49.         return res;
  50.     }
  51. };
复制代码
回复

使用道具 举报

🔗
 楼主| wglacier 2019-2-21 18:44:08 | 只看该作者
全局:
315. Count of Smaller Numbers After Self
Solution 3, BST
  1. class Solution {
  2. public:
  3.     struct Node {
  4.         Node* left;
  5.         Node* right;
  6.         int val;
  7.         int lessEqualCount; // number of nodes that are less or equal to it (include itself)
  8.         Node(int v)
  9.         : val(v), left(nullptr), right(nullptr)
  10.         , lessEqualCount(1)
  11.         {}
  12.     };
  13.     int check(Node* root, int val) {
  14.         int res = 0;
  15.         while (true) {
  16.             if (val <= root->val) {
  17.                 root->lessEqualCount++;
  18.                 if (!root->left) {
  19.                     root->left = new Node(val);
  20.                     break;
  21.                 }
  22.                 root = root->left;
  23.             } else {
  24.                 res += root->lessEqualCount;
  25.                 if (!root->right) {
  26.                     root->right = new Node(val);
  27.                     break;
  28.                 }
  29.                 root = root->right;
  30.             }
  31.         }
  32.         return res;
  33.     }
  34.     vector<int> countSmaller(vector<int> &nums) {
  35.         if (nums.size() < 2) {
  36.             return vector<int>(nums.size(), 0);
  37.         }
  38.         vector<int> res(1, 0);
  39.         Node* root = new Node(nums.back());
  40.         for (int i = nums.size()-2; i >= 0; i--) {
  41.             auto r = check(root, nums[i]);
  42.             res.push_back(r);
  43.         }
  44.         return vector<int>(res.rbegin(), res.rend());
  45.     }
  46. };
复制代码
回复

使用道具 举报

🔗
 楼主| wglacier 2019-2-24 16:41:01 | 只看该作者
全局:
316. Remove Duplicate Letters
  1. class Solution {
  2. public:
  3.      /*
  4.      1. calc the last occurrence of each char
  5.      2. sort the array in asc order
  6.      3. for each group, find the smallest char in the group until find the char same as the last char
  7.      4. extend the current group to the next and repeat step 3.
  8.      */

  9.     string removeDuplicateLetters(string &s) {
  10.         if (s.empty()) return "";
  11.         
  12.         // last idex of each char
  13.         int buf[26];
  14.         fill_n(buf, 26, -1);
  15.         for (int i = 0; i < s.size(); i++) {
  16.             buf[s[i]-'a'] = i;
  17.         }
  18.         sort(buf, buf+26);
  19.         
  20.         // find the first non-empty group
  21.         int k = 0;
  22.         while (buf[k] < 0) k++;

  23.         int start = 0, end = buf[k];
  24.         string res;
  25.         set<char> cused;
  26.         while (start <= end) {
  27.             auto min_char = 'z' + 1;
  28.             int i = start;
  29.             while (i <= end) {
  30.                 auto c = s[i];
  31.                 if (cused.count(c) < 1 && c < min_char) {
  32.                     min_char = c;
  33.                     start = i + 1;
  34.                 }
  35.                 i++;
  36.             }
  37.             cused.insert(min_char);
  38.             res += min_char;

  39.             if (min_char == s[end]) {
  40.                 // extend to next group
  41.                 while (++k < 26) {
  42.                     if (cused.count(s[buf[k]]) < 1) break;
  43.                 }
  44.                 if (k >= 26) break;
  45.                 end = buf[k];
  46.             };
  47.         }
  48.         return res;
  49.     }
  50. };
复制代码
回复

使用道具 举报

🔗
 楼主| wglacier 2019-2-26 14:49:02 | 只看该作者
全局:
336. Palindrome Pairs
Use map
  1. class Solution {
  2. public:
  3.     bool isPalindrome(const string & s) {
  4.         if (s.size() < 2) return true;
  5.         
  6.         int i = 0, j = s.size() - 1;
  7.         while (i < j) {
  8.             if (s[i] != s[j]) return false;
  9.             i++, j--;
  10.         }
  11.         return true;
  12.     }
  13.     vector<vector<int>> palindromePairs(vector<string> &words) {
  14.         vector<vector<int>> res;
  15.         if (words.size() < 2) return res;
  16.         
  17.         // reverse all words into map
  18.         map<string, int> wordMap;
  19.         map<string, int> wordPalin;
  20.         for (int i = 0; i < words.size(); i++) {
  21.             auto & w = words[i];
  22.             wordMap.emplace(string(w.rbegin(), w.rend()), i);
  23.             if (!w.empty() && isPalindrome(w)) {
  24.                 wordPalin.emplace(w, i);
  25.             }
  26.         }

  27.         for (int i = 0; i < words.size(); i++) {
  28.             auto &w = words[i];
  29.             if (w.empty()) {
  30.                 for (auto &pw : wordPalin) {
  31.                     res.push_back({i, pw.second});
  32.                     res.push_back({pw.second, i});
  33.                 }
  34.                 continue;
  35.             }
  36.             // prefix and suffix may contain empty string
  37.             for (int j = 1; j <= w.size(); j++) {
  38.                 auto prefix = w.substr(0, j);
  39.                 auto suffix = w.substr(j);
  40.                 auto it = wordMap.find(prefix);
  41.                 if ( it != wordMap.end() && isPalindrome(suffix) && it->second != i) {
  42.                     res.push_back({i, it->second});
  43.                 }
  44.                 if (suffix.empty()) continue;

  45.                 it = wordMap.find(suffix);
  46.                 if ( it != wordMap.end() && isPalindrome(prefix)) {
  47.                     res.push_back({it->second, i});
  48.                 }
  49.             }
  50.         }
  51.         return res;
  52.     }
  53. };
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表