剑指 Offer II 007. 数组中和为 0 的三个数
一层循环下双指针,需要加判重的while循环
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>>ans;
int n=nums.size();
sort(nums.begin(),nums.end());
for(int i=0;i<n-2;i++){
int c=-nums[i];
int l=i+1;
int r=n-1;
if(i>0&&nums[i]==nums[i-1]) continue;
while(l<r){
if(nums[l]+nums[r]>c){
r--;
}
else if(nums[l]+nums[r]<c){
l++;
}
else{
ans.push_back({nums[i],nums[l],nums[r]});
while(l<r&&nums[l]==nums[l+1]) l++;
while(l<r&&nums[r]==nums[r-1]) r--;
l++;
r--;
}
}
}
return ans;
}
};
剑指 Offer II 008. 和大于等于 target 的最短子数组
双指针循环求解
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int minlen=INT_MAX;
int n=nums.size();
if(nums[0]>=target) return 1;
int i=0;
int j=1;
int sum=nums[i];
while(j<n&&i<=j){
sum+=nums[j];
if(sum<target){
j++;
}
else if(sum>=target){
minlen=min(minlen,j-i+1);
sum-=nums[i];
i++;
sum-=nums[j];
}
}
if(minlen==INT_MAX) return 0;
return minlen;
}
};
剑指 Offer II 009. 乘积小于 K 的子数组
双指针计算
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
int l=0;
int r=0;
int p=1;
int ans=0;
int n=nums.size();
for(;r<n;r++){
p*=nums[r];
while(l<=r&&p>=k){
p/=nums[l];
l++;
}
ans+=l<=r?r-l+1:0;
}
return ans;
}
};