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;
}
}
}
}
};