6. 盛水最多的容器
双指针
class Solution {
public:
int maxArea(vector<int>& height) {
int n = height.size();
int l = 0, r = n - 1, res = 0;
while (l < r) {
res = max(res, min(height[l], height[r]) * (r - l));
if (height[l] > height[r]) {
r -- ;
}
else {
l ++ ;
}
}
return res;
}
};
7. 三数之和
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;
}
};
8. 电话号码的字母组合
class Solution {
public:
vector<string> res;
string strs[10] = {
"","","abc","def",
"ghi","jkl","mno",
"pqrs","tuv","wxyz"
};
vector<string> letterCombinations(string digits) {
if (digits.empty()) return res;
dfs(digits, 0, "");
return res;
}
void dfs(string& digits, int u, string str) {
if (u == digits.size()) res.push_back(str);
else {
for (auto c : strs[digits[u] - '0'])
dfs(digits, u + 1, str + c);
}
}
};
9. 删除链表的倒数第n个结点
/**
* Definition for singly-linked list.
* 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* removeNthFromEnd(ListNode* head, int k) {
auto dummy = new ListNode(-1);
dummy -> next = head;
auto l = dummy, r = head;
for (int i = 0; i < k; i ++ ) r = r -> next;
while (r) {
r = r -> next;
l = l -> next;
}
l->next = l->next->next;
return dummy->next;
}
};
10. 有效的括号
技巧
asc码差值 < = 2 <=2 <=2
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for (auto& c : s) {
if (c == '(' || c == '[' || c == '{') stk.push(c);
else {
if (stk.size() && abs(stk.top() - c) <= 2) stk.pop();
else return false;
}
}
return stk.empty();
}
};