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




  • 相关阅读:
    ansible-乱
    linux-PXE-12
    linux-ntp-10
    linux-selinxu---性能 -8
    linux-系统启动流程-7
    linux-网络管理-6
    linux-文件系统-5
    linux-包管理器-4
    linux-shell脚本基础-2
    linux-history-ps1-1
  • 原文地址:https://www.cnblogs.com/zhxshseu/p/6d73de551273e9171e220ae857517755.html
Copyright © 2011-2022 走看看