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.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; }} |
K Closest Numbers In Sorted Array
原文:http://www.cnblogs.com/zhxshseu/p/6d73de551273e9171e220ae857517755.html