class Solution {public: vector<vector<int>> findDifference(vector<int>& nums1, vector<int>& nums2) { unordered_set<int> set1(nums1.begin(), nums1.end()), set2(nums2.begin(), nums2.end()); vector<vector<int>> ans(2); for (auto &x : set1) { if (set2.find(x) == set2.end()) { ans[0].push_back(x); } } for (auto &x : set2) { if (set1.find(x) == set1.end()) { ans[1].push_back(x); } } return ans; }};
2. Minimum Deletions to Make Array Beautiful
Greedy, if we keep nums[i], then delete all same elements on the right side of nums[i].
● ● ●c++
class Solution {public: int minDeletion(vector<int>& nums) { int n = nums.size(); vector<int> g(n, -1), f(n + 1, 0); for (int i = n - 2; i >= 0; i--) { if (nums[i + 1] == nums[i]) { g[i] = g[i + 1]; } else { g[i] = i + 1; } } int ans = 0; for (int i = n - 2; i >= 0; i--) { if (g[i] != -1) { f[i] = f[g[i] + 1] + 2; } else { f[i] = 0; } ans = max(ans, f[i]); } return n - ans; }};
3. Find Palindrome With Fixed Length
For the q-th smallest palindrome of length intLength, the upper-half part of the parlindrome should be 10intLength+q−1
● ● ●c++
class Solution {public: long long toFull(long long high, int len) { long long ret = high; vector<long long> digits; while (high > 0) { digits.push_back(high % 10); high = high / 10; } reverse(digits.begin(), digits.end()); for (int i = 0; i < len; i++) { ret = ret * 10 + (digits[len - i - 1]); } return ret; } vector<long long> kthPalindrome(vector<int>& queries, int intLength) { long long halfLength = (intLength + 1) / 2; long long base = pow(10, halfLength - 1) - 1; long long upper = pow(10, halfLength) - 1; vector<long long> ans; for (auto &q : queries) { long long high = base + q; if (high > upper) { ans.push_back(-1); } else { ans.push_back(toFull(high, intLength - halfLength)); } } return ans; }};
4. Maximum Value of K Coins From Piles
DP.
● ● ●c++
class Solution {public: int maxValueOfCoins(vector<vector<int>>& piles, int k) { int n = piles.size(); vector<vector<int>> g(n); for (int i = 0; i < n; i++) { g[i].push_back(0); for (int j = 0; j < piles[i].size(); j++) { g[i].push_back(g[i].back() + piles[i][j]); } } vector<vector<int>> f(n, vector<int>(k + 1, 0)); for (int i = 0; i < n; i++) { for (int j = 0; j <= k; j++) { f[i][j] = 0; if (i > 0) { f[i][j] = max(f[i][j], f[i - 1][j]); } for (int p = 0; p <= piles[i].size() && p <= j; p++) { int tmp = g[i][p]; if (i > 0) { tmp += f[i - 1][j - p]; } f[i][j] = max(f[i][j], tmp); } } } return f[n - 1][k]; }};