【Leetcode】Count Numbers with Unique Digits
2016-06-29 10:52
453 查看
题目链接:https://leetcode.com/problems/count-numbers-with-unique-digits/
题目:
Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n.
Example:
Given n = 2, return 91. (The answer should be the total numbers in the range of 0 ≤ x < 100, excluding [11,22,33,44,55,66,77,88,99])
Hint:
A direct way is to use the backtracking approach.
Backtracking should contains three states which are (the current number, number of steps to get that number and a bitmask which represent which number is marked as visited so far in the current number). Start with state (0,0,0) and count all valid number till we reach number of steps equals to 10n.
This problem can also be solved using a dynamic programming approach and some knowledge of combinatorics.
Let f(k) = count of numbers with unique digits with length equals k.
f(1) = 10, …, f(k) = 9 * 9 * 8 * … (9 - k + 2) [The first factor is 9 because a number cannot start with 0].
思路:
递推方程都给了,傻子采用回溯。。= =。。而且回溯看起来好难的样子。。
算法:
题目:
Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n.
Example:
Given n = 2, return 91. (The answer should be the total numbers in the range of 0 ≤ x < 100, excluding [11,22,33,44,55,66,77,88,99])
Hint:
A direct way is to use the backtracking approach.
Backtracking should contains three states which are (the current number, number of steps to get that number and a bitmask which represent which number is marked as visited so far in the current number). Start with state (0,0,0) and count all valid number till we reach number of steps equals to 10n.
This problem can also be solved using a dynamic programming approach and some knowledge of combinatorics.
Let f(k) = count of numbers with unique digits with length equals k.
f(1) = 10, …, f(k) = 9 * 9 * 8 * … (9 - k + 2) [The first factor is 9 because a number cannot start with 0].
思路:
递推方程都给了,傻子采用回溯。。= =。。而且回溯看起来好难的样子。。
算法:
public int countNumbersWithUniqueDigits(int n) { if (n == 0) return 1; int count = 0; for (int i = 1; i <= n; i++) {// 求每一位有多少unique digits count += cal(i); } return count; } public int cal(int k) { int sum = 9; if (k == 0) return 0; if (k == 1) return 10; for (int i = 11 - k; i <= 9; i++) { sum *= i; } return sum; }
相关文章推荐
- UIAlertController的使用
- 大学生没技能没经验就业难,多亏传智播客UI设计
- three.js学习笔记 dat.gui.js和stats.js
- “只能在UI主线程更新View”这件小事,android ui
- fuel8: 在vmware中记得配置混杂模式
- UITableViewCell的显示错误
- Facebook开源的基于SQL的操作系统检测和监控框架:osquery Table详解
- PHP截取用UEditor编辑器保存在数据库的文章乱码和包含HTML标签的问题
- JS魔法堂:被玩坏的innerHTML、innerText、textContent和value属性
- 灵活且强大的RecyclerViewAdapter源码分析
- android ui界面设计开发demo-智慧社区ui设计展示
- Starting MySQL.Manager of pid-file quit without updating file.[FAILED]
- storyBoard编程通过performSegueWithIdentifier传参数
- #131 – Dependency Properties Inherit Values from Higher Up in the Logical Tree(逻辑树中元素的依赖属性可从其上层元素继承)
- 刷新某一行或某一段
- Invalidate(TRUE)与Invalidate(FALSE)区别
- Android学习笔记十一之Android基础UI二
- 标记 Arduino M0 板子如何更改PWM输出频率
- IIPP迷你项目(二)"Guess the Number!"
- ue4 服务器登陆流程