备战复试,每日三题
题目一: 平衡括号字符串的最少插入次数
给你一个括号字符串 s ,它只包含字符 ‘(’ 和 ‘)’ 。一个括号字符串被称为平衡的当它满足:
任何左括号 ‘(’ 必须对应两个连续的右括号 ‘))’ 。
左括号 ‘(’ 必须在对应的连续两个右括号 ‘))’ 之前。
比方说 “())”, “())(())))” 和 “(())())))” 都是平衡的, “)()”, “()))” 和 “(()))” 都是不平衡的。
你可以在任意位置插入字符 ‘(’ 和 ‘)’ 使字符串平衡。
请你返回让 s 平衡的最少插入次数。
示例 1:
输入:s = “(()))”
输出:1
解释:第二个左括号有与之匹配的两个右括号,但是第一个左括号只有一个右括号。我们需要在字符串结尾额外增加一个 ‘)’ 使字符串变成平衡字符串 “(())))” 。
示例 2:
输入:s = “())”
输出:0
解释:字符串已经平衡了。
示例 3:
输入:s = “))())(”
输出:3
解释:添加 ‘(’ 去匹配最开头的 ‘))’ ,然后添加 ‘))’ 去匹配最后一个 ‘(’ 。
示例 4:
输入:s = “((((((”
输出:12
解释:添加 12 个 ‘)’ 得到平衡字符串。
示例 5:
输入:s = “)))))))”
输出:5
解释:在字符串开头添加 4 个 ‘(’ 并在结尾添加 1 个 ‘)’ ,字符串变成平衡字符串 “(((())))))))” 。
提示:
1 <= s.length <= 10^5
s 只包含 ‘(’ 和 ‘)’ 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-insertions-to-balance-a-parentheses-string
class Solution {
public:
int minInsertions(string s) {
//one需要一个右括号的情况如"()"这种情况,则对右括号的需求量为1个
//two记录对右括号的需求量为2个的情况,如(())这种,需要2个
int one=0,two=0;
for(char c:s){
//一个左括号需要两个右括号来匹配
if(c=='('){
two+=2;
//如果当前所需要的右括号为奇数个,则需要
if(two%2==1){
//将对右括号的需求量为奇数个,分为需要一个右括号和偶数个右括号(记住two最后要记录偶数)
one++;
two--;
}
}
//当前为右括号,则所需的右括号数减一
if(c==')'){
two--;
//当前的右括号太多,需要增加左括号,又一个左括号对应两个右括号,则还需要添加一个右括号
if(two==-1){
one++;
two=1;
}
}
}
return one+two;
}
};
题目二: 合并二叉树
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:
输入:
Tree 1 Tree 2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7
输出:
合并后的树:
3
/
4 5
/ \ \
5 4 7
注意: 合并必须从两个树的根节点开始。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-binary-trees
/**
* 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:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(root1==nullptr) return root2;
if(root2==nullptr) return root1;
root1->val=root1->val+root2->val;
root1->left=mergeTrees(root1->left,root2->left);
root1->right=mergeTrees(root1->right,root2->right);
return root1;
}
};
题目三: 多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:[3,2,3]
输出:3
示例 2:
输入:[2,2,1,1,1,2,2]
输出:2
进阶:
尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element
class Solution {
public:
int majorityElement(vector<int>& nums) {
int count=1;
//先排序
sort(nums.begin(),nums.end());
int n=nums[0],m=nums.size();
//判断当前元素出现的次数,若超过nums.size()的一半,则其为多数元素
for(int i=1;i<m;i++){
if(nums[i]==n){
count++;
if(count>nums.size()/2){
return nums[i];
}
//记录下个元素,并判断
}else{
n=nums[i];
}
}
return nums[m-1];
}
};