300题纪念
不知不觉,来到了300题,距离最终目标还有700题,一路以来收获还是很大的,今天是第78天,也就是说每天我会写3.846道力扣题,那么还有182天,我就能实现自己的目标了,继续加油!
646. 最长数对链
代码实现(自解)
class Solution {
public:
int findLongestChain(vector<vector<int>>& pairs) {
sort(pairs.begin(), pairs.end());
int n = pairs.size();
vector<int> dp(n, 1);
dp[0] = 1;
int ans = 1;
for (int i = 1; i < n; i++) {
auto left = pairs[i][0];
for (int j = i - 1; j >= 0; j--) {
if (pairs[j][1] < left) {
dp[i] = max(dp[i], dp[j] + 1);
ans = max(dp[i], ans);
}
}
}
return ans;
}
};
347. 前 K 个高频元素
代码实现(自解)
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int, int> myMap;
for (int &num : nums) myMap[num]++;
vector<pair<int, int>> arr;
for (auto it = myMap.begin(); it != myMap.end(); it++) {
arr.push_back({it->second, it->first});
}
sort(arr.begin(), arr.end(), [](const pair<int, int> &a,
const pair<int, int> &b) {
return a.first >= b.first;
});
vector<int> ans;
for (int i = 0; i < k; i++) {
ans.push_back(arr[i].second);
}
return ans;
}
};
451. 根据字符出现频率排序
代码实现(自解)
class Solution {
public:
string frequencySort(string s) {
map<char, int> myMap;
for (auto &num : s) myMap[num]++;
vector<pair<int, char>> arr;
for (auto it = myMap.begin(); it != myMap.end(); it++) {
arr.push_back({it->second, it->first});
}
sort(arr.begin(), arr.end(), [](const pair<int, char> &a,
const pair<int, char> &b) {
return a.first > b.first;
});
string ans = "";
for (int i = 0; i < arr.size(); i++) {
cout << arr[i].first << " " << arr[i].second << endl;
for (int j = 0; j < arr[i].first; j++)
ans.insert(ans.end(), arr[i].second);
}
return ans;
}
};
973. 最接近原点的 K 个点
代码实现(自解)
class Solution {
public:
vector<vector<int>> kClosest(vector<vector<int>>& points, int k) {
sort(points.begin(), points.end(), [](const vector<int>& a,
const vector<int>& b) {
return a[0] * a[0] + a[1] * a[1] < b[0] * b[0] + b[1] * b[1];
});
return {points.begin(), points.begin() + k};
}
};
733. 图像渲染
代码实现(自解)
class Solution {
public:
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {
queue<int> myQueue;
myQueue.push(sr * 50 + sc);
int m = image.size(), n = image[0].size();
int pos = -1, r = -1, c = -1;
int preColor = image[sr][sc];
image[sr][sc] = -1;
while (!myQueue.empty()) {
pos = myQueue.front();
myQueue.pop();
r = pos / 50;
c = pos % 50;
// 上
if (r - 1 >= 0 && image[r - 1][c] == preColor) {
image[r - 1][c] = -1;
myQueue.push((r - 1) * 50 + c);
}
// 下
if (r + 1 < m && image[r + 1][c] == preColor) {
image[r + 1][c] = -1;
myQueue.push((r + 1) * 50 + c);
}
// 左
if (c - 1 >= 0 && image[r][c - 1] == preColor) {
image[r][c - 1] = -1;
myQueue.push(r * 50 + c - 1);
}
// 右
if (c + 1 < n && image[r][c + 1] == preColor) {
image[r][c + 1] = -1;
myQueue.push(r * 50 + c + 1);
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
image[i][j] = (image[i][j] == -1 ? color : image[i][j]);
// cout << i << " " << j << endl;
}
}
return image;
}
};
200. 岛屿数量
代码实现(自解)
class Solution {
private:
int m, n;
public:
void dfs(vector<vector<char>>& grid, int i, int j) {
grid[i][j] = '0';
// 上
if (i - 1 >= 0 && grid[i - 1][j] == '1') dfs(grid, i - 1, j);
// 下
if (i + 1 < m && grid[i + 1][j] == '1') dfs(grid, i + 1, j);
// 左
if (j - 1 >= 0 && grid[i][j - 1] == '1') dfs(grid, i, j - 1);
// 右
if (j + 1 < n && grid[i][j + 1] == '1') dfs(grid, i, j + 1);
}
int numIslands(vector<vector<char>>& grid) {
m = grid.size(), n = grid[0].size();
int ans = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == '1') {
ans++;
dfs(grid, i, j);
}
}
}
return ans;
}
};