658.找到K个最接近的元素
class Solution {
public:
vector<int> findClosestElements(vector<int>& arr, int k, int x) {
int left=0,right=arr.size()-1;
vector<int>ans(k);
while(right-left+1>k){ //使right和left之间元素大于要的K个元素,+1确保边界元素
if(abs(arr[left]-x)>abs(arr[right]-x)) left++;
else right--;
}
for(int i=0;i<k;i++){
ans[i]=arr[left];
left++;
}
return ans;
}
};
1471.数组中的 k 个最强值
class Solution {
public:
vector<int> getStrongest(vector<int>& arr, int k) {
int n=arr.size();
ranges::sort(arr); //排序+双指针
int m=arr[(n-1)/2],left=0,right=n-1;
vector<int>ans(k);
for(int i=0;i<k;i++){
if(abs(arr[left]-m)>abs(arr[right]-m)){
ans[i]=arr[left];
left++;
}
else{
ans[i]=arr[right];
right--;
}
}
return ans;
}
};
167.两数之和Ⅱ -输入有序数组
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int n=numbers.size();
int left=0,right=n-1;
while(left<right){
int sum=numbers[left]+numbers[right];
if(sum>target) right--;
if(sum<target) left++;
if(sum==target) break;
}
return{left+1,right+1};
}
};
2824.统计和小于目标的下标对数目
class Solution {
public:
int countPairs(vector<int>& nums, int target) {
int n=nums.size();
int ans=0;
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
if(nums[i]+nums[j]<target) ans++;
}
}
return ans;
}
};
除了暴力外,还可采用排序+双指针的方法:
请你返回满足 0 <= i < j < n
且 nums[i] + nums[j] < target
的下标对 (i, j)
的数目-- > i ,j 对称可交换,两者总有一个小的,则 i ,j 不等即可
LCP 28.采购方案
class Solution {
public:
int purchasePlans(vector<int>& nums, int target) {
long long ans=0;
long long mod=1e9+7;
ranges::sort(nums);
for(int i=0,j=nums.size()-1;i<j;i++){
while(i<j && nums[i]+nums[j]>target) j--;
ans+=j-i;
}
return ans%mod;
}
};
注意:答案需要以 1e9 + 7 (1000000007)
为底取模,如:计算初始结果为:1000000008
,请返回 1
long long ans=0;
long long mod=1e9+7;
return ans%mod;