Given a target number, a non-negative integer k and an integer array A sorted in ascending order, find the k closest numbers to target in A, sorted in ascending order by the difference between the number and target. Otherwise, sorted in ascending order by number if the difference is same.

分析

先找到最接近的数字,使用Closest Number in Sorted Array中的函数,时间复杂度 O(LogN)
然后从当前位置,使用两个指针:i 和 j。分别向头尾遍历,直到 k 个元素被 add 进结果数组list,
时间复杂度O(min(k, A.length))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class Solution {
    /**
     * @param A an integer array
     * @param target an integer
     * @param k a non-negative integer
     * @return an integer array
     */
    public int[] kClosestNumbers(int[] A, int target, int k) {
        // Write your code here
        int len = A.length;
        int j = closestNumber(A, target), i = j - 1, di, dj;
         int[] list = new int[Math.min(k, A.length)];
        int count = 0;
        while(len-- != 0 && k-- != 0){
            di = i < 0 ? Integer.MAX_VALUE : A[i] - target;
            dj = j >= A.length ? Integer.MAX_VALUE : A[j] - target;
            if(dj == 0 || Math.abs(dj) < Math.abs(di)){
                list[count++] = A[j++];
            }
            else{
                list[count++] = A[i--];
            }
             
        }
        return list;
    }
     
    private int closestNumber(int[] A, int target) {
        // Write your code here
        if(A == null || A.length == 0)
            return -1;
        int left = 0, right = A.length - 1, mid;
        while(left < right){
            mid = left + (right - left) / 2;
            if(A[mid] < target){
                left = mid + 1;
            }
            else{
                right = mid;
            }
        }
        // when left == right, this is the first position that target can be insert
        if(right > 0 && (A[right] - target) > (target - A[right - 1]))
            return right - 1;
        else
            return right;
    }
}

最新文章

  1. 谈谈软件项目的dependency
  2. 【Java】一个小程序,计算它包含的代码所需的耗时
  3. nodejs net模块实现socket
  4. I.MX6 Linux kernel LVDS backlight enable
  5. XMPP——Smack[6]离线消息和离线文件的实现
  6. 深入理解ASP.NET MVC Day1
  7. awk学习笔记一:基础(转)
  8. xmlplus 组件设计系列之三 - 文本框
  9. Android TextView属性大全
  10. java -jar和hadoop jar的区别
  11. java获取某一字段日期并增加7天存入另一字段
  12. javascript 模板
  13. symfony框架
  14. django----Form实时更新两种方式
  15. What is the RESTful API ?
  16. Java生成静态HTML文件
  17. 【转】ssh-copy-id帮你建立信任
  18. GetLastError结果列表
  19. Structs2笔记①--structs的背景、structs2框架的意义、第一个helloworld
  20. K:求取数组中最大连续子序列和的四个算法

热门文章

  1. 爬虫2.5-scrapy框架-下载中间件
  2. 设置PNG图片DPI 信息,保存为PDF(使用Magick),与OpenCV转换
  3. K-means + PCA + T-SNE 实现高维数据的聚类与可视化
  4. ab命令做压测测试
  5. 王者荣耀交流协会 - 第6次Scrum会议(第二周)
  6. 《C》VS控制台应用
  7. RIGHT-BICEP测试第二次程序
  8. 每日Scrum--No.2
  9. hdu1242 Rescue DFS(路径探索题)
  10. 关于双系统下Ubuntu不能访问Windows中某个盘的问题