mirror of
https://github.com/arkorty/LeetCode.git
synced 2026-03-17 16:51:46 +00:00
Initial commit
This commit is contained in:
23
Easy/add-binary/solution.cpp
Normal file
23
Easy/add-binary/solution.cpp
Normal file
@@ -0,0 +1,23 @@
|
||||
#include <array>
|
||||
#include <string>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
std::string addBinary(std::string a, std::string b) {
|
||||
std::string r("");
|
||||
bool c = 0;
|
||||
for (int i = a.size() - 1, j = b.size() - 1; i >= 0 || j >= 0; --i, --j) {
|
||||
bool d = i >= 0 ? a[i] == '1' : 0;
|
||||
bool e = j >= 0 ? b[j] == '1' : 0;
|
||||
|
||||
r = ((bool)(d ^ e ^ c) ? '1' : '0') + r;
|
||||
c = (d & e) || (e & c) || (d & c);
|
||||
}
|
||||
|
||||
if (c) {
|
||||
r = (c ? '1' : '0') + r;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
};
|
||||
14
Easy/best-time-to-buy-and-sell-stock/solution.cpp
Normal file
14
Easy/best-time-to-buy-and-sell-stock/solution.cpp
Normal file
@@ -0,0 +1,14 @@
|
||||
class Solution {
|
||||
public:
|
||||
int maxProfit(std::vector<int> &prices) {
|
||||
int prof = 0;
|
||||
for (int i = prices.size() - 1, max = 0; i >= 0; --i) {
|
||||
if (prices[i] > max)
|
||||
max = prices[i];
|
||||
else if (max - prices[i] > prof)
|
||||
prof = max - prices[i];
|
||||
}
|
||||
|
||||
return prof;
|
||||
}
|
||||
};
|
||||
31
Easy/binary-tree-inorder-traversal/solution.cpp
Normal file
31
Easy/binary-tree-inorder-traversal/solution.cpp
Normal file
@@ -0,0 +1,31 @@
|
||||
#include <vector>
|
||||
|
||||
struct TreeNode {
|
||||
int val;
|
||||
TreeNode *left;
|
||||
TreeNode *right;
|
||||
TreeNode() : val(0), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x, TreeNode *left, TreeNode *right)
|
||||
: val(x), left(left), right(right) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
private:
|
||||
void traverse(std::vector<int> &list, TreeNode *root) {
|
||||
if (root == nullptr) {
|
||||
return;
|
||||
} else {
|
||||
traverse(list, root->left);
|
||||
list.push_back(root->val);
|
||||
traverse(list, root->right);
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
std::vector<int> inorderTraversal(TreeNode *root) {
|
||||
std::vector<int> list;
|
||||
traverse(list, root);
|
||||
return list;
|
||||
}
|
||||
};
|
||||
31
Easy/binary-tree-postorder-traversal/solution.cpp
Normal file
31
Easy/binary-tree-postorder-traversal/solution.cpp
Normal file
@@ -0,0 +1,31 @@
|
||||
#include <vector>
|
||||
|
||||
struct TreeNode {
|
||||
int val;
|
||||
TreeNode *left;
|
||||
TreeNode *right;
|
||||
TreeNode() : val(0), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x, TreeNode *left, TreeNode *right)
|
||||
: val(x), left(left), right(right) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
private:
|
||||
void traverse(std::vector<int> &list, TreeNode *root) {
|
||||
if (root == nullptr) {
|
||||
return;
|
||||
} else {
|
||||
traverse(list, root->left);
|
||||
traverse(list, root->right);
|
||||
list.push_back(root->val);
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
std::vector<int> postorderTraversal(TreeNode *root) {
|
||||
std::vector<int> list;
|
||||
traverse(list, root);
|
||||
return list;
|
||||
}
|
||||
};
|
||||
31
Easy/binary-tree-preorder-traversal/solution.cpp
Normal file
31
Easy/binary-tree-preorder-traversal/solution.cpp
Normal file
@@ -0,0 +1,31 @@
|
||||
#include <vector>
|
||||
|
||||
struct TreeNode {
|
||||
int val;
|
||||
TreeNode *left;
|
||||
TreeNode *right;
|
||||
TreeNode() : val(0), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x, TreeNode *left, TreeNode *right)
|
||||
: val(x), left(left), right(right) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
private:
|
||||
void traverse(std::vector<int> &list, TreeNode *root) {
|
||||
if (root == nullptr) {
|
||||
return;
|
||||
} else {
|
||||
list.push_back(root->val);
|
||||
traverse(list, root->left);
|
||||
traverse(list, root->right);
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
std::vector<int> preorderTraversal(TreeNode *root) {
|
||||
std::vector<int> list;
|
||||
traverse(list, root);
|
||||
return list;
|
||||
}
|
||||
};
|
||||
19
Easy/contains-duplicate/solution.cpp
Normal file
19
Easy/contains-duplicate/solution.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
class Solution {
|
||||
public:
|
||||
bool containsDuplicate(std::vector<int> &nums) {
|
||||
std::unordered_set<int> unset;
|
||||
|
||||
int size = nums.size();
|
||||
for (int i = 0; i < size; ++i) {
|
||||
int occur = unset.count(nums[i]);
|
||||
|
||||
if (occur == 1) {
|
||||
return true;
|
||||
} else {
|
||||
unset.insert(nums[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
9
Easy/excel-sheet-column-number/Solution.java
Normal file
9
Easy/excel-sheet-column-number/Solution.java
Normal file
@@ -0,0 +1,9 @@
|
||||
class Solution {
|
||||
public int titleToNumber(String ttl) {
|
||||
int num = 0;
|
||||
for (int i = 0; i < ttl.length(); i++)
|
||||
num += Math.pow(26, i) * (int) (ttl.charAt(ttl.length() - i - 1) - 64);
|
||||
|
||||
return num;
|
||||
}
|
||||
}
|
||||
14
Easy/excel-sheet-column-title/Solution.java
Normal file
14
Easy/excel-sheet-column-title/Solution.java
Normal file
@@ -0,0 +1,14 @@
|
||||
class Solution {
|
||||
public String convertToTitle(int num) {
|
||||
StringBuilder ttl = new StringBuilder();
|
||||
|
||||
while (num > 0) {
|
||||
--num;
|
||||
char tba = (char) (num % 26 + 65);
|
||||
ttl.insert(0, tba);
|
||||
num /= 26;
|
||||
}
|
||||
|
||||
return ttl.toString();
|
||||
}
|
||||
}
|
||||
48
Easy/first-unique-character-in-a-string/solution.cpp
Normal file
48
Easy/first-unique-character-in-a-string/solution.cpp
Normal file
@@ -0,0 +1,48 @@
|
||||
#include <string>
|
||||
#include <unordered_set>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
/*
|
||||
int firstUniqChar(std::string line) {
|
||||
std::unordered_map<char, int[2]> hmap;
|
||||
|
||||
for (int i = 0; i < line.size(); ++i) {
|
||||
hmap[line[i]][0] = i;
|
||||
++hmap[line[i]][1];
|
||||
}
|
||||
|
||||
int result = INT32_MAX;
|
||||
for (int i = (int)'a'; i <= (int)'z'; ++i) {
|
||||
if (hmap[(char)i][1] == 1 && hmap[(char)i][0] == 0) {
|
||||
return 0;
|
||||
} else if (hmap[(char)i][1] == 1 && hmap[(char)i][0] < result) {
|
||||
result = hmap[(char)i][0];
|
||||
}
|
||||
}
|
||||
|
||||
return result != INT32_MAX ? result : -1;
|
||||
}
|
||||
*/
|
||||
|
||||
int firstUniqChar(std::string line) {
|
||||
std::unordered_set<char> hmap;
|
||||
|
||||
int index = 0;
|
||||
while (index < line.size()) {
|
||||
char letter = line[index];
|
||||
|
||||
if (hmap.find(letter) == hmap.end() &&
|
||||
line.find(letter, index + 1) == -1) {
|
||||
return index;
|
||||
} else if (line.find(letter, index + 1) != -1) {
|
||||
index = line.find_first_not_of(letter, index + 1);
|
||||
hmap.insert(letter);
|
||||
} else {
|
||||
++index;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
43
Easy/implement-queue-using-stacks/solution.cpp
Normal file
43
Easy/implement-queue-using-stacks/solution.cpp
Normal file
@@ -0,0 +1,43 @@
|
||||
#include <stack>
|
||||
|
||||
class MyQueue {
|
||||
private:
|
||||
std::stack<int> shelfA;
|
||||
std::stack<int> shelfB;
|
||||
|
||||
public:
|
||||
MyQueue() {}
|
||||
|
||||
void push(int data) { shelfA.push(data); }
|
||||
|
||||
int pop() {
|
||||
while (shelfA.size() != 1) {
|
||||
shelfB.push(shelfA.top());
|
||||
shelfA.pop();
|
||||
}
|
||||
int result = shelfA.top();
|
||||
shelfA.pop();
|
||||
while (!shelfB.empty()) {
|
||||
shelfA.push(shelfB.top());
|
||||
shelfB.pop();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int peek() {
|
||||
while (shelfA.size() != 1) {
|
||||
shelfB.push(shelfA.top());
|
||||
shelfA.pop();
|
||||
}
|
||||
int result = shelfA.top();
|
||||
while (!shelfB.empty()) {
|
||||
shelfA.push(shelfB.top());
|
||||
shelfB.pop();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool empty() { return shelfA.empty(); }
|
||||
};
|
||||
25
Easy/implement-strstr/solution.cpp
Normal file
25
Easy/implement-strstr/solution.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
#include <string>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
int strStr(std::string haystack, std::string needle) {
|
||||
for (int i = 0; i < haystack.size(); ++i) {
|
||||
if (haystack.at(i) == needle.at(0)) {
|
||||
bool found = false;
|
||||
for (int j = 0; i + j < haystack.size() && j < needle.size(); ++j) {
|
||||
if (haystack.at(i + j) != needle.at(j)) {
|
||||
break;
|
||||
} else if (j == needle.size() - 1) {
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (found) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
43
Easy/intersection-of-two-arrays-ii/solution.cpp
Normal file
43
Easy/intersection-of-two-arrays-ii/solution.cpp
Normal file
@@ -0,0 +1,43 @@
|
||||
class Solution {
|
||||
public:
|
||||
/*
|
||||
std::vector<int> intersect(std::vector<int> &nums1,
|
||||
std::vector<int> &nums2) {
|
||||
std::unordered_map<int, int> hmap;
|
||||
std::vector<int> rslt;
|
||||
|
||||
for (int i = 0; i < nums1.size(); ++i)
|
||||
++hmap[nums1[i]];
|
||||
|
||||
for (int i = 0; i < nums2.size(); ++i)
|
||||
if (hmap[nums2[i]] > 0) {
|
||||
--hmap[nums2[i]];
|
||||
rslt.push_back(nums2[i]);
|
||||
}
|
||||
|
||||
return rslt;
|
||||
}
|
||||
*/
|
||||
|
||||
std::vector<int> intersect(std::vector<int> &nums1,
|
||||
std::vector<int> &nums2) {
|
||||
std::sort(nums1.begin(), nums1.end());
|
||||
std::sort(nums2.begin(), nums2.end());
|
||||
std::vector<int> rslt;
|
||||
|
||||
int i = 0, j = 0;
|
||||
while (i < nums1.size() && j < nums2.size()) {
|
||||
if (nums1[i] == nums2[j]) {
|
||||
rslt.push_back(nums1[i]);
|
||||
++i;
|
||||
++j;
|
||||
} else if (nums1[i] < nums2[j]) {
|
||||
++i;
|
||||
} else if (nums1[i] > nums2[j]) {
|
||||
++j;
|
||||
}
|
||||
}
|
||||
|
||||
return rslt;
|
||||
}
|
||||
};
|
||||
25
Easy/invert-binary-tree/solution.cpp
Normal file
25
Easy/invert-binary-tree/solution.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
struct TreeNode {
|
||||
int val;
|
||||
TreeNode *left;
|
||||
TreeNode *right;
|
||||
TreeNode() : val(0), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x, TreeNode *left, TreeNode *right)
|
||||
: val(x), left(left), right(right) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
TreeNode *invertTree(TreeNode *root) {
|
||||
if (root != nullptr) {
|
||||
invertTree(root->left);
|
||||
invertTree(root->right);
|
||||
|
||||
TreeNode *copy = root->left;
|
||||
root->left = root->right;
|
||||
root->right = copy;
|
||||
}
|
||||
|
||||
return root;
|
||||
}
|
||||
};
|
||||
50
Easy/linked-list-cycle/solution.cpp
Normal file
50
Easy/linked-list-cycle/solution.cpp
Normal file
@@ -0,0 +1,50 @@
|
||||
#include <iostream>
|
||||
#include <unordered_map>
|
||||
|
||||
struct ListNode {
|
||||
int val;
|
||||
ListNode *next;
|
||||
ListNode(int x) : val(x), next(NULL) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
// bool hasCycle(ListNode *head) {
|
||||
// std::unordered_map<ListNode *, int> hmap;
|
||||
// ListNode *curr = head;
|
||||
// while (curr != NULL) {
|
||||
// if (++hmap[curr] == 2) {
|
||||
// return true;
|
||||
// } else {
|
||||
// curr = curr->next;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// return false;
|
||||
// }
|
||||
|
||||
bool hasCycle(ListNode *head) {
|
||||
if (head == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ListNode *slow = head, *fast = head;
|
||||
int taken = 0, limit = 2;
|
||||
|
||||
while (fast->next != NULL) {
|
||||
fast = fast->next;
|
||||
++taken;
|
||||
if (slow == fast) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (taken == limit) {
|
||||
taken = 0;
|
||||
limit *= 2;
|
||||
slow = fast;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
21
Easy/longest-common-prefix/Solution.java
Normal file
21
Easy/longest-common-prefix/Solution.java
Normal file
@@ -0,0 +1,21 @@
|
||||
class Solution {
|
||||
public String longestCommonPrefix(String[] strs) {
|
||||
int len = strs.length;
|
||||
|
||||
if (len == 0)
|
||||
return "";
|
||||
|
||||
if (len == 1)
|
||||
return strs[0];
|
||||
|
||||
Arrays.sort(strs);
|
||||
|
||||
int end = Math.min(strs[0].length(), strs[len - 1].length());
|
||||
|
||||
int i = 0;
|
||||
while (i < end && strs[0].charAt(i) == strs[len - 1].charAt(i))
|
||||
i++;
|
||||
|
||||
return strs[0].substring(0, i);
|
||||
}
|
||||
}
|
||||
33
Easy/maximum-depth-of-binary-tree/solution.cpp
Normal file
33
Easy/maximum-depth-of-binary-tree/solution.cpp
Normal file
@@ -0,0 +1,33 @@
|
||||
struct TreeNode {
|
||||
int val;
|
||||
TreeNode *left;
|
||||
TreeNode *right;
|
||||
TreeNode() : val(0), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x, TreeNode *left, TreeNode *right)
|
||||
: val(x), left(left), right(right) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
private:
|
||||
void maxDepth(TreeNode *root, int index, int *max) {
|
||||
if (root == nullptr) {
|
||||
if (index > *max) {
|
||||
*max = index;
|
||||
}
|
||||
|
||||
return;
|
||||
} else {
|
||||
maxDepth(root->left, index + 1, max);
|
||||
maxDepth(root->right, index + 1, max);
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
int maxDepth(TreeNode *root) {
|
||||
int max = 0;
|
||||
maxDepth(root, 0, &max);
|
||||
|
||||
return max;
|
||||
}
|
||||
};
|
||||
20
Easy/maximum-number-of-words-you-can-type/Solution.java
Normal file
20
Easy/maximum-number-of-words-you-can-type/Solution.java
Normal file
@@ -0,0 +1,20 @@
|
||||
class Solution {
|
||||
public int canBeTypedWords(String str, String chars) {
|
||||
StringTokenizer words = new StringTokenizer(str, " ");
|
||||
|
||||
int ret = 0;
|
||||
for (boolean flag = true; words.hasMoreTokens(); flag = true) {
|
||||
String word = words.nextToken();
|
||||
for (int i = 0; i < chars.length(); i++)
|
||||
if (word.indexOf(chars.charAt(i)) > -1) {
|
||||
flag = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (flag)
|
||||
++ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
15
Easy/maximum-subarray/solution.cpp
Normal file
15
Easy/maximum-subarray/solution.cpp
Normal file
@@ -0,0 +1,15 @@
|
||||
class Solution {
|
||||
public:
|
||||
int maxSubArray(std::vector<int> &nums) {
|
||||
int max = INT32_MIN;
|
||||
int tmax = 0;
|
||||
for (int i = 0; i < nums.size(); ++i) {
|
||||
tmax = tmax + nums[i];
|
||||
if (max < tmax)
|
||||
max = tmax;
|
||||
if (tmax < 0)
|
||||
tmax = 0;
|
||||
}
|
||||
return max;
|
||||
}
|
||||
};
|
||||
10
Easy/merge-sorted-array/solution.cpp
Normal file
10
Easy/merge-sorted-array/solution.cpp
Normal file
@@ -0,0 +1,10 @@
|
||||
class Solution {
|
||||
public:
|
||||
void merge(std::vector<int> &nums1, int m, std::vector<int> &nums2, int n) {
|
||||
for (int i = 0; i < n; ++i) {
|
||||
nums1[m + i] = nums2[i];
|
||||
}
|
||||
|
||||
std::sort(nums1.begin(), nums1.end());
|
||||
}
|
||||
};
|
||||
24
Easy/merge-two-sorted-lists/solution.cpp
Normal file
24
Easy/merge-two-sorted-lists/solution.cpp
Normal file
@@ -0,0 +1,24 @@
|
||||
struct ListNode {
|
||||
int val;
|
||||
ListNode *next;
|
||||
ListNode() : val(0), next(nullptr) {}
|
||||
ListNode(int x) : val(x), next(nullptr) {}
|
||||
ListNode(int x, ListNode *next) : val(x), next(next) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
ListNode *mergeTwoLists(ListNode *list1, ListNode *list2) {
|
||||
if (list1 == nullptr) {
|
||||
return list2;
|
||||
} else if (list2 == nullptr) {
|
||||
return list1;
|
||||
} else if (list1->val < list2->val) {
|
||||
list1->next = mergeTwoLists(list1->next, list2);
|
||||
return list1;
|
||||
} else {
|
||||
list2->next = mergeTwoLists(list1, list2->next);
|
||||
return list2;
|
||||
}
|
||||
}
|
||||
};
|
||||
13
Easy/palindrome-number/solution.c
Normal file
13
Easy/palindrome-number/solution.c
Normal file
@@ -0,0 +1,13 @@
|
||||
bool isPalindrome(long int a) {
|
||||
if (a < 0)
|
||||
return false;
|
||||
|
||||
long int b = 0;
|
||||
for (long int c = a; c != 0; c /= 10)
|
||||
b = b * 10 + (c % 10);
|
||||
|
||||
if (a == b)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
15
Easy/palindrome-number/solution.cpp
Normal file
15
Easy/palindrome-number/solution.cpp
Normal file
@@ -0,0 +1,15 @@
|
||||
class Solution {
|
||||
public:
|
||||
bool isPalindrome(int x) {
|
||||
if (x < 0) {
|
||||
return false;
|
||||
} else {
|
||||
long int y = 0;
|
||||
for (int i = x; i != 0; i /= 10) {
|
||||
y = y * 10 + i % 10;
|
||||
}
|
||||
|
||||
return x == (int)y;
|
||||
}
|
||||
}
|
||||
};
|
||||
23
Easy/pascals-triangle/solution.cpp
Normal file
23
Easy/pascals-triangle/solution.cpp
Normal file
@@ -0,0 +1,23 @@
|
||||
class Solution {
|
||||
public:
|
||||
std::vector<int> getRow(int n) {
|
||||
std::vector<int> prow = {1};
|
||||
|
||||
for (int i = 1, prev = 1; i < n + 1; ++i) {
|
||||
int curr = (prev * (n - i + 1)) / i;
|
||||
prow.push_back(curr);
|
||||
prev = curr;
|
||||
}
|
||||
|
||||
return prow;
|
||||
}
|
||||
|
||||
std::vector<std::vector<int>> generate(int numRows) {
|
||||
std::vector<std::vector<int>> rslt;
|
||||
|
||||
for (int i = 0; i < numRows; ++i)
|
||||
rslt.push_back(getRow(i));
|
||||
|
||||
return rslt;
|
||||
}
|
||||
};
|
||||
23
Easy/path-sum/solution.cpp
Normal file
23
Easy/path-sum/solution.cpp
Normal file
@@ -0,0 +1,23 @@
|
||||
struct TreeNode {
|
||||
int val;
|
||||
TreeNode *left;
|
||||
TreeNode *right;
|
||||
TreeNode() : val(0), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x, TreeNode *left, TreeNode *right)
|
||||
: val(x), left(left), right(right) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
bool hasPathSum(TreeNode *root, int targetSum) {
|
||||
if (root == nullptr) {
|
||||
return false;
|
||||
} else if (root->left == nullptr && root->right == nullptr) {
|
||||
return targetSum == root->val;
|
||||
} else {
|
||||
return hasPathSum(root->left, targetSum - root->val) ||
|
||||
hasPathSum(root->right, targetSum - root->val);
|
||||
}
|
||||
}
|
||||
};
|
||||
18
Easy/plus-one/solution.cpp
Normal file
18
Easy/plus-one/solution.cpp
Normal file
@@ -0,0 +1,18 @@
|
||||
#include <vector>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
std::vector<int> plusOne(std::vector<int> &digits) {
|
||||
++digits[digits.size() - 1];
|
||||
for (int i = digits.size() - 1; i >= 0 && digits[i] == 10; --i) {
|
||||
digits[i] = 0;
|
||||
if (i != 0) {
|
||||
++digits[i - 1];
|
||||
} else {
|
||||
digits.insert(digits.begin(), 1);
|
||||
}
|
||||
}
|
||||
|
||||
return digits;
|
||||
}
|
||||
};
|
||||
21
Easy/ransom-note/solution.cpp
Normal file
21
Easy/ransom-note/solution.cpp
Normal file
@@ -0,0 +1,21 @@
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
bool canConstruct(std::string ransomNote, std::string magazine) {
|
||||
std::unordered_map<char, int> hmap[2];
|
||||
|
||||
for (int i = 0; i < magazine.size(); ++i) {
|
||||
++hmap[0][magazine[i]];
|
||||
}
|
||||
|
||||
for (int i = 0; i < ransomNote.size(); ++i) {
|
||||
if (hmap[0][ransomNote[i]] < ++hmap[1][ransomNote[i]]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
13
Easy/remove-duplicates-from-sorted-array/Solution.java
Normal file
13
Easy/remove-duplicates-from-sorted-array/Solution.java
Normal file
@@ -0,0 +1,13 @@
|
||||
class Solution {
|
||||
public int removeDuplicates(int[] nums) {
|
||||
int k = 0;
|
||||
for (int i = 0, last = -101; i < nums.length; ++i) {
|
||||
if (last != nums[i]) {
|
||||
nums[k++] = nums[i];
|
||||
last = nums[i];
|
||||
}
|
||||
}
|
||||
|
||||
return k;
|
||||
}
|
||||
}
|
||||
18
Easy/remove-duplicates-from-sorted-array/solution.cpp
Normal file
18
Easy/remove-duplicates-from-sorted-array/solution.cpp
Normal file
@@ -0,0 +1,18 @@
|
||||
#include <iostream>
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
int removeDuplicates(std::vector<int> &nums) {
|
||||
int k = 0, l = INT32_MIN;
|
||||
for (auto iter = nums.begin(); iter != nums.end(); iter.operator++()) {
|
||||
if (l != *iter) {
|
||||
nums[k++] = *iter;
|
||||
l = *iter;
|
||||
}
|
||||
}
|
||||
|
||||
return k;
|
||||
}
|
||||
};
|
||||
33
Easy/remove-duplicates-from-sorted-list/solution.cpp
Normal file
33
Easy/remove-duplicates-from-sorted-list/solution.cpp
Normal file
@@ -0,0 +1,33 @@
|
||||
struct ListNode {
|
||||
int val;
|
||||
ListNode *next;
|
||||
ListNode() : val(0), next(nullptr) {}
|
||||
ListNode(int x) : val(x), next(nullptr) {}
|
||||
ListNode(int x, ListNode *next) : val(x), next(next) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
private:
|
||||
ListNode *removeElements(ListNode *head, int val) {
|
||||
if (head == nullptr) {
|
||||
return nullptr;
|
||||
} else if (head->val == val) {
|
||||
return removeElements(head->next, val);
|
||||
} else {
|
||||
head->next = removeElements(head->next, val);
|
||||
return head;
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
ListNode *deleteDuplicates(ListNode *head) {
|
||||
for (ListNode *curr = head; curr != nullptr && curr->next != nullptr;
|
||||
curr = curr->next) {
|
||||
if (curr->val == curr->next->val) {
|
||||
curr->next = removeElements(curr->next, curr->val);
|
||||
}
|
||||
}
|
||||
|
||||
return head;
|
||||
}
|
||||
};
|
||||
21
Easy/remove-linked-list-elements/solution.cpp
Normal file
21
Easy/remove-linked-list-elements/solution.cpp
Normal file
@@ -0,0 +1,21 @@
|
||||
struct ListNode {
|
||||
int val;
|
||||
ListNode *next;
|
||||
ListNode() : val(0), next(nullptr) {}
|
||||
ListNode(int x) : val(x), next(nullptr) {}
|
||||
ListNode(int x, ListNode *next) : val(x), next(next) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
ListNode *removeElements(ListNode *head, int val) {
|
||||
if (head == nullptr) {
|
||||
return nullptr;
|
||||
} else if (head->val == val) {
|
||||
return removeElements(head->next, val);
|
||||
} else {
|
||||
head->next = removeElements(head->next, val);
|
||||
return head;
|
||||
}
|
||||
}
|
||||
};
|
||||
0
Easy/repeated-substring-pattern/solution.cpp
Normal file
0
Easy/repeated-substring-pattern/solution.cpp
Normal file
29
Easy/reshape-the-matrix/solution.cpp
Normal file
29
Easy/reshape-the-matrix/solution.cpp
Normal file
@@ -0,0 +1,29 @@
|
||||
class Solution {
|
||||
public:
|
||||
std::vector<std::vector<int>>
|
||||
matrixReshape(std::vector<std::vector<int>> &mat, int r, int c) {
|
||||
int m = mat.size(), n = mat[0].size();
|
||||
if (m * n == r * c) {
|
||||
std::vector<std::vector<int>> rslt(r, std::vector<int>(c));
|
||||
|
||||
for (int i = 0, k = 0, l = 0; i < m; ++i) {
|
||||
for (int j = 0; j < n; ++j) {
|
||||
rslt[k][l] = mat[i][j];
|
||||
|
||||
if (l < c) {
|
||||
++l;
|
||||
}
|
||||
|
||||
if (l == c) {
|
||||
l = 0;
|
||||
++k;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return rslt;
|
||||
} else {
|
||||
return mat;
|
||||
}
|
||||
}
|
||||
};
|
||||
22
Easy/reverse-linked-list/solution.cpp
Normal file
22
Easy/reverse-linked-list/solution.cpp
Normal file
@@ -0,0 +1,22 @@
|
||||
struct ListNode {
|
||||
int val;
|
||||
ListNode *next;
|
||||
ListNode() : val(0), next(nullptr) {}
|
||||
ListNode(int x) : val(x), next(nullptr) {}
|
||||
ListNode(int x, ListNode *next) : val(x), next(next) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
ListNode *reverseList(ListNode *head) {
|
||||
ListNode *prev = nullptr, *next = nullptr, *curr = head;
|
||||
while (curr != nullptr) {
|
||||
next = curr->next;
|
||||
curr->next = prev;
|
||||
prev = curr;
|
||||
curr = next;
|
||||
}
|
||||
|
||||
return prev;
|
||||
}
|
||||
};
|
||||
55
Easy/roman-to-integer/Solution.java
Normal file
55
Easy/roman-to-integer/Solution.java
Normal file
@@ -0,0 +1,55 @@
|
||||
class RomanToInteger {
|
||||
int applyOffset(int value, int last_value, int offset) {
|
||||
if (last_value > value) {
|
||||
return offset - value;
|
||||
} else {
|
||||
return offset + value;
|
||||
}
|
||||
}
|
||||
|
||||
public int romanToInt(String roman) {
|
||||
int integer = 0;
|
||||
int last_value = 0;
|
||||
for (int x = roman.length() - 1; x >= 0; x--) {
|
||||
char convertToDecimal = roman.charAt(x);
|
||||
|
||||
switch (convertToDecimal) {
|
||||
case 'M':
|
||||
integer = applyOffset(1000, last_value, integer);
|
||||
last_value = 1000;
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
integer = applyOffset(500, last_value, integer);
|
||||
last_value = 500;
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
integer = applyOffset(100, last_value, integer);
|
||||
last_value = 100;
|
||||
break;
|
||||
|
||||
case 'L':
|
||||
integer = applyOffset(50, last_value, integer);
|
||||
last_value = 50;
|
||||
break;
|
||||
|
||||
case 'X':
|
||||
integer = applyOffset(10, last_value, integer);
|
||||
last_value = 10;
|
||||
break;
|
||||
|
||||
case 'V':
|
||||
integer = applyOffset(5, last_value, integer);
|
||||
last_value = 5;
|
||||
break;
|
||||
|
||||
case 'I':
|
||||
integer = applyOffset(1, last_value, integer);
|
||||
last_value = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return integer;
|
||||
}
|
||||
}
|
||||
24
Easy/search-in-a-binary-search-tree/solution.cpp
Normal file
24
Easy/search-in-a-binary-search-tree/solution.cpp
Normal file
@@ -0,0 +1,24 @@
|
||||
struct TreeNode {
|
||||
int val;
|
||||
TreeNode *left;
|
||||
TreeNode *right;
|
||||
TreeNode() : val(0), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x, TreeNode *left, TreeNode *right)
|
||||
: val(x), left(left), right(right) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
TreeNode *searchBST(TreeNode *root, int val) {
|
||||
if (root == nullptr) {
|
||||
return nullptr;
|
||||
} else if (root->val > val) {
|
||||
return searchBST(root->left, val);
|
||||
} else if (root->val < val) {
|
||||
return searchBST(root->right, val);
|
||||
} else {
|
||||
return root;
|
||||
}
|
||||
}
|
||||
};
|
||||
24
Easy/search-insert-position/solution.cpp
Normal file
24
Easy/search-insert-position/solution.cpp
Normal file
@@ -0,0 +1,24 @@
|
||||
#include <vector>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
int searchInsert(std::vector<int> &nums, int target) {
|
||||
int l = 0;
|
||||
int h = nums.size() - 1;
|
||||
|
||||
int m = l + (h - l) / 2;
|
||||
while (l <= h) {
|
||||
if (nums.at(m) == target) {
|
||||
break;
|
||||
} else if (nums.at(m) < target) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
h = m - 1;
|
||||
}
|
||||
|
||||
m = l + (h - l) / 2;
|
||||
}
|
||||
|
||||
return m;
|
||||
}
|
||||
};
|
||||
30
Easy/symmetric-tree/solution.cpp
Normal file
30
Easy/symmetric-tree/solution.cpp
Normal file
@@ -0,0 +1,30 @@
|
||||
struct TreeNode {
|
||||
int val;
|
||||
TreeNode *left;
|
||||
TreeNode *right;
|
||||
TreeNode() : val(0), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x, TreeNode *left, TreeNode *right)
|
||||
: val(x), left(left), right(right) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
private:
|
||||
bool isSymmetric(TreeNode *left, TreeNode *right) {
|
||||
if (left == nullptr && right == nullptr) {
|
||||
return true;
|
||||
} else if (left == nullptr || right == nullptr) {
|
||||
return false;
|
||||
} else if (left->val == right->val) {
|
||||
return isSymmetric(left->left, right->right) &&
|
||||
isSymmetric(left->right, right->left);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
bool isSymmetric(TreeNode *root) {
|
||||
return isSymmetric(root->left, root->right);
|
||||
}
|
||||
};
|
||||
10
Easy/two-sum/Solution.java
Normal file
10
Easy/two-sum/Solution.java
Normal file
@@ -0,0 +1,10 @@
|
||||
class Solution {
|
||||
public int[] twoSum(int[] nums, int target) {
|
||||
for (int i = 0; i < nums.length - 1; i++)
|
||||
for (int j = i + 1; j < nums.length; j++)
|
||||
if (target - nums[i] == nums[j])
|
||||
return new int[] { i, j };
|
||||
|
||||
return new int[] { -1, -1 };
|
||||
}
|
||||
}
|
||||
18
Easy/two-sum/solution.cpp
Normal file
18
Easy/two-sum/solution.cpp
Normal file
@@ -0,0 +1,18 @@
|
||||
class Solution {
|
||||
public:
|
||||
std::vector<int> twoSum(std::vector<int> &nums, int target) {
|
||||
std::unordered_map<int, int> hmap;
|
||||
|
||||
for (int i = 0; i < nums.size(); ++i) {
|
||||
int diff = target - nums[i];
|
||||
|
||||
if (hmap.find(diff) != hmap.end()) {
|
||||
return {hmap[diff], i};
|
||||
} else {
|
||||
hmap[nums[i]] = i;
|
||||
}
|
||||
}
|
||||
|
||||
return {-1, -1};
|
||||
}
|
||||
};
|
||||
25
Easy/valid-anagram/solution.cpp
Normal file
25
Easy/valid-anagram/solution.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
bool isAnagram(std::string s, std::string t) {
|
||||
if (s.size() == t.size()) {
|
||||
std::unordered_map<char, int> hmap[2];
|
||||
for (int i = 0; i < s.size(); ++i) {
|
||||
++hmap[0][s[i]];
|
||||
++hmap[1][t[i]];
|
||||
}
|
||||
|
||||
for (int i = (int)'a'; i <= (int)'z'; ++i) {
|
||||
if (hmap[0][(char)i] != hmap[1][(char)i]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
24
Easy/valid-parentheses/solution.cpp
Normal file
24
Easy/valid-parentheses/solution.cpp
Normal file
@@ -0,0 +1,24 @@
|
||||
#include <iostream>
|
||||
#include <stack>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
bool isValid(std::string line) {
|
||||
std::stack<char> shelf;
|
||||
for (auto iter = line.begin(); iter != line.end(); iter.operator++()) {
|
||||
if (*iter == '(' || *iter == '{' || *iter == '[') {
|
||||
shelf.push(*iter);
|
||||
} else if (shelf.empty()) {
|
||||
return false;
|
||||
} else if ((*iter == ')' && shelf.top() == '(') ||
|
||||
(*iter == '}' && shelf.top() == '{') ||
|
||||
(*iter == ']' && shelf.top() == '[')) {
|
||||
shelf.pop();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return shelf.empty();
|
||||
}
|
||||
};
|
||||
21
Hard/longest-valid-parentheses/Solution.java
Normal file
21
Hard/longest-valid-parentheses/Solution.java
Normal file
@@ -0,0 +1,21 @@
|
||||
class Solution {
|
||||
public int longestValidParentheses(String str) {
|
||||
Stack<Integer> stack = new Stack<>();
|
||||
stack.push(-1);
|
||||
|
||||
int max = 0;
|
||||
for (int cur = 0; cur < str.length(); cur++) {
|
||||
if (str.charAt(cur) == '(') {
|
||||
stack.push(cur);
|
||||
} else {
|
||||
stack.pop();
|
||||
if (stack.empty()) {
|
||||
stack.push(cur);
|
||||
} else {
|
||||
max = Math.max(max, cur - stack.peek());
|
||||
}
|
||||
}
|
||||
}
|
||||
return max;
|
||||
}
|
||||
}
|
||||
26
Hard/longest-valid-parentheses/solution.cpp
Normal file
26
Hard/longest-valid-parentheses/solution.cpp
Normal file
@@ -0,0 +1,26 @@
|
||||
#include <stack>
|
||||
#include <string>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
int longestValidParentheses(std::string line) {
|
||||
std::stack<int> shelf;
|
||||
shelf.push(-1);
|
||||
|
||||
int max = 0;
|
||||
for (int i = 0; i < line.length(); ++i) {
|
||||
if (line[i] == '(') {
|
||||
shelf.push(i);
|
||||
} else {
|
||||
shelf.pop();
|
||||
if (shelf.empty()) {
|
||||
shelf.push(i);
|
||||
} else if (max < i - shelf.top()) {
|
||||
max = i - shelf.top();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return max;
|
||||
}
|
||||
};
|
||||
57
Hard/sudoku-solver/Solution.java
Normal file
57
Hard/sudoku-solver/Solution.java
Normal file
@@ -0,0 +1,57 @@
|
||||
class Solution {
|
||||
char[][] BOARD;
|
||||
|
||||
boolean isValid(int row, int col, char num) {
|
||||
for (int i = 0; i < 9; i++) {
|
||||
if (BOARD[i][col] == num)
|
||||
return false;
|
||||
if (BOARD[row][i] == num)
|
||||
return false;
|
||||
}
|
||||
|
||||
row = row - row % 3;
|
||||
col = col - col % 3;
|
||||
for (int i = 0; i < 3; i++)
|
||||
for (int j = 0; j < 3; j++)
|
||||
if (BOARD[i + row][j + col] == num)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int[] nextEmpty() {
|
||||
for (int i = 0; i < 9; i++)
|
||||
for (int j = 0; j < 9; j++)
|
||||
if (BOARD[i][j] == '.')
|
||||
return new int[] { i, j };
|
||||
|
||||
return new int[] { -1, -1 };
|
||||
}
|
||||
|
||||
boolean solver() {
|
||||
int[] tmp = nextEmpty();
|
||||
if (tmp[0] == -1)
|
||||
return true;
|
||||
|
||||
int row = tmp[0];
|
||||
int col = tmp[1];
|
||||
|
||||
for (int i = 1; i <= 9; i++) {
|
||||
if (isValid(row, col, (char) (48 + i))) {
|
||||
BOARD[row][col] = (char) (48 + i);
|
||||
|
||||
if (solver())
|
||||
return true;
|
||||
}
|
||||
|
||||
BOARD[row][col] = '.';
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public void solveSudoku(char[][] board) {
|
||||
BOARD = board;
|
||||
solver();
|
||||
}
|
||||
}
|
||||
67
Hard/sudoku-solver/solution.cpp
Normal file
67
Hard/sudoku-solver/solution.cpp
Normal file
@@ -0,0 +1,67 @@
|
||||
#include <array>
|
||||
#include <vector>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
std::array<int, 2> nextEmpty(std::vector<std::vector<char>> &board) {
|
||||
for (int i = 0; i < 9; ++i) {
|
||||
for (int j = 0; j < 9; ++j) {
|
||||
if (board[i][j] == '.') {
|
||||
return {i, j};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {-1, -1};
|
||||
}
|
||||
|
||||
bool valid(std::vector<std::vector<char>> &board, int row, int col,
|
||||
char dgt) {
|
||||
for (int i = 0; i < 9; ++i) {
|
||||
if (board[i][col] == dgt || board[row][i] == dgt) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
row = row - row % 3;
|
||||
col = col - col % 3;
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
for (int j = 0; j < 3; ++j) {
|
||||
if (board[i + row][j + col] == dgt) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool boardFiller(std::vector<std::vector<char>> &board) {
|
||||
std::array<int, 2> index = nextEmpty(board);
|
||||
|
||||
if (index[0] == -1) {
|
||||
return true;
|
||||
}
|
||||
|
||||
int row = index[0];
|
||||
int col = index[1];
|
||||
|
||||
for (int i = 0; i < 9; ++i) {
|
||||
if (valid(board, row, col, (char)((int)'1' + i))) {
|
||||
board[row][col] = (char)((int)'1' + i);
|
||||
|
||||
if (boardFiller(board)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
board[row][col] = '.';
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void solveSudoku(std::vector<std::vector<char>> &board) {
|
||||
boardFiller(board);
|
||||
}
|
||||
};
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2022 Arkaprabha Chakraborty
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
44
Medium/add-two-numbers/Solution.java
Normal file
44
Medium/add-two-numbers/Solution.java
Normal file
@@ -0,0 +1,44 @@
|
||||
class ListNode {
|
||||
int val;
|
||||
ListNode next;
|
||||
|
||||
ListNode() {
|
||||
}
|
||||
|
||||
ListNode(int val) {
|
||||
this.val = val;
|
||||
}
|
||||
|
||||
ListNode(int val, ListNode next) {
|
||||
this.val = val;
|
||||
this.next = next;
|
||||
}
|
||||
}
|
||||
|
||||
class Solution {
|
||||
public ListNode addTwoNumbers(ListNode list1, ListNode list2) {
|
||||
ListNode head = new ListNode(0);
|
||||
ListNode cur = head;
|
||||
|
||||
int carry = 0;
|
||||
while (list1 != null || list2 != null) {
|
||||
int dig1 = list1 != null ? list1.val : 0;
|
||||
int dig2 = list2 != null ? list2.val : 0;
|
||||
|
||||
int sum = dig1 + dig2 + carry;
|
||||
cur.next = new ListNode(sum % 10);
|
||||
cur = cur.next;
|
||||
carry = sum / 10;
|
||||
|
||||
if (list1 != null)
|
||||
list1 = list1.next;
|
||||
if (list2 != null)
|
||||
list2 = list2.next;
|
||||
}
|
||||
|
||||
if (carry > 0)
|
||||
cur.next = new ListNode(carry);
|
||||
|
||||
return head.next;
|
||||
}
|
||||
}
|
||||
35
Medium/binary-tree-level-order-traversal/solution.cpp
Normal file
35
Medium/binary-tree-level-order-traversal/solution.cpp
Normal file
@@ -0,0 +1,35 @@
|
||||
#include <vector>
|
||||
|
||||
struct TreeNode {
|
||||
int val;
|
||||
TreeNode *left;
|
||||
TreeNode *right;
|
||||
TreeNode() : val(0), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x, TreeNode *left, TreeNode *right)
|
||||
: val(x), left(left), right(right) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
private:
|
||||
void levelOrder(std::vector<std::vector<int>> &levels, TreeNode *root,
|
||||
int index) {
|
||||
if (root == nullptr) {
|
||||
return;
|
||||
} else if (levels.size() == index) {
|
||||
levels.push_back(std::vector<int>{});
|
||||
}
|
||||
|
||||
levels[index].push_back(root->val);
|
||||
levelOrder(levels, root->left, index + 1);
|
||||
levelOrder(levels, root->right, index + 1);
|
||||
}
|
||||
|
||||
public:
|
||||
std::vector<std::vector<int>> levelOrder(TreeNode *root) {
|
||||
std::vector<std::vector<int>> levels;
|
||||
levelOrder(levels, root, 0);
|
||||
|
||||
return levels;
|
||||
}
|
||||
};
|
||||
26
Medium/container-with-most-water/solution.cpp
Normal file
26
Medium/container-with-most-water/solution.cpp
Normal file
@@ -0,0 +1,26 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
int maxArea(std::vector<int> &height) {
|
||||
int left = 0;
|
||||
int right = height.size() - 1;
|
||||
int maxArea = 0;
|
||||
int curArea = 0;
|
||||
while (left < right) {
|
||||
curArea =
|
||||
(right - left) *
|
||||
(height[left] < height[right] ? height[left] : height[right]);
|
||||
maxArea = maxArea > curArea ? maxArea : curArea;
|
||||
|
||||
if (height[left] > height[right]) {
|
||||
--right;
|
||||
} else {
|
||||
++left;
|
||||
}
|
||||
}
|
||||
|
||||
return maxArea;
|
||||
}
|
||||
};
|
||||
25
Medium/equal-row-and-column-pairs/solution.cpp
Normal file
25
Medium/equal-row-and-column-pairs/solution.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
#include <vector>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
int equalPairs(std::vector<std::vector<int>> &grid) {
|
||||
int count = 0;
|
||||
for (int i = 0; i < grid.size(); ++i) {
|
||||
for (int j = 0; j < grid.size(); ++j) {
|
||||
bool match = true;
|
||||
for (int k = 0; k < grid.size(); ++k) {
|
||||
if (grid[i][k] != grid[k][j]) {
|
||||
match = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (match) {
|
||||
++count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
};
|
||||
31
Medium/insert-into-a-binary-search-tree/solution.cpp
Normal file
31
Medium/insert-into-a-binary-search-tree/solution.cpp
Normal file
@@ -0,0 +1,31 @@
|
||||
struct TreeNode {
|
||||
int val;
|
||||
TreeNode *left;
|
||||
TreeNode *right;
|
||||
TreeNode() : val(0), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x, TreeNode *left, TreeNode *right)
|
||||
: val(x), left(left), right(right) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
TreeNode *insertIntoBST(TreeNode *root, int val) {
|
||||
TreeNode *node = root;
|
||||
while (node != nullptr) {
|
||||
if (val < node->val && node->left == nullptr) {
|
||||
node->left = new TreeNode(val);
|
||||
break;
|
||||
} else if (val > node->val && node->right == nullptr) {
|
||||
node->right = new TreeNode(val);
|
||||
break;
|
||||
} else if (val > node->val) {
|
||||
node = node->right;
|
||||
} else if (val < node->val) {
|
||||
node = node->left;
|
||||
}
|
||||
}
|
||||
|
||||
return root != nullptr ? root : new TreeNode(val);
|
||||
}
|
||||
};
|
||||
68
Medium/letter-combinations-of-a-phone-number/solution.cpp
Normal file
68
Medium/letter-combinations-of-a-phone-number/solution.cpp
Normal file
@@ -0,0 +1,68 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
std::vector<std::string> letterCombinations(std::string digits) {
|
||||
std::string letters[] = {"abc", "def", "ghi", "jkl",
|
||||
"mno", "pqrs", "tuv", "wxyz"};
|
||||
|
||||
std::vector<std::string> finvec;
|
||||
|
||||
if (digits.length() == 1) {
|
||||
std::string tmplet = letters[(int)digits[0] - 50];
|
||||
|
||||
for (int i = 0; i < tmplet.length(); ++i) {
|
||||
finvec.push_back(std::string("") + tmplet[i]);
|
||||
}
|
||||
}
|
||||
|
||||
else if (digits.length() == 2) {
|
||||
std::string tmplet_0 = letters[(int)digits[0] - 50];
|
||||
std::string tmplet_1 = letters[(int)digits[1] - 50];
|
||||
|
||||
for (int i = 0; i < tmplet_0.length(); ++i) {
|
||||
for (int j = 0; j < tmplet_1.length(); ++j) {
|
||||
finvec.push_back(std::string("") + tmplet_0[i] +
|
||||
tmplet_1[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if (digits.length() == 3) {
|
||||
std::string tmplet_0 = letters[(int)digits[0] - 50];
|
||||
std::string tmplet_1 = letters[(int)digits[1] - 50];
|
||||
std::string tmplet_2 = letters[(int)digits[2] - 50];
|
||||
|
||||
for (int i = 0; i < tmplet_0.length(); ++i) {
|
||||
for (int j = 0; j < tmplet_1.length(); ++j) {
|
||||
for (int k = 0; k < tmplet_2.length(); ++k) {
|
||||
finvec.push_back(std::string("") + tmplet_0[i] +
|
||||
tmplet_1[j] + tmplet_2[k]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if (digits.length() == 4) {
|
||||
std::string tmplet_0 = letters[(int)digits[0] - 50];
|
||||
std::string tmplet_1 = letters[(int)digits[1] - 50];
|
||||
std::string tmplet_2 = letters[(int)digits[2] - 50];
|
||||
std::string tmplet_3 = letters[(int)digits[3] - 50];
|
||||
|
||||
for (int i = 0; i < tmplet_0.length(); ++i) {
|
||||
for (int j = 0; j < tmplet_1.length(); ++j) {
|
||||
for (int k = 0; k < tmplet_2.length(); ++k) {
|
||||
for (int l = 0; l < tmplet_3.length(); ++l) {
|
||||
finvec.push_back(std::string("") + tmplet_0[i] +
|
||||
tmplet_1[j] + tmplet_2[k] +
|
||||
tmplet_3[l]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return finvec;
|
||||
}
|
||||
};
|
||||
28
Medium/longest-palindromic-substring/Solution.java
Normal file
28
Medium/longest-palindromic-substring/Solution.java
Normal file
@@ -0,0 +1,28 @@
|
||||
class Solution {
|
||||
public String longestPalindrome(String line) {
|
||||
if (line.length() < 2) {
|
||||
return line;
|
||||
} else {
|
||||
int start = 0, size = 0, left = 0, right = 0, middle = 0;
|
||||
while (middle < line.length()) {
|
||||
left = right = middle;
|
||||
while (right < line.length() - 1 && line.charAt(right) == line.charAt(right + 1)) {
|
||||
++right;
|
||||
}
|
||||
|
||||
middle = right + 1;
|
||||
while (left > 0 && right < line.length() - 1 && line.charAt(left - 1) == line.charAt(right + 1)) {
|
||||
--left;
|
||||
++right;
|
||||
}
|
||||
|
||||
if (right - left + 1 > size) {
|
||||
start = left;
|
||||
size = right - left + 1;
|
||||
}
|
||||
}
|
||||
|
||||
return line.substring(start, start + size);
|
||||
}
|
||||
}
|
||||
}
|
||||
33
Medium/longest-palindromic-substring/solution.cpp
Normal file
33
Medium/longest-palindromic-substring/solution.cpp
Normal file
@@ -0,0 +1,33 @@
|
||||
#include <string>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
std::string longestPalindrome(std::string line) {
|
||||
if (line.size() < 2) {
|
||||
return line;
|
||||
} else {
|
||||
int size = 0, start = 0, left = 0, right = 0, middle = 0;
|
||||
while (middle < line.size()) {
|
||||
left = middle, right = middle;
|
||||
while (right < line.size() - 1 &&
|
||||
line[right] == line[right + 1]) {
|
||||
++right;
|
||||
}
|
||||
|
||||
middle = right + 1;
|
||||
while (right < line.size() - 1 && left > 0 &&
|
||||
line[right + 1] == line[left - 1]) {
|
||||
--left;
|
||||
++right;
|
||||
}
|
||||
|
||||
if (right - left + 1 > size) {
|
||||
start = left;
|
||||
size = right - left + 1;
|
||||
}
|
||||
}
|
||||
|
||||
return line.substr(start, size);
|
||||
}
|
||||
}
|
||||
};
|
||||
13
Medium/reverse-integer/Solution.java
Normal file
13
Medium/reverse-integer/Solution.java
Normal file
@@ -0,0 +1,13 @@
|
||||
class IntegerReverse {
|
||||
public int reverse(int num) {
|
||||
if (num == 0)
|
||||
return 0;
|
||||
|
||||
try {
|
||||
return Integer.parseInt(new StringBuilder(Integer.toString(Math.abs(num))).reverse().toString())
|
||||
* (num < 0 ? -1 : 1);
|
||||
} catch (NumberFormatException err) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
53
Medium/search-a-2d-matrix/solution.cpp
Normal file
53
Medium/search-a-2d-matrix/solution.cpp
Normal file
@@ -0,0 +1,53 @@
|
||||
#include <vector>
|
||||
|
||||
class Solution {
|
||||
private:
|
||||
bool binarySearch(std::vector<int> &nums, int start, int end, int target) {
|
||||
while (end >= start) {
|
||||
int middle = start + (end - start) / 2;
|
||||
|
||||
if (nums[middle] == target) {
|
||||
return true;
|
||||
} else if (nums[middle] > target) {
|
||||
end = middle - 1;
|
||||
} else {
|
||||
start = middle + 1;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
bool binarySearch(std::vector<int> &nums, int start, int end, int target) {
|
||||
if (end >= start) {
|
||||
int middle = start + (end - start) / 2;
|
||||
|
||||
if (nums[middle] == target) {
|
||||
return true;
|
||||
} else if (nums[middle] > target) {
|
||||
return binarySearch(nums, start, middle - 1, target);
|
||||
} else {
|
||||
return binarySearch(nums, middle + 1, end, target);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
|
||||
public:
|
||||
bool searchMatrix(std::vector<std::vector<int>> &matrix, int target) {
|
||||
int row = matrix.size();
|
||||
int col = matrix[0].size();
|
||||
for (int i = 0; i < row; ++i) {
|
||||
if (target > matrix[i][col - 1]) {
|
||||
continue;
|
||||
} else {
|
||||
return binarySearch(matrix[i], 0, col - 1, target);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
9
Medium/single-element-in-a-sorted-array/Solution.java
Normal file
9
Medium/single-element-in-a-sorted-array/Solution.java
Normal file
@@ -0,0 +1,9 @@
|
||||
class Solution {
|
||||
public int singleNonDuplicate(int[] nums) {
|
||||
for (int i = 0; i < nums.length - 1; i += 2)
|
||||
if (nums[i] != nums[i + 1])
|
||||
return i;
|
||||
|
||||
return nums.length - 1;
|
||||
}
|
||||
}
|
||||
32
Medium/sort-list/solution.c
Normal file
32
Medium/sort-list/solution.c
Normal file
@@ -0,0 +1,32 @@
|
||||
struct ListNode *merge(struct ListNode *left, struct ListNode *right) {
|
||||
if (!left) {
|
||||
return right;
|
||||
}
|
||||
if (!right) {
|
||||
return left;
|
||||
}
|
||||
|
||||
if (left->val < right->val) {
|
||||
left->next = merge(left->next, right);
|
||||
return left;
|
||||
} else {
|
||||
right->next = merge(left, right->next);
|
||||
return right;
|
||||
}
|
||||
}
|
||||
|
||||
struct ListNode *sortList(struct ListNode *head) {
|
||||
if (!head || !head->next) {
|
||||
return head;
|
||||
}
|
||||
struct ListNode *fast, *midd, *bmid;
|
||||
fast = midd = head;
|
||||
while (fast && fast->next) {
|
||||
bmid = midd;
|
||||
fast = fast->next->next;
|
||||
midd = midd->next;
|
||||
}
|
||||
|
||||
bmid->next = NULL;
|
||||
return merge(sortList(head), sortList(midd));
|
||||
}
|
||||
70
Medium/string-to-integer-atoi/solution.cpp
Normal file
70
Medium/string-to-integer-atoi/solution.cpp
Normal file
@@ -0,0 +1,70 @@
|
||||
class Solution {
|
||||
public:
|
||||
int myAtoi(std::string s) {
|
||||
|
||||
unsigned long value = 0;
|
||||
|
||||
bool found = false, minus = false, signi = false;
|
||||
|
||||
for (int i = 0, j = 0; i <= 200; ++i) {
|
||||
char chr = s[i];
|
||||
|
||||
if (j > 18)
|
||||
break;
|
||||
|
||||
else if ((int)chr == 0)
|
||||
break;
|
||||
|
||||
else if (((int)chr == 43 || (int)chr == 45) && !found) {
|
||||
if ((int)chr == 45)
|
||||
minus = true;
|
||||
found = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
else if (((int)chr == 43 || (int)chr == 45) && found) {
|
||||
break;
|
||||
}
|
||||
|
||||
else if (((int)chr == 46 || ((int)chr >= 65 && (int)chr <= 90) ||
|
||||
((int)chr >= 97 && (int)chr <= 122)) &&
|
||||
!found) {
|
||||
break;
|
||||
}
|
||||
|
||||
else if (((int)chr == 46 || ((int)chr >= 65 && (int)chr <= 90) ||
|
||||
((int)chr >= 97 && (int)chr <= 122)) &&
|
||||
found) {
|
||||
break;
|
||||
}
|
||||
|
||||
else if ((int)chr == 32 && found)
|
||||
break;
|
||||
|
||||
else if ((int)chr >= 48 && (int)chr <= 57) {
|
||||
if ((int)chr != 48)
|
||||
signi = true;
|
||||
|
||||
value = value * 10 + ((int)chr - 48);
|
||||
found = true;
|
||||
|
||||
if (signi)
|
||||
++j;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
else if ((int)chr == 32 && !found)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (value > 2147483648 && minus)
|
||||
return -2147483648;
|
||||
else if (minus)
|
||||
return value * -1;
|
||||
else if (value > 2147483647)
|
||||
return 2147483647;
|
||||
else
|
||||
return value;
|
||||
}
|
||||
};
|
||||
33
Medium/two-sum-ii-input-array-is-sorted/solution.cpp
Normal file
33
Medium/two-sum-ii-input-array-is-sorted/solution.cpp
Normal file
@@ -0,0 +1,33 @@
|
||||
class Solution {
|
||||
public:
|
||||
std::vector<int> twoSum(std::vector<int> &numbers, int target) {
|
||||
int j = -1;
|
||||
for (int i = 0; i < numbers.size(); ++i) {
|
||||
int otherhalf = target - numbers[i];
|
||||
|
||||
j = binarySearch(numbers, 0, numbers.size() - 1, otherhalf);
|
||||
|
||||
if (j != -1 && i != j) {
|
||||
if (i < j)
|
||||
return std::vector{i + 1, j + 1};
|
||||
else
|
||||
return std::vector{j + 1, i + 1};
|
||||
}
|
||||
}
|
||||
|
||||
return std::vector{-1, -1};
|
||||
}
|
||||
|
||||
int binarySearch(std::vector<int> &numbers, int start, int end, int key) {
|
||||
if (start <= end) {
|
||||
int middle = (start + end) / 2;
|
||||
if (numbers[middle] == key)
|
||||
return middle;
|
||||
else if (numbers[middle] > key)
|
||||
return binarySearch(numbers, start, middle - 1, key);
|
||||
else
|
||||
return binarySearch(numbers, middle + 1, end, key);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
66
Medium/valid-sudoku/solution.cpp
Normal file
66
Medium/valid-sudoku/solution.cpp
Normal file
@@ -0,0 +1,66 @@
|
||||
#include <iostream>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
/*
|
||||
bool isValidSudoku(std::vector<std::vector<char>> &board) {
|
||||
for (int r = 0; r < 9; ++r) {
|
||||
for (int c = 0; c < 9; ++c) {
|
||||
char num = board[r][c];
|
||||
if (num != '.') {
|
||||
int count = 0;
|
||||
for (int i = 0; i < 9; ++i) {
|
||||
if (num == board[r][i]) {
|
||||
++count;
|
||||
}
|
||||
if (num == board[i][c]) {
|
||||
++count;
|
||||
}
|
||||
}
|
||||
|
||||
int rof = r - r % 3;
|
||||
int cof = c - c % 3;
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
for (int j = 0; j < 3; ++j) {
|
||||
if (num == board[i + rof][j + cof]) {
|
||||
++count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (count != 3) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
*/
|
||||
|
||||
bool isValidSudoku(std::vector<std::vector<char>> &board) {
|
||||
std::unordered_map<char, int[9]> count[3];
|
||||
|
||||
for (int i = 0; i < 9; ++i) {
|
||||
for (int j = 0; j < 9; ++j) {
|
||||
char num = board[i][j];
|
||||
|
||||
if (num != '.') {
|
||||
if (count[0][num][i] != 0 || count[1][num][j] != 0 ||
|
||||
count[2][num][i / 3 * 3 + j / 3] != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
++count[0][num][i];
|
||||
++count[1][num][j];
|
||||
++count[2][num][i / 3 * 3 + j / 3];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
29
Medium/validate-binary-search-tree/solution.cpp
Normal file
29
Medium/validate-binary-search-tree/solution.cpp
Normal file
@@ -0,0 +1,29 @@
|
||||
struct TreeNode {
|
||||
int val;
|
||||
TreeNode *left;
|
||||
TreeNode *right;
|
||||
TreeNode() : val(0), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
|
||||
TreeNode(int x, TreeNode *left, TreeNode *right)
|
||||
: val(x), left(left), right(right) {}
|
||||
};
|
||||
|
||||
class Solution {
|
||||
private:
|
||||
bool isValidBST(TreeNode *root, int *minptr, int *maxptr) {
|
||||
if (root == nullptr) {
|
||||
return true;
|
||||
} else if ((maxptr != nullptr && *maxptr <= root->val) ||
|
||||
(minptr != nullptr && *minptr >= root->val)) {
|
||||
return false;
|
||||
} else {
|
||||
return isValidBST(root->left, minptr, &root->val) &&
|
||||
isValidBST(root->right, &root->val, maxptr);
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
bool isValidBST(TreeNode *root) {
|
||||
return isValidBST(root, nullptr, nullptr);
|
||||
}
|
||||
};
|
||||
26
Medium/zigzag-conversion/Solution.java
Normal file
26
Medium/zigzag-conversion/Solution.java
Normal file
@@ -0,0 +1,26 @@
|
||||
class Solution {
|
||||
public String convert(String str, int rows) {
|
||||
String[] zigzag = new String[rows];
|
||||
for (int i = 0; i < rows; i++)
|
||||
zigzag[i] = "";
|
||||
|
||||
for (int i = 0, j = 0, k = 0; i < str.length(); i++) {
|
||||
zigzag[j] += str.charAt(i);
|
||||
|
||||
if (j == rows - 1)
|
||||
k = 1;
|
||||
if (j == 0)
|
||||
k = 0;
|
||||
if (k == 1 && j > 0)
|
||||
j--;
|
||||
if (k == 0 && j < rows - 1)
|
||||
j++;
|
||||
}
|
||||
|
||||
String ret = "";
|
||||
for (int i = 0; i < rows; i++)
|
||||
ret += zigzag[i];
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
5
README.md
Normal file
5
README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# Preview
|
||||

|
||||
|
||||
# Description
|
||||
All the LeetCode problems I have solved.
|
||||
BIN
blob/preview.jpg
Normal file
BIN
blob/preview.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 694 KiB |
Reference in New Issue
Block a user