题面:
题目详解:
做题感受:变量较多,相互影响,不小心就有点绕晕了。
但冷静下来,重新思考后,核心变量就三个:
- 被选中的人数(记为A),
- 被选中的人中nums的最大值(记为B),
- 没被选中的人中nums的最小值(记为C)
一种可视化理解:
- 如果将题目给的数据画成 nums[ i ] - i 的二维坐标系散点图,分组就相当于画一条平行于x轴的直线,将图中的散点划分成两个部分,并且要求不能有点落在这条线上。
- 而这条线对应的值,就是被选中的人数,也即线下方散点的个数。那么,这道题,也就是要讨论这种线存在的条数。
如何更具体地判断这条线是否存在呢?
思考后我们发现:只需线对应的值(即A)> B && A < C ;
进而抽象为代码可以实现的操作:
- 先对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;//根据题给变量范围,必然可以取所有人为一组
}
};