【发布时间】:2016-10-23 19:10:58
【问题描述】:
给定整数 n 和 k,找出从 1 到 n 范围内按字典顺序排列的第 k 个最小整数。
注:1 ≤ k ≤ n ≤ 109。
例子:
输入: n: 13 k: 2
输出: 10
说明: 字典顺序是[1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是10。
我编写了一个运行良好的代码,但是当我提供非常高的输入时,它需要很长时间才能执行,因此会超时。有人可以建议我如何提高效率。
谢谢!!
public class Solution {
class MyComp implements Comparator<Integer>{
@Override
public int compare(Integer n1, Integer n2) {
return String.valueOf(n1).compareTo(String.valueOf(n2));
}
}
public int findKthNumber(int n, int k) {
if(n==0 || k ==0 || k > n) return 0;
int[] tracker = new int[9];
Arrays.fill(tracker,0);
Map<Integer,TreeSet<Integer>> map = new HashMap<Integer,TreeSet<Integer>>();
for(int i =1;i<=n;i++){
String prefix = String.valueOf(i);
int currIndex = Integer.parseInt(prefix.substring(0,1));
//Update count
tracker[currIndex-1] = tracker[currIndex-1] + 1;
if(map.containsKey(currIndex)){
TreeSet<Integer> set = map.get(currIndex);
set.add(i);
map.put(currIndex,set);
}else{
TreeSet<Integer> set = new TreeSet<Integer>(new MyComp());
set.add(i);
map.put(currIndex,set);
}
}
// counter to check the if we reach near by K
int count =1;
for(int i=0;i<9 ;i++ ){
int lookUp = i+1;
int val = tracker[i];
if( count + map.get(lookUp).size() > k){
for(int res : map.get(lookUp)){
if(count == k) return res;
count++;
}
}
count = count + map.get(lookUp).size();
}
return 0;
}
}
【问题讨论】:
-
为什么它的字典顺序使它独一无二?为什么不查看代码以获取有效的订单统计信息,并使用字典顺序进行比较?
-
TLE 是因为 N 很大。鉴于 N 很大,您应该查看 log N 解决方案。