贪心算法
- 调度问题:Jump Game I、Jump Game II
- 霍夫曼编码
- 0-1背包问题
Jump Game
Jump Game I
bool canJump(vector<int>& nums) {
if(nums.empty()) return true;
int farthest=nums[0];
for(int i=1;i<nums.size();i++){
if(i<=farthest && (i+nums[i])>=farthest)
farthest=i+nums[i];
}
return farthest>=nums.size()-1;
}
Jump Game II
int jump(vector<int>& nums){
if(nums.size()<=1) return 0;
int jump=1;
int cur=nums[0];
int maxS=nums[0];
for(int i=1;i<nums.size();i++){
cur=max(i+nums[i],cur);
if(i==nums.size()-1) return jump;
if(i==maxS){
jump++;
maxS=cur;
}
}
}
Meeting Room
Meeting Room I
bool canAttendMeetings(vector<Interval>& intervals) {
vector<pair<int, int> > changes;
for(auto i:intervals){
changes.push_back({i.start, 1});
changes.push_back({i.end, -1});
}
sort(changes.begin(),changes.end());
int times=0;int now=0;
for(auto i: changes){
times=max(times,now+=i.second);
if(times>1) return false;
}
return true;
}
Meeting Room II
int minMeetingRooms(vector<Interval>& intervals) {
vector<pair<int, int> >changes;
for(auto inter: intervals){
changes.push_back({inter.start,1});
changes.push_back({inter.end, -1});
}
sort(changes.begin(),changes.end());
int room=0,maxroom=0;
for(auto i:changes)
maxroom=max(maxroom,room+=i.second);
return maxroom;
}
Regular Expression
Regular Expression Matching
bool isMatch(string s, string p) {
int m=s.length(), n=p.length();
vector<vector<bool> > dp(m+1, vector<bool>(n+1, false));
dp[0][0]=true;
for (int i=0; i<=m; i++)
for (int j=1; j<=n; j++)
if (p[j-1] == '*') dp[i][j] = dp[i][j-2] || (i>0 && (s[i-1]==p[j-2]||p[j-2]=='.') && dp[i-1][j]);
else dp[i][j] = i>0 && dp[i-1][j-1] && (s[i-1]==p[j-1]||p[j-1]=='.');
return dp[m][n];
}
Wildcard Matching
bool isMatch(string s, string p) {
int m=s.length();
int n=p.length();
int i=0,j=0,asterick=-1,match=0;
while(i<m){
if(j<n && p[j]=='*'){
match = i;
asterick=j++;
}
else if(j<n && (s[i]==p[j] || p[j]=='?')){
i++;
j++;
}
else if(asterick>=0){
i=++match;
j=asterick+1;
}
else return false;
}
while(j<m && p[j]=='*') j++;
return j==n;
}
Gas Station
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int start = 0,tank = 0;
int sumGas=accumulate(gas.begin(),gas.end(),sumGas);
int sumCost=accumulate(cost.begin(),cost.end(),sumCost);
for (int i=0; i< gas.size(); i++) {
tank+=gas[i]-cost[i];
if (tank<0) {
start=i+1;
tank=0;
}
}
return sumGas<sumCost ? -1: start;
}
Candy
int candy(vector<int>& ratings) {
int len = ratings.size(), res = 0, i;
if(len>0){
vector<int> number(len,1);
for(i=1; i<len;++i)
if(ratings[i]>ratings[i-1])
number[i] = number[i-1]+1;
res = number[len-1];
for(i=len-2; i>=0;--i){
if(ratings[i]>ratings[i+1])
number[i] = max(number[i+1]+1,number[i]);
res+=number[i];
}
}
return res;
}