491. 递增子序列

第一种方法是暴力枚举,需要能考虑到给定的集合大小是15以内,并且知道一个数学知识:即一个集合的子集个数是2^n,所以枚举的话最多是2^15方,还是可以运算的。知道了这个以后就需要知道如何用C/C++程序实现对一个给定集合的所有子集的查找。

详情可以参考这篇文章,思考一下就能看懂。https://blog.csdn.net/yanerhao/article/details/77075462

比如集合有四个数,该程序的含义就是说,子集个数为2^4=16,1<<0=1,1<<1=2,1<<2=4,1<<3=8,展开成二进制后分别对应每一位取还是不取,将遍历过程中每个“状态”与取还是不取这个数做与运算,这要这种状态与取还是不取有一位对应1(取),则将该位压入。具体到本题,还需要加一些判断增还是减的条件。

 

第二种方法是暴力递归,对训练递归思维比较好的方法即DFS,一开始没想明白具体怎么用,看了参考代码后才找到了些感觉。其实也不难,递归约等于栈,找递增子序列的过程,其实就是从前往后,看后面的是否比前面大,不行就pass,将该元素弹出,继续考虑下一个,弹出的过程其实是回到了原始的状态。

这里附上大佬的代码.

https://blog.csdn.net/xiaocong1990/article/details/60572649

你可能感兴趣的:(C语言编程)