• LeetCode 每日一题 15. 三数之和


    题目描述

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

    注意:答案中不可以包含重复的三元组。

    示例:

    给定数组 nums = [-1, 0, 1, 2, -1, -4],
    
    满足要求的三元组集合为:
    [
      [-1, 0, 1],
      [-1, -1, 2]
    ]
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/3sum
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题解

    枚举第一个元素,双指针查找第二、第三个元素,总体复杂度 (O(N^2))

    #pragma G++ optimize("O2")
    
    class Solution {
     public:
      vector<vector<int>> threeSum(vector<int>& nums) {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        vector<vector<int>> ans;
        // 枚举 a
        for (int first = 0, third, second; first < n-1; ++first) {
          // 需要和上一次枚举的数不相同
          if (first > 0 && nums[first] == nums[first - 1]) {
            continue;
          }
          // c 对应的指针初始指向数组的最右端
          third = upper_bound(nums.begin() + first, nums.end(), -nums[first] - nums[first + 1]) - nums.begin();
          third = min(n - 1, third);
          // 枚举 b
          for (second = first + 1; second < n; ++second) {
            // 需要和上一次枚举的数不相同
            if (second > first + 1 && nums[second] == nums[second - 1]) {
              continue;
            }
            // 需要保证 b 的指针在 c 的指针的左侧
            int target = -nums[first] - nums[second];
            while (second < third &&  nums[third] > target) {
              --third;
            }
            // 如果指针重合,随着 b 后续的增加
            // 就不会有满足 a+b+c=0 并且 b<c 的 c 了,可以退出循环
            if (second == third) {
              break;
            }
            if (-target + nums[third] == 0) {
              ans.push_back({nums[first], nums[second], nums[third]});
            }
          }
        }
        return ans;
      }
    };
    
    
  • 相关阅读:
    OK335xS 网络连接打印信息 hacking
    OK335xS mac address hacking
    buildroot linux filesystem 初探
    busybox filesystem matrix-gui-2.0 undefined function json_encode()
    RPi 2B Documentation
    RPi 2B Raspbian SD卡内部架构
    Error building results for action sayHello in namespace /inteceptor
    linux 失败无连接 检查电缆吗
    Struts2
    struts2加入自定义的actionValidatorManager实现类
  • 原文地址:https://www.cnblogs.com/Forgenvueory/p/13098695.html
Copyright © 2020-2023  润新知