这周周赛发挥不佳
1. 重新排列数组
class Solution {
public:
vector<int> shuffle(vector<int>& nums, int n) {
vector<int> ans;
for(int i=0;i<n;i++)
{
ans.push_back(nums[i]);
ans.push_back(nums[i+n]);
}
return ans;
}
};
2. 数组中的k个最强值
无脑排序
int M;
bool cmp(int a, int b)
{
if(abs(a-M)==abs(b-M))
return a>b;
return abs(a-M)>abs(b-M);
}
class Solution {
public:
vector<int> getStrongest(vector<int>& arr, int k) {
sort(arr.begin(),arr.end());
int N = arr.size();
int mid = arr[(N-1)/2];
M = mid;
sort(arr.begin(),arr.end(),cmp);
vector<int> ans;
ans.resize(k);
for(int i=0;i<k;i++)
ans[i] = arr[i];
return ans;
}
};
双指针
class Solution {
public:
vector<int> getStrongest(vector<int>& arr, int k) {
sort(arr.begin(),arr.end());
int N = arr.size();
int mid = arr[(N-1)/2];
vector<int> ans;
ans.resize(k);
int ind = 0;
int le = 0;
int ri = arr.size()-1;
for(int i = 0; i < k; i++)
{
if(mid-arr[le]>arr[ri]-mid)
{
ans[ind++] = arr[le++];
}
else{
ans[ind++] = arr[ri--];
}
}
return ans;
}
};
3. 设计浏览器历史记录
谁能想到我竟然会花四十多分钟在这么简单的题上。。。
怀疑自己是不是题意理解错了
结果是
int N = pages.size();
for(int i=cur+1;i<N;i++)
pages.pop_back();
误写为:
呜呜呜呜,我真是个大傻逼,pages在pop(),size是会变的啊
for(int i=cur+1;i<pages.size();i++)
pages.pop_back();
class BrowserHistory {
public:
vector<string> pages;
int cur;
BrowserHistory(string homepage) {
pages.push_back(homepage);
cur = 0;
}
void visit(string url) {
int N = pages.size();
for(int i=cur+1;i<N;i++)
pages.pop_back();
pages.push_back(url);
cur = cur+1;
}
string back(int steps) {
if(cur-steps<0)
cur = 0;
else cur = cur - steps;
return pages[cur];
}
string forward(int steps) {
if(cur+steps>pages.size()-1)
cur = pages.size()-1;
else cur = cur+steps;
return pages[cur];
}
};
4. 给房子涂色 III
const int INF = 0x3f3f3f3f;
class Solution {
public:
int minCost(vector<int>& houses, vector<vector<int>>& cost, int m, int n, int target) {
vector<vector<vector<int>>> dp(m,vector<vector<int>>(n+1,vector<int>(target+1,INF)));
if(houses[0]!=0)
{
dp[0][houses[0]][1] = 0;
}
else
{
for(int j = 1;j <= n;j++)
{
dp[0][j][1] = cost[0][j-1];
}
}
for(int i=1;i<m;i++)
{
if(houses[i]==0)
{
for(int j1=1;j1<=n;j1++)
{
for(int k=1;k<=target;k++)
{
for(int j2=1;j2<=n;j2++)
{
if(j1==j2)
dp[i][j1][k] = min(dp[i][j1][k],dp[i-1][j2][k] + cost[i][j1-1]);
else
dp[i][j1][k] = min(dp[i][j1][k],dp[i-1][j2][k-1] + cost[i][j1-1]);
}
}
}
}
else{
//house[i]!=0 不能再刷
for(int k=1;k<=target;k++)
{
int j1 = houses[i];
for(int j2=1;j2<=n;j2++)
{
if(j1==j2)
dp[i][j1][k] = min(dp[i][j1][k], dp[i-1][j2][k]);
else
dp[i][j1][k] = min(dp[i][j1][k], dp[i-1][j2][k-1]);
}
}
}
}
int ans = INF;
for(int i = 1;i <= n; i++)
ans = min(ans,dp[m-1][i][target]);
if(ans == INF)
ans = -1;
return ans;
}
};