https://leetcode-cn.com/problems/3sum/

1. 题意

image.png

2. 思路

首先暴力的做法是n的3次方,肯定过不了,那就要想如何优化,通常优化会想到二分之类的…….这题显然不是二分,那么可以想到双指针,看是否符合单调性,可以发现是适合的,那么排序后使用双指针的做法可以解决。

注意:
这里是不能有重复的,要做一些特殊的判断

3. 题解

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. class Solution {
  4. public:
  5. vector<vector<int>> threeSum(vector<int>& nums) {
  6. vector<vector<int>> vec;
  7. sort(nums.begin(),nums.end());
  8. auto func = [&](int a ,int b, int c) -> int{
  9. return a + b + c;
  10. };
  11. auto check = [&](long a ,long b, long c) -> bool{
  12. if(a==b){
  13. return false;
  14. }else if(a==c){
  15. return false;
  16. }else if(b==c){
  17. return false;
  18. }
  19. return true;
  20. };
  21. for(long i = 0 ;i < nums.size() ; i ++) {
  22. if(i&&nums[i] == nums[i-1]) continue;
  23. for(long j = i + 1 ,k = nums.size() -1 ; j < nums.size() ;j ++) {
  24. if(j > i + 1 && nums[j] == nums[j-1]) continue;
  25. while(k > j && func(nums[i] ,nums[j],nums[k]) > 0) {
  26. k --;
  27. }
  28. if(check(i,j,k)&&func(nums[i] ,nums[j],nums[k]) == 0 ) {
  29. vec.push_back({nums[i],nums[j],nums[k]});
  30. }
  31. }
  32. }
  33. return vec;
  34. }
  35. };
  36. int main()
  37. {
  38. Solution solution;
  39. vector<int>vec{-0,0,0,0};
  40. solution.threeSum(vec);
  41. return 0;
  42. }