视野争夺这题 可以在leetcode中找到相似的题目
合并区间和浇灌花园最小水龙头数目和 视频拼接链接和跳跃游戏 II
题目:合并区间:
思路:
首先将intervals 进行排序,排序规则是cmp 其中国one[0]<two[0] 代表着intervals中的每一个vector都是按照开始以第一数的从小到大进行排序的
然后,就是比较相邻的intervintals[i-1]和intervintals[i] 是否intervintals[i-1][1]>=intervintals[i-1][0] 是否满足,满足则可以合并区间。
代码:
class Solution {
private:
struct cmp
{
bool operator()(vector<int> num1,vector<int> num2)
{
return num1[0]<num2[0];
}
};
public:
vector<vector<int>> merge(vector<vector<int>>& intervals)
{
sort(intervals.begin(),intervals.end(),cmp());
vector<vector<int>> ret_vv;//存的是每个区间的最大区间(到目前i(不包括intervals[i])之间的数组)不重叠的区间数组
for(int i=0;i<intervals.size();i++)
{
if(!ret_vv.empty()&&ret_vv.back()[1]>=intervals[i][0])
{
ret_vv.back()[1]=max(ret_vv.back()[1],intervals[i][1]);
}else
{
ret_vv.push_back(intervals[i]);
}
}
return ret_vv;
}
};
题目:1326. 灌溉花园的最少水龙头数目链接**
思路:
首先我们必须重写cmp
struct cmp
{
bool operator()(vector<int> one,vector<int> two )
{
if(one[0]==two[0])
{
return one[1]>two[1];
}
return one[0]<two[0];
}
};
当然其实仿函数这么写也是可以的
struct cmp
{
bool operator()(vector<int> one,vector<int> two )
{
return one[0]<two[0];
}
};
我们刚开始设置
vector<int> temp_v{0,0};
这是为了第一个能够直接判断是否ranges【0】【0】<=0 和后面的ranges判断可以统一化,也就是代码
while(index<restore.size()&& back>=restore[index][0])
我们在进行第二次while循环前需要判断是否连接
if(back<restore[index][0]) return -1;//如果后面的连接不上,证明有空隙,无法覆盖
第二次循环后需要判断否已经可以完全覆盖
if(temp_v.back()>=n) return count;//这个一定要加上
代码:
class Solution {
private:
struct cmp
{
bool operator()(vector<int> num1,vector<int> num2)
{
return num1[0]<num2[0];
}
};
public:
int minTaps(int n, vector<int>& ranges)
{
vector<vector<int>> restore_vv;
for(int i=0;i<ranges.size();i++)
{
restore_vv.push_back({i-ranges[i],i+ranges[i]});
}
sort(restore_vv.begin(),restore_vv.end(),cmp());
vector<int> temp_v{0,0};
int count=0;
int index=0;
while(index<restore_vv.size())
{
int back=temp_v.back();
if(back<restore_vv[index][0]) return -1;
// 寻找可以当前可以到大的最远距离 eg[1,5]到 [3,9],[3,5],[4,6]的最远距离==> 显然合并后是[1,9]
int maxGap=back;
while(index<restore_vv.size()&&back>=restore_vv[index][0])
{
maxGap=max(maxGap,restore_vv[index][1]);
index++;
}
temp_v.back()=maxGap;
if(back<maxGap) count++;
if( temp_v.back()>=n) return count;
}
return -1;
}
};
题目:1024. 视频拼接链接
思路:
首先有个边界条件(提交代码发现的)
if(T==0) return 0;
我们刚开始
vector<int> temp_v{0,0};
这是为了,不单独判断clips【0】【0】==0 ,使得代码比较统一
代码:
class Solution {
private:
struct cmp
{
bool operator()(vector<int> nums1,vector<int> nums2)
{
return nums1[0]<nums2[0];
}
};
public:
int videoStitching(vector<vector<int>>& clips, int T)
{
if(T==0) return 0;
vector<vector<int> > retore_vv;
for(int i=0;i<clips.size();i++)
{
retore_vv.push_back({clips[i][0],clips[i][1]});
}
sort(retore_vv.begin(),retore_vv.end(),cmp());
vector<int> temp_v{0,0};
int count=0;
int index=0;
while(index<retore_vv.size())
{
int back=temp_v.back();
if(back<retore_vv[index][0]) return -1;
int maxGap=back;
while(index<retore_vv.size()&&back>=retore_vv[index][0])
{
maxGap=max(maxGap,retore_vv[index][1]);
index++;
}
temp_v.back()=maxGap;
if(back<maxGap) count++;
if(maxGap>=T) return count;
}
return -1;
}
};
题目:45. 跳跃游戏 II链接
思路:
这题其实还是覆盖问题
int target=nums.size()-1;
也就是集合
vector<vector<int>> restore;
for(int i=0;i<nums.size();i++)
{
int start=i;
int end=i+nums[i];
restore.push_back({start,end});
}
在也就是集合中最小个数能够到达 【0,target】中的count数
代码:
class Solution {
public:
int jump(vector<int>& nums)
{
if(nums.size()<=1) return 0;
vector<vector<int>> restore;
for(int i=0;i<nums.size();i++)
{
int start=i;
int end=i+nums[i];
restore.push_back({start,end});
}
for(int i=0;i<restore.size();i++)
{
cout<<restore[i][0]<<" "<<restore[i][1]<<endl;
}
int target=nums.size()-1;
vector<int> temp_v{0,0};
int index=0;
int count=0;
while(index<restore.size())
{
int back=temp_v.back();
if(back<restore[index][0]) return -1;
while(index<restore.size()&& back>=restore[index][0])
{
temp_v.back()=max(temp_v.back(),restore[index][1]);
index++;
}
if(back< temp_v.back())
{
count++;
}
if(temp_v.back()>=target) return count;
}
return -1;
}
};
题目:视野争夺链
思路:
牛客网上面就是输入要自己写
代码:
vector<vector<int>> restore_vv;
int n, target;
cin >> n >> target;
while (n--)
{
int start, end;
cin >> start >> end;
restore_vv.push_back({ start,end });
}
Solution s;
int ret = s.minEyes(restore_vv, target);
cout << ret;
方法就是前面几题的思路
注意
vector<int> temp_v{0,0};
是为了不单独判断numbers【0】【0】==0
和后面进行统一
代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution
{
private:
struct cmp
{
bool operator()(vector<int> one, vector<int> two)
{
if(one[0]==two[0])
{
return one[1]>two[1];
}
return one[0] < two[0];
}
};
public:
int minEyes(vector<vector<int>> &numbers, int target)
{
sort(numbers.begin(), numbers.end(), cmp());
int count = 0;
vector<int> temp_v{0,0};
int index = 0;
while (index < numbers.size())
{
//[0,3] [4,5] 根本不能拼接
if (temp_v.back() < numbers[index][0]) return -1;
int back = temp_v.back();
while (index < numbers.size() && back >= numbers[index][0])
{
temp_v.back() = max(temp_v.back(), numbers[index][1]);
index++;
}
//temp_v.back() = back;
//cout << "temp_v.back()=" << temp_v.back() << endl;
if(back<temp_v.back())
count++;
if (temp_v.back() >= target)
{
return count;
}
}
return -1;
}
};
int main()
{
vector<vector<int>> restore_vv;
int n, target;
cin >> n >> target;
while (n--)
{
int start, end;
cin >> start >> end;
restore_vv.push_back({ start,end });
}
Solution s;
int ret = s.minEyes(restore_vv, target);
cout << ret;
return 0;
}