• LeetCode 15. 三数之和


    题意

    定义一个三元组为(a+b+c = 0),从包含(n)个整数的数组中,找出所有满足条件的不重复三元组。

    思路

    • 想法1:暴力,(O(n^3))

    • 想法2:用“桶”记录下每个数值出现的次数,遍历前两个数,判断第三个数是否存在。时间复杂度:(O(n^2)),空间复杂度:(O(n))

    • 想法3:排序 + 双指针。排序后从小到大遍历数组,具体判断情况如下:

      1. nums[i] > 0,后面不可能有三个数之和为0,结束循环。
      2. 重复元素跳过,避免重复解。
      3. 令左指针L = i + 1,右指针R = n - 1,当(L lt R)时,执行如下循环:
        • nums[i] + nums[L] + nums[R] ==0,判断边界位置是否和下一位置重复,若重复则去重。记录答案,将(L、R)移到下一位置。
        • 三数之和大于0,R左移。
        • 三数之和小于0,L右移。

      时间复杂度:(O(n^2)),空间复杂度:(O(n))

    代码

    class Solution {
    public:
        vector<vector<int>> threeSum(vector<int>& nums) {
    
            int len = nums.size();
            if(len < 3) return {};
    
            sort(nums.begin(), nums.end());
            vector<vector<int>> res;
            int L, R;
            for(int i = 0; i < len; ++i)
            {
                if(nums[i] > 0) break;
                if(i && nums[i] == nums[i - 1]) continue;
                L = i + 1;
                R = len - 1;
                while(L < R)
                {
                    if(nums[i] + nums[L] + nums[R] == 0)
                    {
                        res.push_back({nums[i], nums[L],nums[R]});
                        while(L + 1 < len && nums[L + 1] == nums[L])   ++L;
                        while(R - 1 > 0 && nums[R - 1] == nums[R])   --R;
                        ++L; --R;
                    }
                    else if(nums[i] + nums[L] + nums[R] > 0)
                        --R;
                    else
                        ++L;
    //                cout << L << ' ' << R << endl;
                }
            }
            return res;
        }
    };
    

    总结

    这种找数字的很多都涉及到了排序,利用有序可以加快查找速度。

  • 相关阅读:
    Java bytesToHexString 解析
    Redis 启动警告错误解决
    Jackson
    HttpClient和HttpURLConnection的区别
    (HttpURLConnection)强制转化
    由sqlite在手机上的存储位置,引发的onCreate在哪里执行的小结
    Android数据存储五种方式总结
    Android 操作SQLite基本用法
    Android中SQLite应用详解
    android基础
  • 原文地址:https://www.cnblogs.com/songjy11611/p/12330705.html
Copyright © 2020-2023  润新知