题目面试题64. 求1+2+…+n
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
1<=n<=10000
解题思路
1 | class Solution { |
题目525.连续数组
给定一个二进制数组, 找到含有相同数量的 0 和 1 的最长连续子数组(的长度)。
用例
1 | 输入: [0,1] |
1 | 输入: [0,1,0] |
解题思路
遇到0加一,遇到1减一,为了保证0和1相等,那么总和应该为0,当当前的和为k时,只要找到上一次和为k的值就可以得到在上一次和为k开始到现在0
和1相等
代码
1 | class Solution { |
题目526.优美的排列
假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一个优美的排列。条件:
- 第 i 位的数字能被 i 整除
- i 能被第 i 位上的数字整除
现在给定一个整数 N,请问可以构造多少个优美的排列?
用例
输入:7
输出:41
解题思路
dfs遍历全部的可排列方式
- 从头开始构造全部的排列方式,用一个visited记录所用过的数字
- 构造所有的可行数组
- 采用状态压缩和dp数组进行分析
- 用一个n位的二进制数表示二进制中为1的数字已任意顺序放在数组的前m位(m为该二进制数中1的个数)。
- 例子:二进制数010101,第1,3,5位是1,一共3个1,所以表示1,3,5以任意顺序放在数组前3位。
- 状态:dp[n]表示二进制数n代表的所有排列中有效情况的数量。
- 更新状态:对于二进制中为0的位,判断是否可以作为下一个放入数组中的数,若是则更新
dp[n | (1 << j)] += dp[n]
- 例子:010101中,第2位为0,判断其是否可放在数组第4位(因为数组已有3个数),显然可以(4%2==0),更新
dp[010101 | (1 << (2-1))] += dp[010101]
;
即dp[010111] += dp[010101]
;
代码
1 | class Solution { |
本文作者:
ketsudou
发布时间: 2020-06-02
最后更新: 2020-06-03
本文标题: leetcode-day16
本文链接: http://huangketsudou.github.io/2020/06/02/leetcode-day16/
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处
发布时间: 2020-06-02
最后更新: 2020-06-03
本文标题: leetcode-day16
本文链接: http://huangketsudou.github.io/2020/06/02/leetcode-day16/
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处