leetcode 每日打卡
附上kuangbin大佬话激励自己:
人一我百,人十我万,追逐青春的梦想,怀着自信的心,永不放弃!
2020.2.10
记录下来自己做题时得思路,并不一定是最优解
#406. 根据身高重建队列
class Solution {
public:
vector<vector<int>> ans;
// 对于二维容器的排序使用lambda表达式会更快且节省内存
static bool cmp(vector<int> a, vector<int> b)
{
return a[0]>b[0] || (a[0]==b[0] && a[1]<b[1]);
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(),people.end(),cmp);
/* lambda表达式排序
sort(people.begin(),people.end(),[](const auto& a,const auto& b){
return a[0]>b[0] || (a[0]==b[0] && a[1]<b[1]);
});
*/
for(auto it : people)
{
cout << it[0] << " " << it[1] << endl;
ans.insert(ans.begin() + it[1],it);
}
return ans;
}
};
思路分析: 由于是贪心问题 ,我们可以将队列按照身高非递增排列,如果身高相同按照其前面所排人数个数降序排列
根据的提示我们可以知道,我们先安排身高较高的人,将它放置在与 k 值相等的索引上;再安排身高比之前矮的人,同样的将它放置在与 k 值相等的索引上。
Tips:
C++ 中vector容器的insert函数可以将元素插入在该容器中
vector.insert(插入位置,待插入元素)
例如:
ans : vector<vector<int>>
ans.insert(ans.begin() + it[1],it);
res : vector<int>
res.insert(5,2);
#122. 买卖股票的最佳时机 II
class Solution {
public:
int maxProfit(vector<int>& prices) {
int ans = 0;
for(int i = 1;i < prices.size();i ++)
if(prices[i] > prices[i - 1])
ans += (prices[i] - prices[i-1]);
return ans;
}
};
#1029. 两地调度
思路:没有用dp来做 ,自己想了个贪心策略,先按照去A市和B市差值最大的进行降序排序
然后从头开始选择城市满足选择该城市的最优条件且人数不超过限制的时候尽可能先满足去该城市面试。
class Solution {
public:
int twoCitySchedCost(vector<vector<int>>& costs) {
sort(costs.begin(),costs.end(),[](const auto &a,const auto &b){
return (abs(a[0] - a[1]) > abs(b[0] - b[1]));});
int n = costs.size() / 2,A = 0, B = 0 , ans = 0;
for(int i = 0;i < costs.size();i ++)
{
if((costs[i][0] >= costs[i][1] && B < n)|| (A >= n && B < n)){
B++;ans += costs[i][1];
}else{
A++;ans += costs[i][0];
}
}
return ans;
}
};