leetcode 1679

1.排序双指针

先排序

sort(nums.begin(),nums.end());

在双指针查找

while(left<right){
  if(nums[left]+nums[right]<k){
    left++;   
     }else if(nums[left]+nums[right]>k){
        right--;
    }else{
        left++;
        right--;
        count++;
}
}

2.哈希表

记录vector值出现的次数

unordered_map<int ,int >freq;//记录vector值出现的次数
for(int num:nums){
  ++freq[num];      
}

值刚好为目标值一半的做特殊处理

for(auto [key,value]:freq){
  if(key*2==k){
     ans+=value/2;//向下取整     
  }else if(key*2<k]&&freq.count(k-key)){//也可以计算key*2>k,目的是避免重复计算
      ans+=min(value,freq[k-key);          
   }      
}    

 

posted @ 2023-05-09 17:00  iu本u  阅读(17)  评论(0)    收藏  举报