博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
658. Find K Closest Elements
阅读量:2351 次
发布时间:2019-05-10

本文共 1905 字,大约阅读时间需要 6 分钟。

题目

Given a sorted array, two integers k and x, find the k closest elements to x in the array. The result should also be sorted in ascending order. If there is a tie, the smaller elements are always preferred.

Example 1:

Input: [1,2,3,4,5], k=4, x=3

Output: [1,2,3,4]

我的想法

解答

jiuzhang solution: 二分法 + 双指针

先通过二分法找到大于target的最小数。再用背向双指针以前面找到的那个数为起点找到k个最接近target的数。
这里需要注意的是,大于target的最小数不一定是最接近的k个数之一,因此不能直接把这个数加入到result当中,也需要经过判断

class Solution {
public List
findClosestElements(int[] arr, int k, int x) {
List
result = new ArrayList<>(); if(arr == null || arr.length == 0) return result; if(arr.length < k) return result; //backward two pointer int idx = firstElemt(arr, x); int start = idx - 1, end = idx; for(int i = 0; i < k; i++) {
if(start < 0) {
result.add(arr[end++]); } else if(end > arr.length - 1) {
result.add(arr[start--]); } else {
if(x - arr[start] <= arr[end] - x) {
result.add(arr[start--]); } else {
result.add(arr[end++]); } } } //sort方法不会将排序后数组返回,因此不能直接将这个语句return Collections.sort(result); return result; } //find the smallest element greater than target private int firstElemt(int[] A, int target) {
int start = 0, end = A.length - 1; while(start + 1 < end) {
int mid = start + (end - start) / 2; if(A[mid] >= target) {
end = mid; } else {
start = mid; } } if(A[start] >= target) {
return start; } if(A[end] >= target) {
return end; } //all of elements are smaller than target return A.length; }}

转载地址:http://hkqvb.baihongyu.com/

你可能感兴趣的文章
windows 下实现函数打桩:拦截API方式
查看>>
获取Windows系统版本
查看>>
漫谈兼容内核之十二:Windows的APC机制
查看>>
21.windbg-.lastevent、!analyze(dump分析、异常错误码查询)
查看>>
16.windbg-.frame、dt(切换局部上下文、查找结构体)
查看>>
为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样-------_CrtMemBlockHeader
查看>>
windbg调试命令:!peb、!teb
查看>>
开源任务管理器 Process Hacker (Windows)
查看>>
快速发现Windows中毒的工具:Process Hacker
查看>>
Process Hacker源码中的用户态hook的做法
查看>>
Get IT技能知识库 50个领域一键直达
查看>>
浅析C++中的this指针及汇编实现
查看>>
关于32位程序在64位系统下运行中需要注意的重定向问题(有图有真相)(***)
查看>>
解决win10系统中截图异常放大的问题
查看>>
关于Windows高DPI的一些简单总结
查看>>
tlb文件为何而生?
查看>>
IE9 GPU硬件加速到底是实用创新还是噱头
查看>>
UpdateLayeredWindow与SetLayeredWindowAttributes的使用
查看>>
IM消息送达保证机制实现(二):保证离线消息的可靠投递
查看>>
bss段、data段和text段
查看>>