leetcode 440. 字典序的第K小数字

git推送代码到main分支 今天我使用Git工具推送代码到我的Github账号,Git工具推送成功后,发现Github上面没有代码。捣鼓之后发现Github账号默认的主分支从2020年10月1日起已经由master改为了main,而Git工具默认推送的还是master分支,这就导致推送的代码在Github上面的main主分支看不到,想要看到代码还需要切换分支。 我顿时就很诧异,可能是因为我好久都没有在git贡献过代码的原因,呜呜呜~~~ 然后在在网上找了一些解决的办法,比如直接用Git工具向main分支推送,但是奇怪的报错来了 阅读详情

题目地址(440. 字典序的第K小数字)

https://leetcode-cn.com/problems/k-th-smallest-in-lexicographical-order/

题目描述

给定整数 n 和 k,返回  [1, n] 中字典序第 k 小的数字。

 

示例 1:

输入: n = 13, k = 2
输出: 10
解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。


示例 2:

输入: n = 1, k = 1
输出: 1


 

提示:

1 <= k <= n <= 109

前置知识

字典序
先序遍历

思路

直观想法:将1 - n的数字转换为字符串,排序找到第k小的数字,但数据范围过大,时间复杂度过高。
利用字典树的特性将所有小于等于 n 的数字按照字典序的方式进行重建,可以得到如下:


图片来源: leetcode官方题解

前序遍历该字典树即可得到字典序从小到大的数字序列,遍历到第 k 个节点即为第 k 小的数字,因此构建该字典树后先序遍历,便可得到结果,时间复杂度为O(k)O(k)O(k), 时间复杂度仍然过高。原因就是先序遍历是一个一个都走到,因此可以在遍历时加一些优化,使得遍历的节点少一些。
优化的思路就是不必一个一个向下访问到每个叶节点,而是尽量在父节点就做出判断。
在字典树的先序遍历中,发现当访问到curcurcur节点时,可以判断第kkk个数是否在当前以curcurcur节点为根的子树中。如果第k个数在子树中,在向下遍历,否则向右遍历,去查找第k−以cur节点为子树的大小k - 以cur节点为子树的大小kcur的数,这样可以跳过以curcurcur节点为根的子树不用访问。
在这里插入图片描述
那么如何判断第kkk个数是否在以curcurcur节点为根的子树?
这里按照层序遍历的思想,当前的前缀为curcurcur, 下一种前缀为cur+1cur + 1cur+1,记为nextnextnext
两个节点分别向下扩展,由于是十叉树,所以下一节点cur′=cur∗10cur' = cur * 10cur=cur10, next′=next∗10next' = next * 10next=next10
next′−cur′next' - cur'nextcur就能够得到cur′cur'cur这一层的所有节点;在保证小于等于nnn的前提不断向下遍历,统计出每层的节点数。在最后一层的时候,为了保证小于等于nnn,该层的有效范围的右端点为nnn; 所以每层的最右侧节点应该为 min(next−1,n)min(next - 1, n)min(next1,n)
统计出所有小于等于n的以curcurcur为根的子树的节点个数和sum(cur)sum(cur)sum(cur),和kkk作比较

  • 如果满足sum(cur)>=ksum(cur) >= ksum(cur)>=k, 说明,则此时可以肯定第 k小的节点一定在curcurcur为根构成的子树中,则此时需要在cur的孩子节点中依次进行查找。减去cur根节点,向下遍历。
  • 如果满足sum(cur)<ksum(cur) < ksum(cur)<k, 说明,则此时可以肯定第 k小的节点一定不在curcurcur为根构成的子树中,则从下一种前缀next开始,查找第k−sum(cur)个节点k - sum(cur) 个节点ksum(cur)

代码

  • 语言支持:C++

C++ Code:

class Solution {
public: 
    int nodeCount(long long cur, int n)  // 统计以cur为根的在合法范围的子树的大小
    {
        long long next = cur + 1;   

        int res = 0;
        while(cur <= n)     // 统计每层的节点
        {
            res += min(next - cur, n - cur + 1);  // 每层节点的右边界为min(n, next)
            cur *= 10;
            next *= 10;
        }

        return res;  // cur为根的子树的节点数目总和 
    }
    int findKthNumber(int n, int k) {
        int cur = 1;
        while(k > 1)
        {
            if(nodeCount(cur, n) >= k)  // cur为根的子树的节点数目总和 >= k
            {
                k --;         // 去掉cur节点         
                cur *= 10;   // 向下搜寻
            }
            else
            {
                k -= nodeCount(cur, n);  // 去掉cur为根的子树的节点数目总和 
                cur ++;                  // 遍历下一种前缀
            }
        }

        return cur;
    }
};

复杂度分析

令 n 为数组长度。

  • 时间复杂度:O(log(N))O(log(N))O(log(N))
  • 空间复杂度:O(1)O(1)O(1)
【Linux】git使用 Linux下git使用 阅读详情

相关推荐

Git-git worktree的使用

Git worktree 是解决多分支开发场景的高效工具。相比传统方法,它可以为同一仓库创建多个独立工作区,每个工作区对应不同分支,避免了频繁切换分支时重新编译的问题。通过 git worktree add 创建新工作区后,各工作区编译文件相互独立,且共享同一个.git目录,既节省磁盘空间又保持实时同步。相比复制整个项目或频繁切换分支,worktree 方案在时间效率、磁盘利用和操作便捷性上都有明显优势,特别适合需要同时在多个分支开发的场景。

mrbone11的博客 1700

git 提交错误解决:$ git push -u origin main error: src refspec main does not match any error: failed to pus

git 提交错误解决:$ git push -u origin main error: src refspec main does not match any error: failed to pus

LJT_SIX的博客 2970

GITgit个人笔记

GIT个人手册 版本 日期 修订内容 作者 V01 2019-06-25 初稿 备注: 使用中不断迭代完善,其他人使用中有其他总结的,可以补充。 目录 第一章说明 一.1.1GIT 中文手册 一.1.2git仓库说明(工作区、暂存区、本地仓、远程仓)1 一.1.3git仓库说明(工作区、暂存区、本地仓、远程仓)2...

小鱼菜鸟的博客 1116

git执行git push -u origin main 报错 error: src refspec main does not match any

git执行git push -u origin main 命令时候出错

weixin_44114312的博客 2354

git push -u origin main 这个-u起什么作用

只推代码。:推代码 + 建立本地分支和远程分支的追踪关系(以后能偷懒)。

qq_36428821的博客 592

Git系列:git push (-u) 与 git branch (-u)

掌握和的使用,可以帮助你更高效地管理 Git 分支和远程仓库的交互。通过设置上游分支,可以简化日常的 Git 操作,提高开发流程的自动化程度。然而,正确理解每个命令和参数的具体含义,是避免错误和混淆的关键。在实际开发中,根据项目的具体需求和团队的工作流程,灵活运用这些命令和参数,可以大幅提升工作效率,实现更流畅的版本控制和代码管理。

专注于全栈开发领域 3287

Git】在IDEA中使用Git

还不清楚如何在IDEA中使用Git进行团队协作开发?详细教程来了!

你不来,再美的天地,都狼藉 ~ 1万+

Git使用

Git从入门到熟练使用

smartcat2010的博客 6890

Git使用总结(包含Git Bash和Git GUI的使用)

Git总结简介 说明:下列文本性内容部分来自廖雪峰的网站,一部分来自公司实战,一部分来自官方网站 版权声明:本文为原创文章,未经允许不得转载 博客地址:http://blog.csdn.net/kevindgk 学习网址1. http://www.liaoxuefeng.com/ Git的完整学习教程 2. https://git-for-windows.github

一路向东 9万+

Git系列四:常用命令的使用 git add、git status、git commit、git reset、git log、git pull、git push

常用命令的使用 git add、git status、git commit、git reset、git pull、git pushgit log

qq_34761779的博客 1531

Git教程——git使用

GIT是目前最先进的分布式版本控制系统。这篇文章我们来学习Git教程——git使用。我们主要通过git初始化、增删改查、提交文件到仓库、版本库控制等操作来学习git使用

霖hero 4001

Git】在Idea中使用Git

安装好IntelliJ IDEA后,如果Git安装在默认路径下,那么idea会自动找到git的位置,如果更改了Git的安装位置则需要手动配置下Git的路径。2、每一位组员从远程仓库克隆项目到idea中,这样每位同学在自己电脑上就有了一个工作副本,可以正式的开始开发了。4、组员A和组员B修改了同一个文件的同一行,提交到本地没有问题,但是推送到远程仓库时,后一个推送操作就会失败。3、组员A修改工作区,提交到本地仓库,再推送到远程仓库。解决方法:需要先获取远程仓库的代码到本地仓库,编辑冲突,提交并推送代码。

咖喱年糕的博客 7105

Git使用总结

Git是什么... 3 Git使用... 3 下载安装... 3 git本地仓库管理(基础)... 4 设置本地账户信息git config --global. 4 创建本地仓库 git init 4 提交代码版本,进行管理 git commit/add. 5 查看文件变化情况与提交记录... 6 git diff 6 git status. 7 git log. 8 还原代...

lishanxin1991的博客 894

Gitgit的简单使用

reset到commit1,reset的内容被放入本地仓(commit1的内容覆盖本地仓),而暂存区中依然是commit3的内容。hard:reset到commit1,reset的内容被放入工作区(即commit1的内容不仅覆盖了本地仓和暂存区,还覆盖了工作区的内容)main.c的内容直接被commit1的修改覆盖。reset到commit1,reset的内容被放入暂存区(commit1的内容覆盖本地仓和暂存区),而工作区中依然是commit3的内容。提交一次,表示引入了某个子模块。

张壮壮的博客 1514

eclipse中Git使用

本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!

2401_83412087的博客 2652

Git】之Git使用基础

下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace:工作区 Index / Stage: 暂存区 Repository: 仓库区(或本地仓库) Remote:远程仓库 1、首先需要安装Git,下一步下一步就行,这里就不说了。值得一提的是,如果Git安装成功,当你在某个文件夹下点击鼠标右键的时候,弹出的菜单中会有一项是Git Bash Here,点击这一项就可以弹...

定格空间 241
上一篇: 传智杯第四届初赛 B小卡与质数2
下一篇: Acwing 45场周赛
Magic__KID
博客等级 码龄7年 1粉丝 15原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值