常用算法(一)二分查找
1. 二分查找(非递归,始终返回第一次出现的位置,参考了<<编程珠玑 第 2 版>>)
public int binSearch(int[] nums, int target) { int l = -1, u = nums.length; while(l + 1 != u){ int m = l + (u - l) / 2; // 防止溢出 if(nums[m] < target){ l = m; }else{ u = m; } } int res = u; if(res >= nums.length || nums[res] != target){ res = -1; } return res; }
扩展:
1.1 LeetCode 35. Search Insert Position
有序数组查找,如果没有找到,返回应该插入的位置(也就是直接返回 1 里面的 u)。
1.2 LeetCode 34. Find First and Last Position of Element in Sorted Array
有序数组查找,返回出现的第一个和最后一个位置。
1.3 剑指 Offer 53
- 题目一:数字在排序数组中出现的次数。得到第一个和最后一个位置(即 1.2),last - first + 1 即可。
- 题目二:0 ~ n - 1 中缺失的数字。使用二分查找的思想(剑指 Offer 思路)。
- LeetCode 268. Missing Number 的数组未排序,排序之后,也可以用题目二的思路。
- 题目三:数组中数值和下标相等的元素。
2. 二分查找(递归)
int binSearch_recur(int[] arr, int l, int u, int target) { if (target < arr[l] || target > arr[u] || l > u) { return -1; } int m = l + (u - l) / 2; if (arr[m] > target) { return binSearch_recur(arr, l, m - 1, target); } else if (arr[m] < target) { return binSearch_recur(arr, m + 1, u, target); } else { return m; } }