本文共 1488 字,大约阅读时间需要 4 分钟。
最近,我在一次面试中遇到了一个技术题目,要求实现二分查找算法。面试官微笑着说:“小伙子,你的逻辑思维很好,我们等你回来等消息吧!”从那以后,我便开始思考如何实现这一算法。
二分查找是一种高效的查找算法,常用于有序数组中查找特定元素的位置。假设我们有一个有序的整型数组,比如[1,2,3,4,5,6,7,8],需要查找5的位置。我们可以通过以下步骤来实现:
二分查找的实现方式有两种,分别是左闭右闭和左闭右开。两种实现方式的主要区别在于数组边界的选择和循环条件。
左闭右闭实现代码如下:
private static int binarySearch(int target, int[] arry) { int left = 0, right = arry.length - 1; while (left <= right) { int mid = (left + right) >> 1; if (arry[mid] == target) { return mid; } else if (arry[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1;}
左闭右开实现代码如下:
private static int binarySearch(int target, int[] arry) { int left = 0; int right = arry.length; while (left < right) { int middle = (left + right) >> 1; if (arry[middle] > target) { right = middle; } else if (arry[middle] < target) { left = middle + 1; } else { return middle; } } return -1;}
两种实现方式的主要区别在于数组的边界选择和循环条件。左闭右闭使用数组长度减一作为右边界,而左闭右开使用数组长度作为右边界。此外,循环条件也需要相应调整。
为了验证二分查找的正确性,我们可以使用以下测试用例:
示例一: 输入:nums = [-1,0,3,5,9,12], target = 9 输出:4 解释:9位于数组中,下标为4。
示例二: 输入:nums = [-1,0,3,5,9,12], target = 2 输出:-1 解释:2不存在于数组中。
二分查找的关键在于掌握循环条件和区间赋值的技巧。两者必须保持一致,确保算法的正确性。如果循环条件和区间赋值不统一,可能会导致逻辑错误。通过以上实现和测试示例,你可以更好地理解二分查找的工作原理,并在实际开发中灵活运用。
转载地址:http://zveaz.baihongyu.com/