LeetCode热题100刷题14:32. 最长有效括号、72. 编辑距离、22. 括号生成、31. 下一个排列、136. 只出现一次的数字、169. 多数元素、75. 颜色分类

32. 最长有效括号

在这里插入图片描述

class Solution {
public:
    int longestValidParentheses(string s) {
        stack<int> stk;
        vector<int> dp(s.size()+1,0);
        int res = 0;
        for(int i=0;i<s.size();i++) {
            if(s[i]=='(') {
                stk.push(i);
                dp[i+1]=0;
            }
            else {
                if(!stk.empty()) {
                    int leftIndex = stk.top();
                    stk.pop();
                    int len = i-leftIndex+1+dp[leftIndex];
                    dp[i+1] = len;
                    res = max(res,dp[i+1]);
                }
                else {
                    dp[i+1] = 0;
                }
            }
        }
        return res;
    }
};

72. 编辑距离

在这里插入图片描述

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector<vector<int>> dp(word1.size()+1,vector<int>(word2.size()+1,0));
        int n1 = word1.size();
        int n2 = word2.size();
        for(int i=0;i<=n1;i++) {
            dp[i][0] = i;
        }
        for(int j=0;j<=n2;j++) {
            dp[0][j]=j;
        }
        for(int i=1;i<=n1;i++) {
            for(int j=1;j<=n2;j++) {
                if(word1[i-1] == word2[j-1]) {
                    dp[i][j] = dp[i-1][j-1];
                }
                else {
                    dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j],dp[i][j-1]) )+1;
                }
            }
        }
        return dp[n1][n2];
    }
};

22. 括号生成

在这里插入图片描述

class Solution {
public:
    string str;
    vector<string> res;
    stack<char> stk;
    void backtracking(int n,int left,int right) {
        if(right == 0 && left==0) {
            res.push_back(str);
            return;
        }
        if(left > right)
            return;
        if(right<0 || left<0)
            return;
        str.push_back('(');
        backtracking(n,left-1,right);
        str.pop_back();

        str.push_back(')');
        backtracking(n,left,right-1);
        str.pop_back();
    }
    vector<string> generateParenthesis(int n) {
        if(n==0)
            return {};
        backtracking(n,n,n);
        return res;
    }
};

31. 下一个排列

在这里插入图片描述

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        if(nums.size()<=1)
            return;
        int i = nums.size()-2;
        while(i>=0 && nums[i] >= nums[i+1])
            i--;
        
        if(i>=0) {
            int j=nums.size()-1;
            while(j>=0 && nums[i] >= nums[j])
                j--;
            swap(nums[i],nums[j]);
        }
        reverse(nums.begin()+i+1,nums.end());
    }
};

136. 只出现一次的数字

加粗样式
按位异或操作 ^
相同元素异或为0,不同元素 与0异或为其自身, a^0=a
res^=nms[i],最后的res就是只出现一次的数字
3^4 = 7
011^100=111
7^4 = 3
111^100=011

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int res = 0;
        for(int n:nums) {
            res^=n;
        }
        return res;
    }
};

169. 多数元素

借助unordered_map记录各元素出现的次数,使用res记录结果

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        unordered_map<int,int> umap;
        int max_count = 0;
        int res=0;
        for(int i=0;i<nums.size();i++) {
            umap[nums[i]]++;
            if(umap[nums[i]] > max_count) {
                max_count = umap[nums[i]];
                res = nums[i];
            }
        }
        return res;
    }
};

75. 颜色分类

在这里插入图片描述

原地实现,牺牲一点时间,使用冒泡排序来实现012颜色分类(因为冒泡代码简单,还没复习排序算法 目前只能回想起来冒泡排序)

class Solution {
public:
    //冒泡排序
    void sortColors(vector<int>& nums) {
        int length = nums.size();
        for(int j=0;j<length;j++) {
            for(int i=j+1;i<length;i++) {
                if(nums[j] > nums[i]) {
                    swap(nums[j],nums[i]);
                    // int temp = nums[j];
                    // nums[j] = nums[i];
                    // nums[i] = temp;
                }
            }
        }
        
    }
};
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值