腾讯面试题,视野争夺 以及一类leetcode集合合并问题。

视野争夺这题 可以在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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值