LeetCode 11. 盛最多水的容器
class Solution {
public:
int maxArea(vector<int>& height) {
int res = 0;
for(int i=0,j = height.size()-1;i<j;) {
res = max(res, min(height[i],height[j])*(j-i));
if(height[i]>height[j]) j--;
else i++;
}
return res;
}
};
LeetCode 12. 整数转罗马数字
class Solution {
public:
string intToRoman(int num) {
int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
string signs[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
string res;
for(int i=0;i<13;i++) {
while(num>=values[i]) {
num-=values[i];
res+=signs[i];
}
}
return res;
}
};
LeetCode 13. 罗马数字转整数
class Solution {
public:
int romanToInt(string s) {
unordered_map<char, int> hash;
hash['I'] = 1, hash['V'] = 5;
hash['X'] = 10, hash['L'] = 50;
hash['C'] = 100, hash['D'] = 500;
hash['M'] = 1000;
int res = 0;
for (int i = 0; i < s.size(); i ++ ) {
if (i + 1 < s.size() && hash[s[i]] < hash[s[i + 1]])
res -= hash[s[i]];
else
res += hash[s[i]];
}
return res;
}
};
LeetCode 14. 最长公共前缀
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string res;
if(strs.empty()) return res;
for(int i=0;;i++) {
if(i>=strs[0].size()) return res;
char c = strs[0][i];
for(auto str : strs) {
if(str.size()<i||str[i]!=c)
return res;
}
res+=c;
}
return res;
}
};
LeetCode 15. 三数之和
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int> > res;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++) {
if(i&&nums[i]==nums[i-1]) continue;
for(int j = i+1, k = nums.size()-1; j<k ; j++) {
if(j > i+1 && nums[j] == nums[j-1]) continue;
while(j < k-1 && nums[i] + nums[j] + nums[k-1] >= 0) k--;
if(nums[i] + nums[j] + nums[k] == 0) {
res.push_back({nums[i],nums[j],nums[k]});
}
}
}
return res;
}
};
LeetCode 16. 最接近的三数之和
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
pair<int,int> res(INT_MAX,INT_MAX);
for(int i=0;i<nums.size();i++)
for(int j = i+1, k = nums.size()-1; j<k ; j++) {
while(j<k-1 && nums[i]+nums[j]+nums[k-1]>=target) k--;
int sum = nums[i] + nums[j] + nums[k];
res = min(res, make_pair(abs(sum-target),sum));
if(j < k-1) {
sum = nums[i] + nums[j] + nums[k-1];
res = min(res, make_pair(targeat-sum,sum));
}
}
return res.second;
}
};
LeetCode 17. 电话号码的字母组合
class Solution {
public:
vector<string> ans;
string strs[10] = {
"", "", "abc", "def",
"ghi", "jkl", "mno",
"pqrs", "tuv", "wxyz"
};
vector<string> letterCombinations(string digits) {
if(digits.empty()) return ans;
dfs(digits,0,"");
return ans;
}
void dfs(string &digits, int u, string path) {
if(u == digits.size()) ans.push_back(path);
else {
for(auto c : strs[digits[u]-'0'])
dfs(digits, u+1, path+c);
}
}
};
LeetCode 18. 四数之和
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
vector<vector<int>> res;
for (int i = 0; i < nums.size(); i ++ ) {
if (i && nums[i] == nums[i - 1]) continue;
for (int j = i + 1; j < nums.size(); j ++ ) {
if (j > i + 1 && nums[j] == nums[j - 1]) continue;
for (int k = j + 1, u = nums.size() - 1; k < u; k ++ ) {
if (k > j + 1 && nums[k] == nums[k - 1]) continue;
while (u - 1 > k && (long long)nums[i] + (long long)nums[j] + (long long)nums[k] + (long long)nums[u - 1] >= target) u -- ;
if ((long)nums[i] + (long)nums[j] + (long long)nums[k] + (long long)nums[u] == target) {
res.push_back({nums[i], nums[j], nums[k], nums[u]});
}
}
}
}
return res;
}
};
LeetCode 19. 删除链表的倒数第N个节点
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int k) {
auto dummy = new ListNode(-1);
dummy->next = head;
int n = 0;
for(auto p = dummy; p ; p = p->next) n++;
auto p = dummy;
for(int i=0;i<n-k-1;i++) p = p->next;
p->next = p->next->next;
return dummy->next;
}
};
LeetCode 20. 有效的括号
class Solution {
public:
bool isValid(string s) {
stack<char> st;
for(auto c : s) {
if(c == '(' || c == '[' || c == '{')
st.push(c);
else {
if(st.size() && abs(st.top() - c) <= 2) st.pop();
else return false;
}
}
return st.empty();
}
};c