题目一 寻找数组的中心索引
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int sum1 = 0, sum2 = 0;
for(int j = 0; j < nums.size(); j ++) {
sum2 += nums[j];
}
for(int i = 0; i < nums.size(); i ++) {
if(sum1 == sum2 - sum1 - nums[i]) return i;
sum1 += nums[i] ;
}
return -1;
}
};
题目二 搜索插入位置
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int n = nums.size();
int left = 0, right = n - 1;
while(left < right) {
int mid = (left + right) >> 1;
if(nums[mid] < target) left = mid + 1;
else right = mid;
}
if(nums[left] < target) return left + 1;
return left;
}
};
题目三 合并区间
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
int n = intervals.size();
sort(intervals.begin(), intervals.end());
vector<vector<int>> res;
int i = 0;
res.push_back(intervals[i]);
for(int j = i + 1; j < n; j ++) {
int left = intervals[j][0];
int right = intervals[j][1];
if(res[i][1] >= left) res[i][1] = max(right, res[i][1]);
else {
i ++;
res.push_back(intervals[j]);
}
}
return res;
}
};
题目四 旋转矩阵
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
// 顺时针旋转90度 === 先左上角加右下角对角线翻转再中轴线垂直翻转即可
// 对角线翻转
int n = matrix.size();
for(int i = 0; i < n; i ++) {
for(int j = 0; j < i; j ++) {
swap(matrix[i][j], matrix[j][i]);
}
}
// 水平翻转
for(int i = 0; i < n; i ++) {
for(int j = 0; j < n / 2; j ++) {
swap(matrix[i][j], matrix[i][n - j - 1]);
}
}
}
};
题目五 零矩阵
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
vector<vector<int>> zeros;
int n = matrix.size();
int m = matrix[0].size();
int k = 0;
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
{
if(matrix[i][j] == 0) {
zeros.push_back({i, j});
k ++;
}
}
for(int i = 0; i < k ; i ++) {
for(int j = 0; j < m; j ++) {
matrix[zeros[i][0]][j] = 0;
}
}
for(int i = 0; i < k ; i ++) {
for(int j = 0; j < n; j ++) {
matrix[j][zeros[i][1]] = 0;
}
}
}
};
题目六 对角线遍历
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
int n = mat.size();
int m = mat[0].size();
vector<int> result;
for(int i = 0, index = 0; i < n + m - 1; i ++) {
if(i % 2 == 0) {
for(int j = min(i, n - 1); j >= max(i - m + 1, 0); j --){
result.push_back(mat[j][i - j]);
}
}else {
for(int j = max(i - m + 1, 0); j <= min(i ,n - 1); j ++) {
result.push_back(mat[j][i - j]);
}
}
}
return result;
}
};
题目七 最长公共前缀
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string res;
res = strs[0];
int n = strs.size();
for(int i = 1;i < n; i ++)
for(int j = 0; j < res.size(); j ++){
if(strs[i][j] != res[j]) {
res.erase(j);
}
}
return res;
}
};
题目八 最长回文子串
class Solution {
public:
string longestPalindrome(string s) {
// int n = s.length();
// if(n < 2){
// return s;
// }
// //动态规划
// vector<vector<int>> dp(n, vector<int>(n));
// int maxlen = 1;
// int begin = 0;
// // 初始化所有一个的都是回文串
// for(int i = 0; i < n; i ++) dp[i][i] = true;
// for(int len = 2; len <= n; len ++) {
// for(int i = 0; i < n; i ++){
// int j = i + len - 1;
// if(j >= n) break;
// if(s[i] != s[j]){
// dp[i][j] = false;
// }else {
// if(j - i >= 3){
// dp[i][j] = dp[i + 1][j - 1];
// }else {
// dp[i][j] = true;
// }
// }
// if(dp[i][j] && len > maxlen){
// maxlen = len;
// begin = i;
// }
// }
// }
// return s.substr(begin, maxlen);
// 中心扩散法
int start = 0, end = 0;
for(int i = 0; i < s.size(); i ++) {
auto [left1, right1] = expandAroundCenter(s, i, i);
auto [left2, right2] = expandAroundCenter(s, i, i + 1);
if(right1 - left1 > end - start){
start = left1;
end = right1;
}
if(right2 - left2 > end - start) {
start = left2;
end = right2;
}
}
return s.substr(start, end - start + 1);
}
pair<int,int> expandAroundCenter(string s, int left, int right) {
while(left >= 0 && right < s.size() && s[left] == s[right]) {
left --;
right ++;
}
return {left + 1, right - 1};
}
};
题目九 翻转字符串里的单词
class Solution {
public:
string reverseWords(string s) {
// 双指针
int m = s.size() - 1;
while(s[m] == ' ' && m > 0) m --;
string res;
int n = m;
while(m >= 0){
while( m >= 0&&s[m] != ' ' ) m --;
res += s.substr(m + 1, n - m) + " ";
while(m >= 0 && s[m] == ' ' ) m --;
n = m;
}
return res.substr(0, res.size() - 1);
}
};
题目十 实现strStr()
KMP算法 看题解和分析之前有过总结
class Solution {
public:
int strStr(string haystack, string needle) {
int n = haystack.size();
int m = needle.size();
if (m == 0) return 0; // 如果 needle 是空串,返回 0
// 构建 next 数组
vector<int> next(m, 0);
for (int i = 1, j = 0; i < m; i++) {
while (j > 0 && needle[i] != needle[j]) {
j = next[j - 1]; // 回退 j 到上一个最长前后缀的位置
}
if (needle[i] == needle[j]) {
j++; // 匹配成功,增加 j
}
next[i] = j; // 更新 next 数组
}
// 主匹配过程
for (int i = 0, j = 0; i < n; i++) {
while (j > 0 && haystack[i] != needle[j]) {
j = next[j - 1]; // 回退 j
}
if (haystack[i] == needle[j]) {
j++; // 匹配成功,增加 j
}
if (j == m) { // 完全匹配
return i - m + 1; // 返回匹配的起始位置
}
}
return -1; // 如果没有匹配,返回 -1
}
};
题目十一 反转字符串
class Solution {
public:
void reverseString(vector<char>& s) {
int i = 0, j = s.size() - 1;
while(i < j) {
swap(s[i ++], s[j --]);
}
}
};
题目十二 数组拆分
class Solution {
public:
int arrayPairSum(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(), nums.end());
int res = 0;
for(int i = 0; i < n; i += 2) {
res += nums[i];
}
return res;
}
};
题目十三 两数之和|| - 输入有序数组
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int n = numbers.size();
int i = 0, j = n - 1;
while(i < j){
if(numbers[i] + numbers[j] == target){
return {i + 1, j + 1};
}
if(numbers[i] + numbers[j] < target){
i ++;
}
if(numbers[i] + numbers[j] > target){
j --;
}
}
return {};
}
};
题目十四 移除元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int slow = 0, fast = 0;
while(fast < n) {
if(nums[fast] != val) {
nums[slow ++] = nums[fast];
}
fast ++;
}
return slow;
}
};
题目十五 最大连续1的个数
class Solution {
public:
int findMaxConsecutiveOnes(vector<int>& nums) {
int n = nums.size();
int maxLenth = 0;
int i = 0, j = 0;
while(j < n) {
if(nums[j] == 1) {
j ++;
}else {
maxLenth = max(maxLenth, j - i);
j ++;
i = j;
}
}
maxLenth = max(maxLenth, j - i);
return maxLenth;
}
};
题目十六 长度最小的子数组
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n = nums.size();
int i = 0, j = 0;
int sum = 0;
int minLenth = n + 1;
while(j < n) {
sum += nums[j];
while(sum >= target){
minLenth = min(minLenth, j - i + 1);
sum -= nums[i ++];
}
j ++;
}
if(minLenth == n + 1) return 0;
return minLenth;
}
};