9. 字典序的第K小数字

题目链接:字典序的第K小数字

来自力扣的一道好题。

这题很容易产生在字典树上统计的思路,但是并不需要建出字典树,因为可以直接计算出一个子树的大小。于是直接用算出的子树大小和 k k k 进行比较,判断是直接进入子树还是走向下一个兄弟节点。这种做法的时间复杂度是 O ( log ⁡ 2 n ) O(\log ^2 n) O(log2n) 的,因为 ans++ 的操作每一层不会超过 10 10 10 次。

class Solution {
using ll = long long;
public:
	ll calc(ll n, ll mx) {
		ll now = n, nxt = n + 1, cnt = 0;
		while (now <= mx) {
			cnt += min(mx + 1, nxt) - now;
			now *= 10, nxt *= 10;
		}
		return cnt;
	}
    int findKthNumber(int n, int k) {
		int ans = 1;
		while (k > 1) {
			int cnt = calc(ans, n);
			if (cnt < k)
				k -= cnt, ans++;
			else 
				k--, ans *= 10;
		}
		return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值