Leetcode|Find K Closest Elements
时间:2022-05-06
本文章向大家介绍Leetcode|Find K Closest Elements,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
01
—
题目
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.
Input: [1,2,3,4,5], k=4, x=3 Output: [1,2,3,4]
Input: [1,2,3,4,5], k=4, x=-1Output: [1,2,3,4]
Note: The value k is positive and will always be smaller than the length of the sorted array. Length of the given array is positive and will not exceed 104 Absolute value of elements in the array and x will not exceed 104
题目的意思是求出与x最相近的k个元素
02
—
分析
考虑两种特殊情况:
- x 小于等于 arr[0]
- x 大于等于 arr[-1]
然后,考虑一般情况,这时与x的距离,分布情况为:与x的距离先降为0,然后再逐渐增大,所以里面又有两种可能:
- 距离等于0的元素个数大于或等于k
- 距离等于0的元素个数小于k,这种情况求解,稍微复杂,需要二分动态查找。
以上分析的时间复杂度为O(n),空间复杂度为O(1)。
03
—
python代码
"""
arr: array wanted to search
k : k numbers nearest to x
x: goal center point
assert:
1. arr is sorted
2. ele in arr is integer
"""
def findKNearestToX(arr=[1,3,5],k=2,x=0):
# x less or equal than arr[0]
if x <= arr[0]:
return arr[:k]
# x bigger or equal than arr[-1]
if x >= arr[-1]:
return arr[-k:]
# ordinary cases: at least one zero,
# distance distribution: decline-->0-->rise
hi=0
zerolen=0
for i,item in enumerate(arr):
item = abs(item-x)
if item==0:
hi=i
zerolen+=1
if zerolen == k:
return arr[hi-zerolen+1:hi+1]
# here shows: number of zero chunk is less than k
# then it needs to dynamic binary search
lo = hi - zerolen+1
curlen = zerolen
while curlen < k:
if lo > 0 and abs(arr[lo-1]-x) <= abs(arr[hi+1]-x):
lo-=1
elif hi < len(arr):
hi+=1
curlen+=1
return arr[lo:hi+1]
#单元test
#1
kNearest = findKNearestToX(arr=[1,3,5],k=2,x=0)
#2
kNearest = findKNearestToX(arr=[1,3,5],k=2,x=5)
#3
#3-1
kNearest = findKNearestToX(arr=[1,3,3,3,5],k=2,x=3)
#3-2
kNearest = findKNearestToX(arr=[1,3,4,5],k=3,x=3)
#3-3
kNearest = findKNearestToX(arr=[-1,3,4,4],k=3,x=3)
print(kNearest)
- 数据库中间件mysql-proxy细节【mysql官方的中间件】
- Office CVE-2017-8570远程代码执行漏洞复现
- Java 并发包中的读写锁及其实现分析
- 深入理解 Spring 事务原理
- Chrome开发者工具的小技巧
- Java Web中JSP中6种动作概况知识点总结——每日一语法学习
- 从Flash到Silverlight进阶教程-用代码来创建动画
- 从Flash到Silverlight进阶教程-Tweener
- silverlight设置浏览器Cookies
- 一个最基本的布局控件-panel
- silverlight项目小结
- oozie 运行demo
- sqoop 兼容性问题
- oozie 安装过程详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- XSS Game分析以及知识点总结
- Web 图形可视化 SQL 优化神奇,真香!
- C++ vector 容器浅析
- C++中的STL中map用法详解
- C++ pair(对组)的简单了解
- elasticSearch学习(六)
- centos7搭建LDAP服务器
- zookeeper is not a recognized option zookeeper参数不支持
- 快来看看你是不是“假的”DBA
- 基于docker搭建gitlab
- 理解Future及FutureTask的实现
- centos7 hbase1.4.13+hadoop2.7.1+单机环境搭建
- 关于kubeconfig多集群切换
- 代码版本管理规范
- 基于云原生系统的应用分发系统设计