leetcode(面试题53 - I)在排序数组中查找数字 I

leetcode(面试题53 - I)在排序数组中查找数字 I_第1张图片

方法一:
二分法:’
变型的二分法,找到target后,再分别向前、向后寻找临界点。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int key=BioSearch(nums, target);
        if(key==-1){
            return 0;
        }
        int count=1;
        int start=key-1;
        int end=key+1;
        while(start>=0&&nums[start--]==target){
            count++;
        }
        while(end<=(nums.size()-1)&&nums[end++]==target){
            count++;
        }
        return count;
    }
    int BioSearch(vector<int>& nums, int target){
        int left=0;
        int right=nums.size()-1 ;
        int mid=0;
        while(left<=right){
            mid=left+(right-left)/2;
            if(nums[mid]==target){
                return mid;
            }
            else if(nums[mid]>target){
                right=mid-1;
            }
            else{
                left=mid+1;
            }
        } 
        return -1;
    }
};

方法二:
运用内置函数
一:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        return upper_bound(nums.begin(), nums.end(), target) - lower_bound(nums.begin(), nums.end(), target);
    }
};

二:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int total = count(nums.begin(), nums.end(), target);
        return total;
    }
};

方法三:
map

class Solution {
public:
    int search(vector<int>& nums, int target) {
    	map<int, int> nums_record;
    	for(int i=0;i<nums.size();++i){
    		nums_record[nums[i]]++;
    	}
    	return nums_record[target];
    }
};

方法四:
暴力法:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int res = 0;
        for(int i=0; i<nums.size(); i++) {
            if(nums[i] > target) break;
            if(nums[i] == target) res++;
        }
        return res;
    }
};

你可能感兴趣的:(leetcode)