LeetCode440.字典序的第K小数字

思路

  1. 将字典序抽象成字典树(核心思想)
1
2
10
11
12
19
20
21
root
...
....
  1. 前序遍历找第K个节点 (核心思想)
  2. 通过getSum()来获取以当前节点为根节点下的所有节点数,若节点数小于k,证明要寻找的节点不在当前节点的子节点集合中,当前节点向右遍历一个节点即可若节点数大于k,证明要寻找的数在子节点集合中,把当前节点跳到下一层开头即可
class Solution {
public:
    int getSum(int cur,long n){
        long first=cur,last=cur;
        int sum=0;
        while(first<=n){
            sum+=min(n,last)-first+1;
            first*=10;
            last=last*10+9;
        }
        return sum;
    }
    int findKthNumber(int n, int k) {
        int cur=1;
        k--;
        while(k>0){
            int sum=getSum(cur,n);
            if(sum<=k){
                cur++;
                k-=sum;
            }else{
                cur*=10;
                k--;
            }
        }
        return cur;
    }
};

版权声明:本文为qq_27277041原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。