二分查找例题
题单来自:分享丨【算法题单】二分算法(二分答案/最小化最大值/最大化最小值/第K小) - 讨论 - 力扣(LeetCode)
1.题目1:在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)
代码:
class Solution {
public:
int find_value(vector<int>&nums,int target){int left=0;int right=nums.size()-1;while(left<=right){int mid=left+(right-left)/2;if(nums[mid]>=target){right=mid-1;}else{left=mid+1;}}return left;
}vector<int> searchRange(vector<int>& nums, int target) {int start=find_value(nums,target);if(start==nums.size()||nums[start]!=target)return {-1,-1};
//start==nums.size()说明数组里面所有的数都小于target
//nums[start]!=target说明存在元素大于等于target,但这个数不一定就是targetint end=find_value(nums,target+1)-1;return {start,end};}
};
2.题目2:搜索插入位置
35. 搜索插入位置 - 力扣(LeetCode)
代码:
class Solution {
public:
int find_value(vector<int>&nums,int target){int left=0;int right=nums.size()-1;while(left<=right){int mid=left+(right-left)/2;if(nums[mid]>=target){right=mid-1;}else{left=mid+1;}}return left;
}int searchInsert(vector<int>& nums, int target) {int v=find_value(nums,target);return v;}
};
3.题目3:二分查找
704. 二分查找 - 力扣(LeetCode)
代码1:
class Solution {
public:int search(vector<int>& nums, int target) {int left=0;int right=nums.size()-1;while(left<=right){int mid=left+(right-left)/2;if(nums[mid]>target){right=mid-1;}else if(nums[mid]<target){left=mid+1;}else{return mid;}}return -1;}
};
代码2:
class Solution {
public:int search(vector<int>& nums, int target) {int left=0;int right=nums.size()-1;while(left<=right){int mid=left+(right-left)/2;if(nums[mid]>=target){right=mid-1;}else{left=mid+1;}}if(left==nums.size()||nums[left]!=target)return -1;return left;}
};
4.题目4:寻找比目标字母大的最小字母
744. 寻找比目标字母大的最小字母 - 力扣(LeetCode)
代码:
class Solution {
public:char nextGreatestLetter(vector<char>& letters, char target) {int left=0;int right=letters.size()-1;target=target+1;while(left<=right){int mid=left+(right-left)/2;if(letters[mid]>=target){right=mid-1;}else{left=mid+1;}}if(left==letters.size()){return letters[0];}return letters[left];}
};
5.题目5:正整数和负整数的最大计数
2529. 正整数和负整数的最大计数 - 力扣(LeetCode)
6.题目6:咒语和药水的成功对数
2300. 咒语和药水的成功对数 - 力扣(LeetCode)
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
为 无重复元素 的 升序 排列数组-104 <= target <= 104
代码:
class Solution {
public:
int find_minvp(vector<int>&potions,int k,long long success){int left=0;int right=potions.size()-1;while(left<=right){int mid=left+(right-left)/2;if(potions[mid]>=(success+k-1)/k){right=mid-1;}else{left=mid+1;}}return left;
}vector<int> successfulPairs(vector<int>& spells, vector<int>& potions, long long success) {sort(potions.begin(),potions.end());vector<int>result;for(int i=0;i<spells.size();i++){int s=find_minvp(potions,spells[i],success);result.push_back(potions.size()-s);}return result;}
};