春节刷题day16:LeetCode
300. 最长递增子序列
5. 最长回文子串
剑指 Offer 04. 二维数组中的查找
剑指 Offer 14- I. 剪绳子
1143. 最长公共子序列
1、300. 最长递增子序列
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int len = nums.size();
int a[len], tot = 0;
a[tot++] = nums[0];
for(int i = 1; i < len; i++){
if(nums[i] > a[tot - 1]) a[tot++] = nums[i];
else{
*lower_bound(a, a + tot, nums[i]) = nums[i];
}
}
return tot;
}
};
2、5. 最长回文子串
class Solution {
public:
int checka(int pos, string s){
for(int i = pos; i >= 0; i--){
int r = pos + 2 + pos - i;
if(r >= s.size()) return i + 1;
if(s[i] == s[pos + 2 + pos - i]) continue;
else return i + 1;
}
return 0;
}
int checkb(int pos, string s){
for(int i = pos; i >= 0; i--){
int r = pos + 1 + pos - i;
if(r >= s.size()) return i + 1;
if(s[i] == s[pos + 1 + pos - i]) continue;
else{
return i + 1; break;
}
}
return 0;
}
string longestPalindrome(string s) {
int len = s.size(), l, r;
int k = 1, pos;
string ans;
ans = s[0];
for(int i = 0; i < len; i++){
pos = checka(i - 1, s);
if(2 * (i - pos) + 1 > k){
k = 2 * (i - pos) + 1;
ans = s.substr(pos, k);
}
pos = checkb(i, s);
if(2 * (i - pos + 1) > k){
k = 2 * (i - pos + 1);
ans = s.substr(pos, k);
}
}
return ans;
}
};
3、剑指 Offer 04. 二维数组中的查找
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
int l = matrix.size();
if(!l) return false;
int r = matrix[0].size();
int i = 0, j = r - 1;
while(i < l && j >= 0){
if(target > matrix[i][j]) i++;
else if(target < matrix[i][j]) j--;
else return true;
}
return false;
}
};
4、剑指 Offer 14- I. 剪绳子
class Solution {
public:
int cuttingRope(int n) {
if(n == 2) return 1;
else if(n == 3) return 2;
else if(n == 4) return 4;
else if(n == 5) return 6;
else{
int k = n % 3;
if(!k) return (int)pow(3, n / 3);
else if(k == 1) return (int)pow(3, n / 3 - 1) * 4;
else return (int)pow(3, n / 3) * 2;
}
return 0;
}
};
5、1143. 最长公共子序列
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
int len1 = text1.size(); int len2 = text2.size();
int a[len1 + 3][len2 + 3];
memset(a, 0, sizeof a);
for(int i = 1; i <= len1; i++){
for(int j = 1; j <= len2; j++){
if(text1[i - 1] == text2[j - 1]) a[i][j] = a[i - 1][j - 1] + 1;
else a[i][j] = max(a[i - 1][j], a[i][j - 1]);
}
}
return a[len1][len2];
}
};
2021/2/22完结。