剑指 Offer 53 - I. 在排序数组中查找数字 I
题目链接:
【方法一】直接查找==target的num,统计次数
class Solution { int[] nums; int ans; int target; public void binary(int left, int right) { if(left <= right){ int mid = (left + right) / 2; if(nums[mid] < target){ binary(mid + 1, right); }else if(nums[mid] > target){ binary(left, mid - 1); }else{ ans ++; binary(mid + 1, right); binary(left, mid - 1); } } } public int search(int[] nums, int target) { this.nums = nums; this.target = target; binary(0, nums.length - 1); return ans; } }
【方法二】查找大于target的最小值下标和小于target的最大值下标,二者相减。这样就需要实现c++里的lower_bound和upper_bound。
class Solution { int[] nums; int target; public int lower_bound(int left, int right){ int mid; while(left <= right){ mid = (left + right) / 2; if(nums[mid] >= target) right = mid - 1; else left = mid + 1; } return right; } public int upper_bound(int left, int right){ int mid; while(left <= right){ mid = (left + right) / 2; if(nums[mid] <= target) left = mid + 1; else right = mid - 1; } return left; } public int search(int[] nums, int target) { this.nums = nums; this.target = target; return upper_bound(0, nums.length - 1) - lower_bound(0, nums.length - 1) - 1; } }
lower_bound实现的小细节就是当target<=nums[mid]的时候继续向左找,right = mid -1,最后返回right
上一篇:
IDEA上Java项目控制台中文乱码