leetcode658+有序数组找出距离数字x最近的k个数字
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode658+有序数组找出距离数字x最近的k个数字相关的知识,希望对你有一定的参考价值。
参考技术A 在一个非递减数组中,找到距离目标值,最近的数组索引。如 1 2 3 6 7 8 ,目标值为4
返回 2
思路:
可以理解为 先用二分法找到这个目标值,如果找不到,那么就找它应该插入的顺序,判断插入顺序两边的元素谁和目标值近。
//中级
public class Solution
public List<Integer> findClosestElements(List<Integer> arr, int k, int x)
int n = arr.size();
if (x <= arr.get(0))
return arr.subList(0, k);
else if (arr.get(n - 1) <= x)
return arr.subList(n - k, n);
else
int index = Collections.binarySearch(arr, x);
if (index < 0)
index = -index - 1;
int low = Math.max(0, index - k - 1), high = Math.min(arr.size() - 1, index + k - 1);
//高级
public List<Integer> findClosestElements(List<Integer> arr, int k, int x)
Collections.sort(arr, (a,b) -> a == b ? a - b : Math.abs(a-x) - Math.abs(b-x));
arr = arr.subList(0, k);
Collections.sort(arr);
return arr;
leetcode-3Sum Closest-16
输入一组数字,任选三个数字,求这三个数字加起来最接近某一值的和。
枚举三个数字的话ON^3
更高效的方法,利用了求一组数字中两个数字的和的方法,即用两个指针指向首尾往中间移动,前提是数组有序,所以先排序。遍历数组,然后用两个指针指向这个元素后面序列的首尾,如果这三个数字的和到target的距离比之前的ans到target的距离更小,就更新ans,然后移动后面两个指针:如果当前和大于target,后面的指针往前移,如果小于,前面的指针后移。时间ON^2
1 class Solution { 2 public: 3 int threeSumClosest(vector<int>& nums, int target) { 4 if(nums.size()<3) return 0; 5 sort(nums.begin(),nums.end()); 6 int ans=nums[0]+nums[1]+nums[2]; 7 for(int i=0;i<nums.size();i++){ 8 int j=i+1,k=nums.size()-1; 9 while(j<k){ 10 int sum=nums[j]+nums[k]+nums[i]; 11 if(sum==target) return target; 12 if(sum<target) j++; 13 else k--; 14 int tmp=abs(sum-target); 15 if(tmp<abs(ans-target)) ans=sum; 16 } 17 } 18 return ans; 19 } 20 };
以上是关于leetcode658+有序数组找出距离数字x最近的k个数字的主要内容,如果未能解决你的问题,请参考以下文章
(双指针二分Binary Search) leetcode 658. Find K closest Elements