备战复试,每日三题Day17

备战复试,每日三题

题目一: 平衡括号字符串的最少插入次数

给你一个括号字符串 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];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值