今天是三道贪心思想的题。难度适中,多看多总结。
第一题:
简介:
本题不算难题,我的思路是能给大票给大票,大票不够再给小票。例如,给20美元找零,先看有没有10元的零钱再看5元的。
局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。
代码实现:
第二题:
简介:
本题和昨天做的分发糖果有相同的思想,如果两边一起顾,难免会混乱。所以,我们一个维度一个维度的来。首先,我们先对身高进行由大到小进行排序,如果身高相同那么k小的排在前面,这样排完后,我们可以保证
如果还是不懂,可以自己debug一遍就懂了。身高由大到小后,我们就可以按照k的值在索引为k的地方插入该值。因为我们前面插入的都是比当前身高 高的或者等于的,所以我们保证前面有k个值就行,当然后续插入的值也不会影响,因为后序插入的值都比自身小不影响排序。
代码实现:
class Solution {
public:
vector<vector<int>> queue;
static bool myCompare(vector<int>& v1,vector<int>& v2) {
if(v1[0]==v2[0])return v1[1]<v2[1];
return v1[0] > v2[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(),people.end(),myCompare);
for (int i = 0; i < people.size(); i++) {
int pos = people[i][1];
queue.insert(queue.begin()+pos, people[i]);
}
return queue;
}
};
第三题:
简介:
本题思想很简单,但是要注意几个问题大家可以先看看我的失败代码看看其中的问题,看看什么情况我没有计算拿进去再来看题解代码。可以看到刚开时我漏掉了如果后两个气球不能同时在前一个气球里被一箭射掉,那么就会出问题。题解中不断更新最小边界,并且让下一个气球和前一个进行比较解决了这个问题。
代码实现:
失败代码实现:(漏情况)
class Solution {
public:
static bool mycompare(vector<int>& v1,vector<int>& v2){
if(v1[0]==v2[0])return v1[1]<v2[1];
return v1[0]<v2[0];
}
int a=0;
int result=0;
int findMinArrowShots(vector<vector<int>>& points) {
sort(points.begin(),points.end(),mycompare);
for(int i=0;i<points.size();i++){
a = points[i][1];
result++;
for(int j=i+1;j<points.size();j++){
if(a>=points[j][0]){
if(j == points.size()-1)return result;
continue;
}else{
i = j-1;
break;
}
}
}
return result;
}
};
正确的代码:
class Solution {
public:
static bool mycompare(vector<int>& v1,vector<int>& v2){
if(v1[0]==v2[0])return v1[1]<v2[1];
return v1[0]<v2[0];
}
int result=0;
int findMinArrowShots(vector<vector<int>>& points) {
if (points.size() == 0) return 0;
sort(points.begin(),points.end(),mycompare);
result++;
for(int i=1;i<points.size();i++){
if(points[i][0]>points[i-1][1]){
result++;
}else{
points[i][1] = min(points[i][1],points[i-1][1]);
}
}
return result;
}
};
总结:
今天一共三题,其中第一题和第三题有思路,但实现起来第三题还是有点问题。第二题主要还是分治思想。从两个维度进行解析,而不是两边一起开始。继续加油!