- 小红圈的数量
给你一个二维矩阵,代表每个用户之间的关系,若彼此都为1,说明是在互相关注,互相关注的成为“朋友”,且朋友具有传递性。朋友之间形成1个小红圈。求小红圈的数量
输入:
N+1行,第1行为N,代表有N个用户
之后的N行是矩阵的数据,代表各个用户之间的关系
输出:
小红圈的数量
我的思路:
使用并查集,把朋友合并。
最后数一数多少个独立的集合就可以了
2.笔记草稿
给你一组字符串,由英文和(),<构成,()圈起来的部分是注释,不会输出,‘<’是删除,会把有效输出删除,()保证成对出现,<不会影响到括号,求有效输出
输入:
一行字符串,例如a<<b(a(<))
输出:
最终的有效字符 b
解释:
a被删除,
b输出
a(<)被一个括号注释掉了
思路:
把问题拆分成2部分:
有效输出部分
栈部分(用来记录括号,判断是否在注释状态)
栈部分:
利用栈去判断是否处于注释状态,注释状态下直接舍弃输入数据,直到遇到‘)’,来更新栈的状态,另外要注意一下遇到新的‘(’还需要入栈)
有效输出部分:
1.先判断是否处于注释状态,是的话就检测“()”来判断何时退出
2.不处于注释状态的话就判断删除操作“<”,注意删除的前提是有元素可以删
3.不处于注释状态,也不是删除符,那么直接放入有效输出部分
3.笔记精选
题目:
给你n篇笔记的点赞数,要求每篇笔记的编号不能连续,请选出总赞数最多的笔记集合,输出做多的总赞数和选中的笔记数量,若有多种选择方案,输出笔记数量最少的那种方案
输入:
一行数据,代表每篇笔记的赞数,例如 1 2 3 1
输出
一行数据,2个数字,1个代表总赞数,1个代表笔记数,例如 4 2
思路:
动态规划
解题方法:
memo[n]代表从[0..n]中去选择,可以选出的最高总赞数
memo[n]的求取:
1.要么选择当前笔记el(n)+memo[n-2];
2.要么不选memo[n-1];
3.二者取最大值
以上可以求出最高总赞数
接下来去求选择的笔记数
利用回溯法
因为memo数组已求了出来,接下来就去比对一下,
因为memo【n】要么是根据el(n)+memo【n-2】求来的
要么是根据memo【n-1】求来的。所以就可以倒着推回去
退出条件:
若n<0,(实际不会出现这种情况)直接返回
若n==0,那么num++,返回;(因为0之前没数了,既然推到了0,那么一定会选择0)
递归条件:
先if判断一下,能否递归memo【n-1】,因为这样选的文章数少;
若不能递归n-1,就num++代表选中了当前文章,然后去递归memo【n-2】,注意此时赞数ret要减去el(n);
4.倒卖战利品
题目:
有一组N个宝物,宝物有2个属性
稀有性X,实用性H
卖给小贩,但小贩很贪心,一旦卖给他一个宝物后,下一个宝物的稀有性和实用性都不能低于上一个宝物,否则小贩就不收了
求最多能卖给小贩多少个宝物
输入:
N
X1 H1
...
输出:
个数
思路:
贪心算法
先排序
然后计算