zoukankan      html  css  js  c++  java
  • K Closest Numbers In Sorted Array

    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;
        }
    }




  • 相关阅读:
    windows使用zip包安装mysql8.0.12
    windows使用msi包安装mysql8.0.12
    查看mysql的bin-log日志
    修改zabbix的端口号
    mysql备份脚本并保留7天
    上海坤亿
    nginx面试题
    服务器导入导出数据
    轮询和长轮询
    Python 三种读文件方法read(), readline(), readlines()及去掉换行符
  • 原文地址:https://www.cnblogs.com/zhxshseu/p/6d73de551273e9171e220ae857517755.html
Copyright © 2011-2022 走看看