【leetcode详解】让所有学生保持开心的分组方法数

题面:


题目详解:

做题感受:变量较多,相互影响,不小心就有点绕晕了。

但冷静下来,重新思考后,核心变量就三个:

  • 被选中的人数(记为A),
  • 被选中的人中nums的最大值(记为B),
  • 没被选中的人中nums的最小值(记为C)

一种可视化理解:

  • 如果将题目给的数据画成 nums[ i ] - i 的二维坐标系散点图,分组就相当于画一条平行于x轴的直线,将图中的散点划分成两个部分,并且要求不能有点落在这条线上。
  • 而这条线对应的值,就是被选中的人数,也即线下方散点的个数。那么,这道题,也就是要讨论这种线存在的条数。

如何更具体地判断这条线是否存在呢?

思考后我们发现:只需线对应的值(即A)>  B  &&   <  ;

进而抽象为代码可以实现的操作:

  • 先对nums排序,然后从头遍历
  • 判断 if( i>nums[i-1] && i<nums[i] )
  • 其中 i 就是 A,nums[i-1]即 B,nums[i]即 C  

AC代码如下:

class Solution {
public:
    int countWays(vector<int>& nums) {
    	sort(nums.begin(), nums.end());
    	int res=0;
    	if(nums[0] > 0) res++;
		for(int i=1; i<nums.size(); i++)
		{
			if(i>nums[i-1] && i<nums[i]) res++;
		}
		return res+1;//根据题给变量范围,必然可以取所有人为一组		
    }
};

~希望对你有启发!~

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值