golang力扣leetcode 440.字典序的第K小数字

简介: golang力扣leetcode 440.字典序的第K小数字

440.字典序的第K小数字

440.字典序的第K小数字

题解


首先获得以当前数字prefix开头的字典个数,即当前这棵树的节点个数

  1. 如果节点个数>=k,说明k在这棵树的范围内,则prefix*=10,进入子树
  2. 如果节点个数<k,说明k在这棵树,则prefix+1,去右边更大的数去查找

代码

func findKthNumber(n int, k int) int {
  //prefix数字i,p位置
  prefix, p := 1, 1
  //等到p=k时,prefix就是答案
  for p < k {
    //获得以prefix开头的字典个数
    cnt := getCount(prefix, n)
    //这里减1的原因是,cnt包含i的当前位置,而p就是当前位置,所以重复计算了一个位置
    if (p + cnt - 1) >= k {
      //如果k在以prefix开头的字典个数的范围内,则进入这棵子树
      prefix *= 10
      //1->10,位置移动了一步,所以p也要移动
      p++
    } else if (p + cnt - 1) < k {
      //如果k比这棵子树的范围还要大,那么要增加prefix的大小
      prefix++
      //并且位置p可以直接跨越cnt个
      p += cnt
    }
  }
  return prefix
}
//获得以数字i开头的数字字典个数
func getCount(x, n int) int {
  ans := 0
  start, end := x, x+1
  for start <= n {
    //如果end>n,则要缩小范围,n+1~end都是无效数字
    ans += min(n+1, end) - start
    //[1,2]--->[10,20]
    start *= 10
    end *= 10
  }
  return ans
}
func min(i, j int) int {
  if i < j {
    return i
  }
  return j
}


目录
相关文章
|
22天前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
23天前
|
机器学习/深度学习 存储 算法
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
|
21天前
|
存储
力扣-2904最短且字典序最小的美丽子序列
力扣-2904最短且字典序最小的美丽子序列
14 1
|
22天前
|
算法 数据可视化 数据挖掘
最佳加油站选择算法:解决环路加油问题的两种高效方法|LeetCode力扣134
最佳加油站选择算法:解决环路加油问题的两种高效方法|LeetCode力扣134
|
22天前
|
存储 算法 数据可视化
LeetCode 力扣题目:买卖股票的最佳时机 IV
LeetCode 力扣题目:买卖股票的最佳时机 IV
|
22天前
|
存储 算法 数据可视化
LeetCode 力扣题目:买卖股票的最佳时机 III
LeetCode 力扣题目:买卖股票的最佳时机 III
|
22天前
|
存储 缓存 算法
LeetCode力扣题目111:多种算法对比实现二叉树的最小深度
LeetCode力扣题目111:多种算法对比实现二叉树的最小深度
|
23天前
|
存储 机器学习/深度学习 算法
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
|
27天前
|
算法 Java Go
【经典算法】LeetCode 35. 搜索插入位置(Java/C/Python3/Golang实现含注释说明,Easy)
【经典算法】LeetCode 35. 搜索插入位置(Java/C/Python3/Golang实现含注释说明,Easy)
11 0
|
18天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题