招商银行信用卡
1. 两数之和
这道题通过哈希查找 t a r g e r − n u m s [ i ] targer-nums[i] targer−nums[i]是否存在即可
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash;
for (int i = 0; i < nums.size(); i ++ )
{
auto t = hash.count(target - nums[i]);
if(t)
{
return {hash[target - nums[i]], i};
}
else hash[nums[i]] = i;
}
return {};
}
};
124. 二叉树中的最大路径和
直接DFS,每次更新包含第 i i i个结点子树路径和最大值,递归函数返回左右儿子中路径和最大值
/**
* Definition for a binary tree node.
* 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:
int ans;
int maxPathSum(TreeNode* root) {
ans = -1e9;
dfs(root);
return ans;
}
int dfs(TreeNode* root) {
if (!root) return 0;
int l = max(0, dfs(root->left)), r = max(0, dfs(root->right));
ans = max(ans, root->val + l + r);
return root->val + max(l, r);
}
};
199. 二叉树的右视图
这道题DFS同时用一个参数 d e p t h depth depth同时维护遍历到第几层,如果这一层中我们还没有放数,我们优先放右子树,如果右子树没有再放左子树即可。
/**
* Definition for a binary tree node.
* 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:
vector<int> ans;
vector<int> rightSideView(TreeNode* root) {
dfs(root, 1);
return ans;
}
void dfs(TreeNode* root, int depth) {
if (!root) return ;
if (depth > ans.size())
ans.push_back(root->val);
dfs(root->right, depth + 1);
dfs(root->left, depth + 1);
}
};
编程能力
110. 平衡二叉树
这道题也是开一个全局变量判断是否是平衡二叉树,如果已经判断不是平衡二叉树可以及时返回,减少遍历时间。递归返回每个子树深度,比较左子树和右子树深度如果超过1那么标记flag=false
/**
* Definition for a binary tree node.
* 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 flag = true;
bool isBalanced(TreeNode* root) {
dfs(root);
return flag;
}
int dfs(TreeNode* root) {
if (!flag) return 0;
if (!root) return 0;
int l = dfs(root->left), r = dfs(root->right);
if (abs(l - r) > 1) flag = false;
return max(l, r) + 1;
}
};
459. 重复的子字符串
方法一:枚举
枚举重复子串的长度不断匹配是否满足
时间复杂度: O ( n l o g n O(nlogn O(nlogn
class Solution {
public:
bool repeatedSubstringPattern(string s) {
int n = s.size();
for (int len = 1; len < n; len ++ ) {
if (n % len) continue;
string str = s.substr(0, len);
bool flag = false;
int k = len;
while (k < n && s.substr(k, len) == str) k += len;
if (k == n) return true;
}
return false;
}
};
方法二:思维
扩展s变成2倍,查找只要在原串开头和结尾另一个地方发现重复的原串,说明出现了循环节,这方法确实不好想
class Solution {
public:
bool repeatedSubstringPattern(string s) {
return (s + s).find(s, 1) != s.size();
}
};