博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode:658. Find K Closest Elements程序分析
阅读量:6639 次
发布时间:2019-06-25

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

好久没有练习算法了,以此纪研究生以来第一次练习算法题。

原题链接:

题目描述:大概意思是给定一个数组[1,2,3,4,5]和两个常数k,x然后在数组中找到与x最近的的k个元素,找到后的元素依旧按照升序排列。

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=3Output: [1,2,3,4]

Example 2:

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 10_4
Absolute value of elements in the array and x will not exceed 10_4

由于看题疏忽,没有看到给予的是排好序的数组,程序写的是排不排序都可以,因此第一次提交的程序着实运行的有些慢,在自己编译器中是可以编译通过的,但是提交上去被提示数组越界:

class Solution {public:    vector
findClosestElements(vector
& arr, int k, int x) { int temp = 0; vector
big(arr.size()); int distance = 0; big[0] = arr[0]; for(int i = 1; i < arr.size(); i ++) { if(abs(arr[i] - x) >= abs(big[i-1] - x)) big[i] = arr[i]; else { for(int j = i;j > 0;j --) { if(abs(arr[i]-x) < abs(big[j-1]- x)) { temp = big[j-1]; big[j-1] = arr[i]; big[j] = temp; } } } } sort(big.begin(),big.end()+k); vector
result(big.begin(),big.begin()+k); return result; }};

于是乎,将程序改成:

class Solution {public:    vector
findClosestElements(vector
& arr, int k, int x) { int temp = 0; vector
big(arr.size()); int distance = 0; big.at(0) = arr.at(0); for(int i = 1; i < arr.size(); i ++) { if(abs(arr.at(i) - x) >= abs(big.at(i-1) - x)) big.at(i) = arr.at(i); else { for(int j = i;j > 0;j --) { if(abs(arr.at(i)-x) < abs(big.at(j-1)-x)) { temp = big.at(j-1); big.at(j-1) = arr.at(i); big.at(j) = temp; } } } } sort(big.begin(),big.begin()+k); vector
result(big.begin(),big.begin()+k); return result; }};

继续提交,由于使用了at操作符,对数组越界进行了检查,导致程序运行速度更慢,直接的结果是提示Status: Time Limit Exceeded好吧,时间超时了,看来这个平台不仅注重时间复杂度和空间复杂度,连安全性也一并注重。

上述程序的复杂度应该是 O(n2),确实很慢呀。

于是乎,对程序进行修改:

vector
findClosestElements(vector
& arr, int k, int x) { int left = 0; int right = arr.size()-k; while(left
arr[mid+k]-x){ left = mid+1; }else{ right = mid; } } vector
result(arr.begin()+left, arr.begin()+left+k); return result;}

这次时间复杂度为O(logn+k)

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

你可能感兴趣的文章
我的友情链接
查看>>
u盘删除的文件能恢复吗?如何恢复
查看>>
C语言位操作源码片段
查看>>
VXLAN 概念(Part I) - 每天5分钟玩转 OpenStack(108)
查看>>
JSP 在修改JAVA文件后,要重新部署
查看>>
更新日志 - fir.im 新版管理后台邀请内测
查看>>
利用半透明对话框实现android运行时的提示界面
查看>>
事件处理
查看>>
MySQL事务
查看>>
全球 ICT 50 强榜单:阿里、中兴上榜
查看>>
磁饱和
查看>>
mysql更新数据库中所有相同的某个字段的值
查看>>
为什么 PHP 和 JavaScript 取整 ((0.1+0.7)*10) 的结果不是 8?
查看>>
改善SQL Server内存管理
查看>>
信号量同步线程
查看>>
NUC1333 Knight Moves【DFS】
查看>>
B00014 C++实现的AC自动机
查看>>
687C: The values you can make
查看>>
HDU2502 月之数(解法三)
查看>>
设计模式-命令模式
查看>>