剑指Offer 53 -I.在排序数组中查找数字I
题目描述
解法一
思路:遍历数组查找是否有相同数字,相同则count++
class Solution { public: int search(vector<int>& nums, int target) { int count = 0; for(int i = 0; i < nums.size(); i++){ if(nums[i] == target){ count++; } } return count; } };
解法二
思路:二分法,由于数组已经排序,因此整个数组是单调递增的,我们可以利用二分法来加速查找的过程。
找到数组中第一个等于target的位置(left) 和第一个大于target的位置-1 (right),target在数组中出现的次数为 right-left+1
class Solution { public: int search(vector<int>& nums, int target) {int left = 0, right = nums.size() -1; while (left <= right) { int mid = (right + left) / 2; if (nums[mid] < target) { left = mid + 1; } else if (nums[mid] > target) { right = mid -1; } else { if (nums[right] != target) { right--; } else if (nums[left] != target) { left++; } else { break; } } } return right - left + 1; } };