📅  最后修改于: 2023-12-03 15:10:45.895000             🧑  作者: Mango
在编写算法时,我们常常需要查找数组中每个元素的左侧最近邻值,即数组中元素左侧存在的最接近的值。本文将介绍两种不同的算法来查找此类值。
暴力算法的基本思想是对于每个元素,从其左侧开始遍历数组,查找第一个小于该元素的值,如果找到则返回该值,否则返回null。代码如下:
public static Integer findLeftNearest(int[] arr, int idx) {
int target = arr[idx];
for (int i = idx - 1; i >= 0; i--) {
if (arr[i] < target) {
return arr[i];
}
}
return null;
}
该算法的时间复杂度为O(n^2),因为对于数组中每个元素,我们都需要遍历其左侧元素。如果数组中有大量元素,则对于每个元素的查找时间将会变得非常长。
由于暴力算法的时间复杂度较高,我们可以使用二分查找来优化算法。基本思想是对于每个元素,在它的左侧使用二分查找来查找第一个小于该元素的值,如果找到,则返回该值,否则返回null。代码如下:
public static Integer findLeftNearest2(int[] arr, int idx) {
int target = arr[idx];
int l = 0, r = idx - 1;
int ans = -1;
while (l <= r) {
int m = (l + r) / 2;
if (arr[m] < target) {
ans = arr[m];
l = m + 1;
} else {
r = m - 1;
}
}
return ans;
}
该算法的时间复杂度为O(nlogn),因为二分查找的时间复杂度为O(logn),对于数组中的每个元素,我们都使用一次二分查找,因此算法的总时间复杂度为O(nlogn)。
本文介绍了两种算法来查找每个数组元素左侧存在的最接近的值。尽管暴力算法的时间复杂度较高,但在某些情况下可能是最好的选择,因为它具有较低的空间复杂度。如果空间复杂度不是问题,我们建议使用二分查找来优化算法。