目录
1、无序数组
- 1、无序数组
- 2、有序数组
通过遍历,依次求出每个元素值和目标值的差,比较更新。 时间复杂度:o(n)
源数据
const arr = [1, 3, 5, 6, 10];
方法一
function getClosestNumber(array, target) { let result = array[0]; for (let i = 0; i < array.length; i++) if (Math.abs(array[i] - target) < Math.abs(result - target)) result = array[i]; return result; } console.log(getClosestNumber(arr, 7)); // 6 console.log(getClosestNumber(arr, 3)); // 3
方法二
function getClosestNumber(array, target) { return array.reduce((pre, cur) => Math.abs(pre - target) < Math.abs(cur - target) ? pre : cur); } console.log(getClosestNumber(arr, 7)); // 6 console.log(getClosestNumber(arr, 3)); // 32、有序数组
二分查找法 1、取left和right两个索引,每次取出中间索引位mid的值与目标值 如果中间位的值大于目标值,则想要寻找的值在左侧 如果中间位的值小于目标值,则想要寻找的值在右侧 2、动态更新left和right,直到指针停留在相邻的两个数 3、进行最好一次计算,得到与目标值最近的数 时间复杂度:o(log(n))
const arr = [1, 3, 5, 8, 10, 11, 14, 16, 18]; function getClosestNumber(array, target) { let left = 0, right = array.length - 1, mid; while (right - left > 1) { mid = Math.floor((left + right) / 2); if (array[mid] < target) { left = mid; } else { right = mid; } } return Math.abs(array[left] - target) > Math.abs(array[right] - target) ? array[right] : array[left]; } console.log(getClosestNumber(arr, 13)); // 14 console.log(getClosestNumber(arr, 0)); // 1