classSolution{public:intmaximumValue(vector<string>& vec){int res =0;for(auto s : vec){bool f =true;for(auto c : s){if(!isdigit(c)){
f =false;break;}}if(f) res =max(res,stoi(s));else res =max(res,(int)s.size());}return res;}};
T2 图中最大星和—签到
classSolution{public:
vector<int> g[100010];intmaxStarSum(vector<int>& val, vector<vector<int>>& ed,int k){int res = INT_MIN;int n = val.size();for(auto e : ed){
g[e[0]].push_back(e[1]);
g[e[1]].push_back(e[0]);}int sum;for(int i =0; i < n; i ++){
sum = val[i];sort(g[i].begin(), g[i].end(),[&](int a,int b){return val[a]> val[b];});for(int j =0; j <min(k,(int)g[i].size()); j ++){if(val[g[i][j]]<0)break;
sum += val[g[i][j]];}
res =max(res, sum);}return res;}};
青蛙过河 II—二分/贪心
贪心写法
classSolution{public:intmaxJump(vector<int>& a){int n = a.size();int res = a[1]- a[0];for(int i =0; i +2< n; i ++)
res =max(res, a[i +2]- a[i]);return res;}};
二分写法
classSolution{public:intmaxJump(vector<int>& a){int n = a.size();
vector<bool>st(n,0);
function<bool(int)> check =[&](int len)->bool{for(int i =0; i < n; i ++) st[i]=0;int j =0;for(int i =1; i < n; i ++){if(j +1< n && a[j +1]- a[j]> len)returnfalse;if(a[i]- a[j]> len){
j = i -1;
st[i -1]=true;}}if(a[n -1]- a[j]> len)returnfalse;
vector<int> vec;for(int i =0; i < n; i ++)if(!st[i]) vec.push_back(a[i]);
j =0;for(int i =1; i < vec.size(); i ++){if(j +1< vec.size()&& vec[j +1]- vec[j]> len)returnfalse;if(vec[i]- vec[j]> len){
j = i -1;
st[i -1]=true;}}if(vec.back()- vec[j]> len)returnfalse;returntrue;};int l =1, r =1e9;while(l < r){int mid = l + r >>1;if(check(mid)) r = mid;else l = mid +1;}return r;}};
T4 让数组不相等的最小总代价 — 思维
classSolution{public:longlongminimumTotalCost(vector<int>& nums1, vector<int>& nums2){int n = nums1.size();
vector<int> vec;for(int i =0; i < n; i ++)if(nums1[i]== nums2[i])
vec.push_back(i);int maxval =-1, maxcnt =0;
vector<int>cnt(n +1,0);for(auto i : vec){
cnt[nums1[i]]++;if(cnt[nums1[i]]> maxcnt){
maxcnt = cnt[nums1[i]];
maxval = nums1[i];}}for(int i =0; i < n; i++){if(maxcnt *2<= vec.size())returnsum(vec);if(nums1[i]== nums2[i])continue;if(nums1[i]!= maxval && nums2[i]!= maxval) vec.push_back(i);}if(maxcnt *2<= vec.size())returnsum(vec);return-1;}longlongsum(const vector<int>&vec){longlong res =0;for(auto x : vec) res += x;return res;}};