class Solution {
public:vector<int> numberGame(vector<int>& nums) {sort(nums.begin(),nums.end());vector<int> ans;for (int i = 0;i < nums.size();i ++) if (i&1)ans.push_back(nums[i-1]);else ans.push_back(nums[i+1]);return ans;}
};
移除栅栏得到的正方形田地的最大面积 4
思路 - 思路 细节题,把所有的空隙全考虑一遍。
代码
class Solution {
public:int maximizeSquareArea(int m, int n, vector<int>& hFences, vector<int>& vFences) {long long ans = 0;sort(hFences.begin(),hFences.end());sort(vFences.begin(),vFences.end());int hlen = hFences.size(),vlen = vFences.size();int x = 0;vector<int> hc,vc;hc.push_back(m-1);for (int i = 0;i < hlen;i ++) {hc.push_back(hFences[i]-1);for (int j = i + 1;j < hlen;j ++) hc.push_back(hFences[j]-hFences[i]);hc.push_back(m-hFences[i]);} vc.push_back(n-1);for (int i = 0;i < vlen;i ++) {vc.push_back(vFences[i]-1);for (int j = i + 1;j < vlen;j ++) vc.push_back(vFences[j]-vFences[i]);vc.push_back(n-vFences[i]);}sort(hc.begin(),hc.end());sort(vc.begin(),vc.end());int l = hc.size()-1,r = vc.size()-1;while (l >= 0&&r >= 0&&hc[l] != vc[r]) {if (hc[l] > vc[r]) l --;else r --;}if (l >= 0 && r >= 0) {ans = 1ll*hc[l]*hc[l];return ans%(1000000007);} else {return -1;}}
};
转换字符串的最小成本 I 5
题目 - 示例
思路 最短路,先处理26个字母之间的最短路。这样复杂度就是O(262626);
代码
classSolution{public:longlongminimumCost(string source, string target, vector<char>&original, vector<char>&changed, vector<int>&cost){int dis[26][26];memset(dis,0x3f,sizeof(dis));for(int i =0; i <26; i++){dis[i][i]=0;}for(int i =0; i < cost.size(); i++){int x = original[i]-'a';int y = changed[i]-'a';dis[x][y]=min(dis[x][y], cost[i]);}for(int k =0; k <26; k++){for(int i =0; i <26; i++){for(int j =0; j <26; j++){dis[i][j]=min(dis[i][j], dis[i][k]+ dis[k][j]);}}}longlong ans =0;for(int i =0; i < source.length(); i++){int d = dis[source[i]-'a'][target[i]-'a'];if(d ==0x3f3f3f3f){return-1;}ans += d;}return ans;}};
转换字符串的最小成本 II 6
题意
思路
代码
int f[200005][26], g[200005];classSolution{public:longlongminimumCost(string source, string target, vector<string>& original, vector<string>& changed, vector<int>& cost){int n = original.size()*2;longlong d[n][n];memset(d,0x3f,sizeof(d));longlong inf =0x3f3f3f3f3f3f3f3fll;int p =1;memset(f[0],-1,sizeof(f[0]));g[0]=-1;auto insert =[&](string& s){int cur =0;for(char c : s){if(f[cur][c-'a']==-1){f[cur][c-'a']= p;memset(f[p],-1,sizeof(f[p]));g[p]=-1;p++;}cur = f[cur][c-'a'];}return cur;};int m =0;for(int i =0; i < original.size();++i){int from =insert(original[i]), to =insert(changed[i]);if(g[from]==-1)g[from]= m++;if(g[to]==-1)g[to]= m++;d[g[from]][g[to]]=min(d[g[from]][g[to]],(longlong)cost[i]);}for(int k =0; k < m;++k){for(int i =0; i < m;++i){for(int j =0; j < m;++j){d[i][j]=min(d[i][j], d[i][k]+ d[k][j]);}}}longlong dp[source.size()+1];dp[source.size()]=0;for(int i = source.size()-1; i >=0;--i){dp[i]= inf;if(source[i]== target[i])dp[i]= dp[i+1];for(int j = i, cur1 =0, cur2 =0; j < source.size();++j){cur1 = f[cur1][source[j]-'a'];cur2 = f[cur2][target[j]-'a'];if(cur1 ==-1|| cur2 ==-1)break;if(g[cur1]!=-1&& g[cur2]!=-1)dp[i]=min(dp[i], d[g[cur1]][g[cur2]]+ dp[j+1]);}}if(dp[0]>= inf)return-1;return dp[0];}};